ggtags使用IDO接口查找定义/引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ggtags使用IDO接口查找定义/引用相关的知识,希望对你有一定的参考价值。
我不喜欢ggtags
周围的默认ggtags-find-definition/reference/file
界面。我设法让ggtags-find-file
与IDO合作,但ggtags-find-definition
是一个更难的问题。有一些包可以做到吗?如果没有,如何制作一个?
注意:我希望能够在模糊迷你缓冲区中浏览找到的定义/引用,而不是全新的缓冲区(和窗口)。
通常,我会建议ido-completing-read-plus(以前的ido-ubiquitous)。它使得几乎所有使用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)
假设你运行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
。不知何故,你只需要获得实际结果,而不是“全局找到的N定义...”行(更好的正则表达式,缩小ggtags缓冲区或其他方式)。
以上是关于ggtags使用IDO接口查找定义/引用的主要内容,如果未能解决你的问题,请参考以下文章
解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段