2010-04-01 11 views
6

Giả sử tôi có hàm Erlang, với thông số kỹ thuật.Erlang Edoc in Emacs

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

Ước mơ của tôi là tự động tạo thông tin này trong Emacs. Mã được tạo sẽ trông giống như:

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

Tính năng tương tự đã tồn tại chưa?

Trả lời

5

Tôi không biết Erlang, nhưng điều này có thể giúp bạn bắt đầu:

EDIT: Closer, nhưng sẽ chỉ làm việc nếu args là trên cùng một dòng :(

EDIT: Có vẻ để làm việc cho args trên dòng riêng biệt tại

(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. Cảm ơn bạn rất nhiều cho việc này. Ngoài phần Integer :: integer() đang hoạt động tốt cho một vài hàm mẫu :) –

+0

Bây giờ nó gần hơn một chút, nhưng nếu bạn đặt arg trên các dòng riêng biệt, bạn sẽ phải phân tích chúng theo cách khác nhau. Chế độ erlang có phân tích cú pháp nào bạn có thể tận dụng? – scottfrazer

+0

Dường như làm việc cho args trên các dòng riêng biệt. – scottfrazer

1

các bộ Cedet đã hỗ trợ Erlang ở một mức độ cho khá trong một. các phiên bản cũ của Cedet, chẳng hạn như 1.0pre3 hoặc nại cũng được sự ủng hộ edoc để tự động tạo ra ý kiến ​​tương tự như những người bạn thảo luận trên hệ thống thế hệ bình luận Gần đây, để hỗ trợ không còn ở đó, vì vậy nó sẽ là tuyệt vời của một ai đó muốn pitch trong các mẫu cho hệ thống tạo chú thích mới hoạt động thông qua gói con SREode của CEDET. Không có kiến ​​thức về Emacs Lisp.

http://cedet.sourceforge.net/

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