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-definitionido-goto-grep-results。不知何故,你只需要获得实际结果,而不是“全局找到的N定义...”行(更好的正则表达式,缩小ggtags缓冲区或其他方式)。

以上是关于ggtags使用IDO接口查找定义/引用的主要内容,如果未能解决你的问题,请参考以下文章

php如何实现多继承?

JMeter接口测试-Include控制器

在片段中,如何查找活动布局中定义的视图?

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

使用Visual Studio Code自定义代码模版

片段 getActivity() 与接口回调?