ggtags使用IDO接口查找定义/引用

时间:2017-12-11 21:21:00

标签: emacs ctags

我不喜欢ggtags周围的默认ggtags-find-definition/reference/file界面。我设法让ggtags-find-file与IDO合作,但ggtags-find-definition是一个更难的问题。 有一些包可以做到吗?如果没有,如何制作一个?

注意:我希望能够在模糊迷你缓冲区中浏览找到的定义/引用,而不是全新的缓冲区(和窗口)。

2 个答案:

答案 0 :(得分:1)

通常,我会建议ido-completing-read-plus(以前无处不在)。它使得几乎所有使用completing-read的命令都使用ido-completing-read。然而,有一个主要情况是它不能很好地工作:当完成候选者由一个函数生成时。这是ggtags-completion-table的情况,这就是ggtags如何生成完成候选者。

solution是定义您自己的ggtags-completing-read-function,在传递给ido-completing-read之前扩展候选人。注意:ido-completing-read(以及ido-completing-read-plus}不允许这样做的原因是因为它可能使用大量内存和CPU,并且可能会冻结UI。如果你有大量的完成候选人,你可能需要调整它以使它可以接受。另请注意,大多数ggtags命令在点处使用符号;看起来你通常只​​给出一个前缀arg(C-u)来提示符号。

(defun jpk/ggtags-completing-read (&rest args)
  (apply #'ido-completing-read
         (car args)
         (all-completions "" ggtags-completion-table)
         (cddr args)))
(setq ggtags-completing-read-function #'jpk/ggtags-completing-read)

答案 1 :(得分:1)

假设您运行*ggtags-global*并找到结果并将其放入缓冲区(defun ido-goto-grep-results (grep-buffer prompt) (interactive) (let (candidates result filename dirname line) (with-current-buffer grep-buffer (setq dirname default-directory) (save-excursion (save-match-data (goto-char (point-min)) (forward-line 4) (while (re-search-forward "^\\(.+\\):\\([0-9]+\\):" nil 'noerror) (push (concat (match-string 1) ":" (match-string 2)) candidates))))) (setq result (split-string (ido-completing-read prompt candidates nil t) ":")) (setq filename (car result)) (setq line (string-to-number (cadr result))) (find-file-other-window (expand-file-name filename dirname)) (goto-char (point-min)) (forward-line (1- line)))) (ido-goto-grep-results "*ggtags-global*" "Jump to definition: ") ,此函数将提取文件名和行号,并允许您使用IDO来选择所需的结果。< / p>

find-definition

这非常粗糙。您可能希望制作自己的ggtags-find-definition命令,该命令一次运行ido-goto-grep-results<hr>。不知何故,你只需要获得实际结果,而不是“全局找到的N定义...”行(更好的正则表达式,缩小ggtags缓冲区或其他方式)。