2010-04-01 9 views
6

Disons que j'ai une fonction Erlang, avec spec. Mon rêve serait de générer l'edoc à partir de cette information automatiquement dans Emacs. Le code généré doit ressembler à:Erlang Edoc dans Emacs

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

Est-ce une fonctionnalité similaire existe déjà?

Répondre

5

Je ne sais pas Erlang, mais cela pourrait vous aider à démarrer:

EDIT: Closer, mais ne fonctionnera que si args sont sur la même ligne :(

EDIT: Semble travailler pour args sur des lignes distinctes maintenant

(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. Merci beaucoup pour cela. En dehors de la partie Integer :: integer() fonctionne bien pour quelques exemples de fonctions :) –

+0

C'est un peu plus près maintenant, mais si vous mettez des args sur des lignes séparées, vous devrez les analyser différemment. Est-ce que erlang-mode a une analyse dont vous pourriez profiter? – scottfrazer

+0

Semble fonctionner pour args sur des lignes séparées maintenant. – scottfrazer

1

La suite CEDET a soutenu Erlang à un certain niveau pendant un certain temps. les versions plus anciennes de CEDET, comme 1.0pre3 ou enuiron avait également un soutien edoc pour générer automatiquement des commentaires similaires à ceux que vous discutez Le système de génération de commentaires cha nged récemment, de sorte que le support n'est plus là, donc ce serait génial de quelqu'un qui voulait lancer des modèles pour le nouveau système de génération de commentaires qui fonctionne à travers le sous-paquet SRECode de CEDET. Aucune connaissance d'Emacs Lisp requise.

http://cedet.sourceforge.net/

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