【问题标题】:gtags very slow in EmacsEmacs 中的 gtags 非常慢
【发布时间】:2013-09-15 18:59:41
【问题描述】:

我在emacs中使用gnu global,一切正常,但是命令“gtags-find-tag”搜索太慢,无法忍受。只有这个命令很慢,其他像“gtags-find-rtag”我认为是正常的。 我删除了 cedet 等其他配置,以排除这些影响,但这个问题仍然存在。 我是否错过了全局或 emacs 的一些配置步骤?或其他平台(linux)中的任何人都有这个问题?

===
我的 Emacs 是 Mac OSX 的 emacs 版本是 24.3,GNU global 是 6.2.8,我的配置文件是

(add-to-list 'load-path (expand-file-name "~/.emacs.d"))
(setq load-path (cons "/Users/xxx/.emacs.d/gtags.el" load-path))
(autoload 'gtags-mode "gtags" "" t)
(add-hook 'c-mode-hook
   (lambda ()
     (gtags-mode t)
   ))

【问题讨论】:

  • n.b.最好不要将~/.emacs.d 本身放入加载路径——Emacs 会在其中写入各种文件,偶尔会带有.el 扩展名,这意味着可能会无意中隐藏真正的库。您应该将您的 elisp 文件放在子目录中(例如 ~/.emacs.d/lisp/gtags.el)。
  • (setq load-path (cons "/Users/xxx/.emacs.d/gtags.el" load-path)) 是错误的。 load-path 是一个目录 列表,加载时在其中查找库。因此,您添加的是库的父目录,而不是库本身。
  • 感谢 phils,我将 gtags.el 移至 ~/.emacs.d/lisp/,并将此目录添加到加载路径,但此问题仍然存在。
  • 让我描述一下我的问题。我的 GNU global 可以工作,只是这个命令“gtags-find-tag”搜索很慢,大约需要 30 秒才能弹出标签搜索结果。但是其他命令都可以,只有这个命令有这个问题。

标签: macos emacs emacs24 dot-emacs gnu-global


【解决方案1】:

我不使用 Global(我一直想尝试一下),但看看 codegtags-find-taggtags-find-rtag 是非常相似的功能。

我认为差异必须在完成读取阶段或查找阶段,两者都调用全局。

在完成阅读中,'gtags' 传递选项 -c,而 'grtags' 传递 -cr

在查找阶段,“gtags”通过-x,而“grtags”通过-xr

我首先会尝试确定它在 Emacs 之外是否比在其内部更快。以上内容可能足以让您对此进行测试,但您应该能够通过使用M-x debug-on-entry RET call-process RET(您随后可以使用M-x cancel-debug-on-entry 取消)找出正在使用的确切命令,然后运行 ​​gtags 函数并查看哪个参数出现在该函数调用的堆栈跟踪中。

如果您无法确定堆栈跟踪的开头或结尾,请尝试将其复制并粘贴到您的问题中。

编辑:

根据来自 cmets 的信息,似乎是不区分大小写的论点,出于某种原因,将事情拖慢到了不合理的程度。

您应该可以在此处禁用该行为:

M-x customize-variable RET gtags-ignore-case RET

【讨论】:

  • phils,感谢您的帮助。我diff这些命令的trace enable debug-on-entry,不同的是gtags-find-tag会调用gtags-goto-tag("connect_slot" "" nil),但是gtags-find-rtag会调用gtags-转到标签(“connect_slot”“r”)。 (“connect_slot”是我输入搜索的函数名)最后,gtag-find-tag会调用(gtags-goto-tag tagname "" other-win),而gtag-find-rtga会调用(gtags-goto-标记标记名“r”)。唯一的区别是参数传递给 gtags-goto-tag 。
  • Bty,这个慢的问题只出现在C++文件中,在C文件中没有这个问题。
  • 正如我所说,call-process 是您感兴趣的函数,用于找出外部命令。
  • 另外,Global 的 6.2.9 版本可用。值得一试。
  • 外部命令是相同的call-process("global" nil t nil "-pr"),所以我认为这是gtags.el的问题而不是全局的。在 gtags.el 的 gtags-goto-tag 中,我找到了 ` (setq status (if (equal flag "C") (call-process gtags-global-command nil t nil option "--encode-path=\" \t\" " context tagname) (调用进程 gtags-global-command nil t nil option "--encode-path=\" \t\"" tagname))) (gtags-pop-tramp-environment) `
猜你喜欢
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2015-06-14
  • 2013-05-14
相关资源
最近更新 更多