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