Erlang Edoc в Emacs

Скажем, то, что я сделал, чтобы Erlang функционировал со спецификацией.

-spec foo(integer(), string()) ->
      boolean().
foo(_Integer, _String) ->
      true.

Моя мечта состояла бы в том, чтобы генерировать edoc от этой информации в Emacs автоматически. Сгенерированный код должен быть похожим:

%%--------------------------------------------------------------------
%% @doc
%% Your description goes here
%% @spec foo(_Integer::integer(), _String::string()) ->
%%%      boolean()
%% @end
%%--------------------------------------------------------------------
-spec foo(integer(), string()) ->
      boolean().
foo(_Integer, _String) ->
      true.

Подобная функция уже существует?

6
задан Vadim Kotov 14 August 2017 в 12:54
поделиться

2 ответа

Я не знаю Erlang, но это может помочь вам начать:

РЕДАКТИРОВАТЬ: Ближе, но будет работать, только если аргументы находятся в одной строке : (

РЕДАКТИРОВАТЬ: Кажется, теперь работает для аргументов в отдельных строках

(defun my-erlang-insert-edoc ()
  "Insert edoc."
  (interactive)
  (save-excursion
    (when (re-search-forward "^\\s *-spec\\s +\\([a-zA-Z0-9_]+\\)\\s *(\\(\\(.\\|\n\\)*?\\))\\s *->[ \t\n]*\\(.+?\\)\\." nil t)
      (let* ((beg (match-beginning 0))
             (funcname (match-string-no-properties 1))
             (arg-string (match-string-no-properties 2))
             (retval (match-string-no-properties 4))
             (args (split-string arg-string "[ \t\n,]" t)))
        (when (re-search-forward (concat "^\\s *" funcname "\\s *(\\(\\(.\\|\n\\)*?\\))\\s *->") nil t)
          (let ((arg-types (split-string (match-string-no-properties 1) "[ \t\n,]" t)))
            (goto-char beg)
            (insert "%%-----------------------------------------------------------------------------\n")
            (insert "%% @doc\n")
            (insert "%% Your description goes here\n")
            (insert "%% @spec " funcname "(")
            (dolist (arg args)
              (insert (car arg-types) "::" arg)
              (setq arg-types (cdr arg-types))
              (when arg-types
                (insert ", ")))
            (insert ") ->\n")
            (insert "%%       " retval "\n")
            (insert "%% @end\n")
            (insert "%%-----------------------------------------------------------------------------\n")))))))
5
ответ дан 17 December 2019 в 02:26
поделиться

Пакет CEDET уже довольно давно поддерживает Erlang на некотором уровне. В более старых версиях CEDET, таких как 1.0pre3 или около того, также была поддержка edoc для автоматического создания комментариев, подобных тем, которые вы обсуждали выше. Система генерации комментариев недавно изменилась, так что поддержки больше нет, поэтому было бы здорово, если бы кто-то захотел добавить шаблоны для новой системы генерации комментариев, которая работает через подпакет CEDET SRecode. Знание Emacs Lisp не требуется.

http://cedet.sourceforge.net/

http://cedet.sourceforge.net/codegen.shtml

1
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: