Эрланг Эдок в 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.
Подобная функция уже существует?
2 ответа
Я не знаю Эрланга, но это может помочь вам начать:
РЕДАКТИРОВАТЬ: ближе, но будет работать, только если аргументы находятся на одной строке:(
РЕДАКТИРОВАТЬ: Кажется, теперь работает для аргументов в отдельных строках
(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")))))))
Пакет CEDET уже давно поддерживает Erlang. Более старые версии CEDET, такие как 1.0pre3 или около того, также имели поддержку edoc для автоматического создания комментариев, аналогичных тем, которые вы обсуждали выше. Система генерации комментариев недавно изменилась, так что поддержки больше нет, поэтому было бы здорово, если бы кто-то захотел добавить шаблоны для новой системы генерации комментариев, которая работает через подпакет CEDET SRecode. Не требуется знание Emacs Lisp.