2010-04-01 20 views
6

Digamos que tengo una función de Erlang, con especificación.Erlang Edoc en Emacs

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

Mi sueño sería generar el edoc de esta información dentro de Emacs automáticamente. El código generado debe verse como:

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

existe ya una característica similar?

Respuesta

5

No sé Erlang, pero esto podría empezar:

EDIT: Más cerca, pero sólo funcionará si args están en la misma línea :(

EDIT: parece funcionar para args en líneas separadas ahora

(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. Muchas gracias por esto. Además de la parte Integer :: integer() está funcionando bien para un par de funciones de muestra :) –

+0

Ahora está un poco más cerca, pero si coloca argumentos en líneas separadas, tendrá que analizarlos de manera diferente. ¿Tiene erlang-mode algún análisis que pueda aprovechar? – scottfrazer

+0

Parece que ahora trabaja para args en líneas separadas. – scottfrazer

1

La suite CEDET ha apoyado Erlang en algún nivel durante bastante tiempo. las versiones anteriores de CEDET, como 1.0pre3 o alrededor del mismo también tuvo el apoyo edoc para la generación automática de comentarios similares a los que se discuten arriba. El sistema de generación de comentarios cha Recientemente, para que la asistencia técnica ya no exista, sería fantástico que alguien quisiera lanzar en plantillas para el nuevo sistema de generación de comentarios que funciona a través del subpaquete CEDET SRecode. No se requiere conocimiento de Emacs Lisp.

http://cedet.sourceforge.net/

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