2010-04-01 50 views
6

假設我有一個Erlang函數,Emacs中的Erlang Edoc

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

我的夢想是在Emacs中自動生成edoc。 生成的代碼應該是這樣的:

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

是否有類似的功能已經存在?

回答

5

我不知道二郎,但這可能讓你開始:

編輯:更緊密的,但如果ARG遊戲在同一行只會工作:(

編輯:似乎爲ARGS工作在單獨的行現在

(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()部分,對於一些示例函數來說工作正常:) – 2010-04-01 15:09:49

+0

現在有點接近了,但是如果將args放在單獨的行中,則必須以不同的方式解析它們。 erlang模式是否有可以利用的解析? – scottfrazer 2010-04-01 15:16:23

+0

似乎現在適用於獨立線路上的參數。 – scottfrazer 2010-04-01 15:31:25

1

的CEDET套件已經在一定程度上相當長的一段支持二郎。舊版本CEDET,如1.0pre3或自動生成類似於你討論的那些評論其周圍也有EDOC支持以上。評論生成系統cha因此支持不再存在,所以如果有人想要通過CEDET子包SRecode工作的新評論生成系統的模板,那就太棒了。不需要Emacs Lisp知識。

http://cedet.sourceforge.net/

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