我在Emacs下编码Ocaml ......
我想知道是否有跳转到函数定义的快捷方式(光标所在的位置)。目前,为此我必须在整个文件中搜索该函数的名称,或者查找let the_name_of_the_function
和let rec the_name_of_the_function
以及and the_name_of_the_function
,这显然是单调乏味的......
顺便说一下,我有文件.annot
。
有人可以帮忙吗?谢谢!
答案 0 :(得分:5)
我的ctags(1)
(来自exuberant-ctags
包)支持OCaml语言,当Emacs以ctags
执行时支持etags
。
请尝试:cd /path/to/Ocaml/sources/ && etags -R .
构建索引,然后在emacs
内, M - 。 ret 搜索光标下的标签。
答案 1 :(得分:3)
当您在等待更好的解决方案(其中有一些,例如参见OCamlSpotter)时,您可以使用下面列出的穷人命令。假设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)
答案 2 :(得分:2)
问题可以用merlin(https://github.com/the-lambda-church/merlin)来解决。使用opam可以轻松安装Merlin:
opam install merlin
按照opam提供的说明配置〜/ .emacs文件。要完成配置,您必须提供一个.merlin文件,告诉merlin源文件和构建文件的位置以及项目中使用的包。 https://github.com/the-lambda-church/merlin/wiki/emacs-from-scratch#configuring-your-project
中给出了.merlin文件的简要概述现在,跳转到Emacs中的函数定义:
C-c C-l
返回函数调用:
C-c &
答案 3 :(得分:0)
您可以尝试otags
位于此处:
http://askra.de/software/otags/
从项目页面:
Otags生成适合来自OCaml的emacs和vi / vim的TAGS文件 源。 Otags使用camlp4进行解析。
要使用它,请尝试以下方法:
otags -r src/
其中src
是包含OCaml源文件的子目录。
它应该创建一个TAGS
文件。
然后你应该能够在Emacs中做M-.
。
您可以使用otags
安装opam
。