我不喜欢ggtags
周围的默认ggtags-find-definition/reference/file
界面。我设法让ggtags-find-file
与IDO合作,但ggtags-find-definition
是一个更难的问题。
有一些包可以做到吗?如果没有,如何制作一个?
注意:我希望能够在模糊迷你缓冲区中浏览找到的定义/引用,而不是全新的缓冲区(和窗口)。
答案 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缓冲区或其他方式)。