[英]ggtags find-definition/reference with IDO interface
我不喜欢ggtags-find-definition/reference/file
周围的默认ggtags
接口。 我设法使ggtags-find-file
与IDO一起使用,但是ggtags-find-definition
困难得多。 有一些包装可以做到吗? 如果没有,该怎么做?
注意:我希望能够浏览模糊迷你缓冲区中找到的定义/引用,而不是整个新缓冲区(和窗口)。
通常,我建议使用ido-complete-read-plus (以前是ido-ubiquitous)。 它几乎使所有使用completing-read
命令都使用ido-completing-read
代替。 但是,在一种主要情况下,它不能很好地工作:当完成候选由函数生成时。 ggtags-completion-table
就是这种情况,这是ggtags生成其完成候选者的方式。
解决方案是定义您自己的ggtags-completing-read-function
,该ggtags-completing-read-function
在传递给ido-completing-read
之前会扩展候选者。 注意: ido-completing-read
(以及ido-completing-read-plus
)不允许这样做的原因是因为它可能使用大量的内存和CPU,并且可能冻结UI。 如果您有大量的完成候选人,则可能需要对其进行调整以使其可接受。 还要注意,大多数ggtags命令都可以在点处使用符号。 好像您通常只给一个前缀arg( Cu
)使其提示输入符号。
(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)
假设您运行了ggtags-find-definition
并找到了结果并将其放在*ggtags-global*
缓冲区中,则此函数将提取文件名和行号,并允许您使用IDO选择所需的文件名和行号。
(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: ")
这很粗糙。 您可能想要创建自己的find-definition
命令,该命令立即运行ggtags-find-definition
和ido-goto-grep-results
。 以某种方式,您只需要获取实际结果,而不是“ Global found N definitions ...”行(更好的regexp,缩小ggtags缓冲区或其他方式)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.