emacserlangcode-templates

Erlang Edoc in Emacs


Let's say that I have an Erlang function, with spec.

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

My dream would be to generate the edoc from this information within Emacs automatically. The generated code should look like:

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

Does a similar feature already exist?


Solution

  • I don't know Erlang, but this might get you started:

    EDIT: Closer, but will only work if args are on the same line :(

    EDIT: Seems to work for args on separate lines now

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