2010-04-01 16 views
6

Sagen wir, dass ich eine Erlang-Funktion habe, mit spec.Erlang Edoc in Emacs

Mein Traum wäre, das Edoc aus diesen Informationen innerhalb von Emacs automatisch zu generieren. Der generierte Code sollte wie folgt aussehen:

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

Gibt es eine ähnliche Funktion gibt es bereits?

Antwort

5

Ich weiß nicht, Erlang, aber dies könnte Ihnen den Einstieg:

EDIT: Näher, wird aber nur funktionieren, wenn args auf der gleichen Linie sind :(

EDIT: Es scheint für args zu arbeiten jetzt in separaten Zeilen

(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. Vielen Dank dafür. Abgesehen von dem Integer :: integer() Teil funktioniert es gut für ein paar Beispielfunktionen :) –

+0

Es ist jetzt ein wenig näher, aber wenn Sie Argumente auf separaten Zeilen setzen, müssen Sie sie anders analysieren. Hat erlang-mode irgendwelche Parsing-Funktionen, die Sie nutzen könnten? – scottfrazer

+0

Scheint jetzt für Args in separaten Zeilen zu arbeiten. – scottfrazer

1

Die cedet Suite hat schon eine ganze Weile auf einer gewissen Ebene Erlang unterstützt. Ältere Versionen von cedet, wie 1.0pre3 oder darum herum hatte auch edoc Unterstützung für automatisch Kommentare ähnlich denen, die Erzeugung von Ihnen besprechen Das Kommentargenerierungssystem cha In letzter Zeit wurde der Support nicht mehr unterstützt, daher wäre es toll, wenn jemand Vorlagen für das neue System zur Generierung von Kommentaren bereitstellen möchte, das über das CEDET-Subpaket SRecode funktioniert. Keine Kenntnisse von Emacs Lisp erforderlich.

http://cedet.sourceforge.net/

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