当您在等待更好的解决方案(其中有些解决方案(例如,请参阅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)
对不起,我应该在哪里运行'的ETag -R .'? – SoftTimur
更新了答案:您需要从任何目录拥有所有来源运行'etags -R .'。 – sarnold
终端下的'etags -R .'给出'etags:跳过::它不是普通的文件.'。我尝试了'etags -R file.ml',没有生成新文件,并且在Emacs下的M-。'给出了[[不匹配]] ...“。 – SoftTimur