2011-11-14 29 views
8

Tôi đang mã hóa Ocaml dưới Emacs ...Cách dễ dàng để đi đến định nghĩa của một hàm (Emacs, Ocaml)

Tôi muốn biết nếu có một phím tắt để chuyển đến định nghĩa của hàm (con trỏ ở đâu). Tại thời điểm này, làm như vậy tôi phải tìm kiếm tên của các chức năng trong toàn bộ tập tin, hoặc tìm kiếm let the_name_of_the_functionlet rec the_name_of_the_functionand the_name_of_the_function mà rõ ràng là tẻ nhạt ...

Bằng cách này, tôi có alreay file .annot .

Có ai giúp được không? Cảm ơn bạn!

Trả lời

4

My ctags(1) (từ gói exuberant-ctags) hỗ trợ các ngôn ngữ OCaml và Emacs hỗ trợ ctags khi nó được thực hiện như etags.

Vì vậy, hãy thử: cd /path/to/Ocaml/sources/ && etags -R . để xây dựng một chỉ số, và sau đó trong vòng emacs, M - .ret để tìm kiếm thẻ dưới con trỏ.

+0

Xin lỗi, nơi tôi nên chạy 'etags -R .'? – SoftTimur

+1

Cập nhật câu trả lời: bạn cần chạy 'etags -R .' từ thư mục nào có tất cả các nguồn của bạn. – sarnold

+0

'etags -R .' trong một thiết bị đầu cuối cung cấp' etags: skipping.: Nó không phải là một tệp thông thường.'. Tôi đã thử 'etags -R file.ml', không có tệp mới nào được tạo và' M-.' trong Emacs cung cấp cho '[no match]' .... – SoftTimur

3

Trong khi chờ đợi một giải pháp tốt hơn (trong đó có một số giải pháp, xem ví dụ OCamlSpotter), bạn có thể sử dụng lệnh người nghèo được liệt kê bên dưới. Giả sử chế độ tuareg.

(defun camldev-identifier-at-point() 
    (interactive) 
    (save-excursion 
    (goto-char (1+ (point))) 
    (let* ((beg (re-search-backward "[^A-Za-z0-9_'][A-Za-z0-9_'`]")) 
      (beg (1+ beg))) 
     (goto-char (1+ beg)) 
     (let* ((end (re-search-forward "[^A-Za-z0-9_']")) 
      (end (1- end))) 
     (buffer-substring beg end))))) 

(defun camldev-goto-def() 
    "Search for definition of word around point." 
    (interactive) 
    (let (goal (word (camldev-identifier-at-point))) 
    (save-excursion 
     (re-search-backward (concat "\\(let \\([^=]*[^A-Za-z0-9_']\\|\\)" 
            word "\\([^A-Za-z0-9_'][^=]*\\|\\)=\\|" 
            "fun \\([^-]*[^A-Za-z0-9_']\\|\\)" 
            word "\\([^A-Za-z0-9_'][^-]*\\|\\)->\\|" 
            "and \\([^=]*[^A-Za-z0-9_']\\|\\)" 
            word "\\([^A-Za-z0-9_'][^=]*\\|\\)=\\)" 
           )) 
     (re-search-forward (concat "[^A-Za-z0-9_']" word "[^A-Za-z0-9_']")) 
     (setq goal (1+ (match-beginning 0)))) 
    (push-mark) 
    (goto-char goal) 
    )) 

(defun camldev-goto-spec() 
    "Search for specification in mli/ml file of word around point in ml/mli file." 
    (interactive) 
    (let* (goal 
     (word (camldev-identifier-at-point)) 
     (search-expr (concat "\\(val [^:\n]*" 
           word "[^:]*:\\|" 
           "let [^=\n]*" 
           word "[^=]*=\\|" 
           "type [^=\n]*" 
           word "[^=]*=\\)" 
          ))) 
    (tuareg-find-alternate-file) 
    (save-excursion 
     (goto-char (point-min)) 
     (re-search-forward search-expr) 
     (setq goal (match-beginning 0))) 
    (push-mark) 
    (goto-char goal) 
    )) 

(define-key tuareg-mode-map (kbd "C-c C-d") 'camldev-goto-def) 
(define-key tuareg-mode-map (kbd "C-c C-S-d") 'camldev-goto-spec) 
0

Bạn có thể thử otags nằm ở đây: http://askra.de/software/otags/

Từ trang dự án:

Otags tạo file TAGS thích hợp cho emacs và vi/vim từ các nguồn OCaml . Otags sử dụng camlp4 để phân tích cú pháp.

Để sử dụng nó, hãy thử một cái gì đó như:

otags -r src/ 

nơi src là thư mục con chứa các file nguồn OCaml của bạn. Nó sẽ tạo một tệp TAGS. Sau đó, bạn có thể thực hiện M-. trong Emacs.

Bạn có thể cài đặt otags với opam.

2

Sự cố có thể được giải quyết bằng merlin (https://github.com/the-lambda-church/merlin). Merlin có thể được cài đặt dễ dàng với opam:

opam install merlin 

Làm theo hướng dẫn được cung cấp bởi opam để định cấu hình ~/.emacs. Để hoàn tất cấu hình, bạn sẽ phải cung cấp tệp .merlin cho merlin biết nơi tệp nguồn và tệp xây dựng được định vị và gói nào được sử dụng trong dự án. Tổng quan ngắn gọn về.tập tin merlin được đưa ra trong https://github.com/the-lambda-church/merlin/wiki/emacs-from-scratch#configuring-your-project

Bây giờ, để chuyển đến định nghĩa hàm trong Emacs:

C-c C-l 

Để di chuyển trở lại các cuộc gọi chức năng:

C-c & 
Các vấn đề liên quan