繁体   English   中英

ggtags使用IDO接口的查找定义/参考

[英]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-definitionido-goto-grep-results 以某种方式,您只需要获取实际结果,而不是“ Global found N definitions ...”行(更好的regexp,缩小ggtags缓冲区或其他方式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM