Эрланг Эдок в Emacs - PullRequest
       16

Эрланг Эдок в Emacs

6 голосов
/ 01 апреля 2010

Допустим, у меня есть функция 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 ]

5 голосов
/ 01 апреля 2010

Я не знаю Эрланга, но это может помочь вам начать:

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

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

(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")))))))
1 голос
/ 02 апреля 2010

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

http://cedet.sourceforge.net/

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

...