Простой способ перейти к определению функции (Emacs, Ocaml) - PullRequest
9 голосов
/ 14 ноября 2011

Я кодирую Ocaml под Emacs ...

Я хотел бы знать, есть ли ярлык для перехода к определению функции (где находится курсор).На данный момент, чтобы сделать это, я должен искать имя функции во всем файле или искать let the_name_of_the_function и let rec the_name_of_the_function и and the_name_of_the_function, что очевидно утомительно ...

ПоКстати, у меня уже есть файл .annot.

Может кто-нибудь помочь?Спасибо!

Ответы [ 4 ]

5 голосов
/ 14 ноября 2011

My ctags(1) (из пакета exuberant-ctags) поддерживает язык OCaml, а Emacs поддерживает ctags, когда он выполняется как etags.

Поэтому попробуйте: cd /path/to/Ocaml/sources/ && etags -R . создать индекс, а затем в emacs, M - . ret , чтобы найти тег под курсор.

3 голосов
/ 14 ноября 2011

Пока вы ждете лучшего решения (из которых есть, например, OCamlSpotter ), вы можете использовать команды бедняков, перечисленные ниже. Предполагается режим туарегов.

(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)
2 голосов
/ 21 сентября 2015

Проблема может быть решена с помощью merlin (https://github.com/the-lambda-church/merlin). Merlin можно легко установить с помощью opam:

opam install merlin

Следуйте инструкциям, предоставленным opam, для настройки файла ~ / .emacs. Для завершенияконфигурацию, которую вам нужно будет предоставить .merlin-файл, который сообщает merlin, где находятся исходные файлы и файлы сборки и какие пакеты используются в проекте. Краткий обзор файла .merlin приведен в https://github.com/the-lambda-church/merlin/wiki/emacs-from-scratch#configuring-your-project

Теперь, чтобы перейти к определению функции в Emacs:

C-c C-l

Чтобы вернуться к вызову функции:

C-c &
0 голосов
/ 01 августа 2014

Вы можете попробовать otags, расположенный здесь: http://askra.de/software/otags/

На странице проекта:

Otags генерирует файлы TAGS, подходящие для emacs и vi / vim, из источников OCaml.Otags использует camlp4 для анализа.

Чтобы использовать его, попробуйте что-то вроде:

otags -r src/

, где src - это подкаталог, содержащий ваши исходные файлы OCaml.Следует создать файл TAGS.Тогда вы сможете сделать M-. в Emacs.

Вы можете установить otags с opam.

...