简单的方法来定义函数(Emacs,Ocaml)

时间:2011-11-14 08:58:10

标签: emacs keyboard-shortcuts ocaml

我在Emacs下编码Ocaml ......

我想知道是否有跳转到函数定义的快捷方式(光标所在的位置)。目前,为此我必须在整个文件中搜索该函数的名称,或者查找let the_name_of_the_functionlet rec the_name_of_the_function以及and the_name_of_the_function,这显然是单调乏味的......

顺便说一下,我有文件.annot

有人可以帮忙吗?谢谢!

4 个答案:

答案 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