Emacs中的Erlang Edoc

6

假设我有一个带有规范的 Erlang 函数。

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

是否已经存在类似的功能?
2个回答

5
我不了解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")))))))

+1。非常感谢您的帮助。除了 Integer::integer() 部分之外,对于一些示例函数来说都运作良好 :) - Roberto Aloi
现在已经接近了一点,但是如果你将参数放在不同的行上,你将不得不以不同的方式解析它们。Erlang-mode是否有任何解析工具可以利用? - scottfrazer

1
CEDET套件在相当长的一段时间内已经支持Erlang。旧版本的CEDET,例如1.0pre3或者类似的版本也支持edoc,可以自动生成与上述讨论类似的注释。最近,注释生成系统发生了变化,因此不再支持该功能,如果有人想要为通过CEDET子包SRecode工作的新注释生成系统提供模板,那将是非常好的。无需了解Emacs Lisp。

http://cedet.sourceforge.net/

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接