2010-04-01 2 views
6

Предположим, что у меня есть функция Erlang со спецификацией.Erlang Edoc в Emacs

-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. 

ли уже существует аналогичная функция?

ответ

5

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

EDIT: Ближе, но будет работать только тогда, когда арг находятся на одной и той же линии :(

EDIT: Кажется, работать на аргументах на отдельных линиях в настоящее время

(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"))))))) 
+0

+1. Большое вам спасибо за это. Помимо целой части Integer :: integer() работает отлично для нескольких выборочных функций :) –

+0

Теперь это немного ближе, но если вы ставите args на отдельные строки, вам придется разбирать их по-разному. Есть ли у erlang-mode какой-либо синтаксический анализ, который вы могли бы использовать? – scottfrazer

+0

Кажется, теперь мы работаем для args на отдельных строках. – scottfrazer

1

люкс Cedet поддерживает Erlang на каком-то уровне довольно долгое время. Старые версии Cedet, такие как 1.0pre3 или около этого также имели поддержку EDOC для автоматической генерации комментариев, похожие на те, которые вы обсудить выше. Система генерации комментариев cha в последнее время, так что поддержки больше нет, поэтому было бы здорово, если бы кто-то захотел передать в шаблонах новую систему генерации комментариев, которая работает через SRCode поддерева CEDET. Никаких знаний о Emacs Lisp не требуется.

http://cedet.sourceforge.net/

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

Смежные вопросы