Emacs ggtags使用IDO接口查找定义/引用

Emacs ggtags使用IDO接口查找定义/引用,emacs,ctags,Emacs,Ctags,我不喜欢ggtags查找定义/参考/文件周围的默认ggtags界面。我设法获得了ggtags find file和IDO一起工作,但是ggtags find definition是一个更难的问题。 有什么包可以做吗?如果没有,如何制作 注意:我希望能够在fuzzy minibuffer中浏览找到的定义/引用,而不是整个新的缓冲区(和窗口)。通常,我建议(以前是ido)。它使得几乎所有使用完成读取的命令都使用ido完成读取。然而,有一种主要情况下它不能很好地工作:当完成候选项由函数生成时。ggta

我不喜欢
ggtags查找定义/参考/文件
周围的默认
ggtags
界面。我设法获得了
ggtags find file
和IDO一起工作,但是
ggtags find definition
是一个更难的问题。 有什么包可以做吗?如果没有,如何制作

注意:我希望能够在fuzzy minibuffer中浏览找到的定义/引用,而不是整个新的缓冲区(和窗口)。

通常,我建议(以前是ido)。它使得几乎所有使用
完成读取的命令都使用
ido完成读取。然而,有一种主要情况下它不能很好地工作:当完成候选项由函数生成时。
ggtags完成表
就是这种情况,这就是ggtags生成完成候选项的方式

这是为了定义自己的
ggtags completing read函数
,该函数在传递到
ido completing read
之前展开候选对象。注意:
ido完成读取
(以及
ido完成读取加上
)不允许这样做的原因是它可能会使用大量内存和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)
通常,我会建议(以前我是无所不在的)。它使得几乎所有使用
完成读取的命令都使用
ido完成读取。然而,有一种主要情况下它不能很好地工作:当完成候选项由函数生成时。
ggtags完成表
就是这种情况,这就是ggtags生成完成候选项的方式

这是为了定义自己的
ggtags completing read函数
,该函数在传递到
ido completing read
之前展开候选对象。注意:
ido完成读取
(以及
ido完成读取加上
)不允许这样做的原因是它可能会使用大量内存和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
。不知何故,您只需要获得实际结果,而不需要“Global found N definitions…”行(更好的regexp、缩小ggtags缓冲区或其他方式)

假设您运行了
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缓冲区或其他方式)

不起作用,当我点击“查找定义”时,新窗口中创建的缓冲区中充满了找到的定义,我不希望出现这种行为,我希望微型缓冲区中的定义/引用列表具有模糊匹配。@Seraph用实际解决方案而不是模糊的元解决方案更新了我的答案。不起作用。ggtags在缓冲区中查找定义显示结果,而不是在IDO minibuffer中。很抱歉,也许,我没有很好地指定我的问题…@Seraph Use
C-u
前缀,否则它将在点处使用符号,而不是提示您输入符号名称。我可以在点处使用符号,但我想模糊浏览此查询的结果。当我点击“查找定义”时,创建新窗口时,缓冲区中填充了找到的定义,我不希望出现这种行为,我希望使用模糊匹配的minibuffer中的定义/引用列表。@Seraph用实际解决方案而不是模糊的元解决方案更新了我的答案。未按预期工作。ggtags在缓冲区中查找定义显示结果,而不是在IDO minibuffer中。很抱歉,也许,我没有很好地说明我的问题…@Seraph Use
C-u
前缀,否则它将在点处使用符号,而不是提示您输入符号名称。我可以在点处使用符号,但我想模糊浏览此查询的结果。谢谢,我会玩你的例子,并在我达到后发布最终解决方案。太棒了,谢谢你,我会玩你的例子,并在我达到后发布最终解决方案。