helm-gtags可以和lsp共存么?

有时候工作环境没网络。配置lsp得依赖很多组件很费解。我只想用gtags作导航就可以了。但是快捷键还想让他们一样。比如 M - . M - , 跳转。是否可以让gtags的配置和lsp共存?有什么办法没?或者弄个开关命令?

逼急了我只能在特殊环境下去把不要的配置注释掉。这样有点笨。。。

lsp-bridge 可以和 citre 共存, citre 是基于 ctags 的。

他们俩的快捷键不一样?如果快捷键一样的话,是怎么个弄法?没想明白。 比如按了 M - . 俩都是跳转到函数定义。那么最后谁来执行跳转?

或者可以通过 .local 这个文件来配置本项目选哪个?

lsp-bridge 通过 acm 让 lsp 和 citre 后端可以混合补全。

跳转的事情你可以自己写一个胶水函数, 根据不同环境调用不同的后端。

给你类似的函数 lazycat-emacs/init-lsp-bridge.el at f3288107654477e8a9f0d356cac732ed890b7c4e · manateelazycat/lazycat-emacs · GitHub

但是要实现你的目标, 你必须要懂 elisp 。

噢,这是lsp-bridge接管了。然后由它来控制后面的多个选择。 我看看这个能用一下不能。多谢。

找到一个这个链接。但还不知道能不能用。。。

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

;;; disable lsp-mode and enable ggtags-mode
((nil . ((eval . (lsp-mode -1))
         (eval . (ggtags-mode 1)))
))

你只需要像我这样写一个胶水函数, 不同模式调用 lsp 或者 gtags 的接口就好了。

如果看不懂, 先认真学习 elisp 吧。

我之前写过那种默认调用 lsp 方法如果出错捕获异常再调用另一套的做法,大概意思就是如果一个没找到就调用另外一个

如果不排斥citre+ctags,又想用xref的快捷键,可以看看 xref-backend-functions为啥不像说明中的那样把function list都执行呢?

看到大家提到几次 Citre,我也来掺和一下 :joy::joy:虽然其实没有太看明白楼主的需求

首先 Citre 现在支持基于 gtags 的补全、查定义、查引用和 imenu,详见这里。如果不需要用 gtags 补全,设置一下 citre-completion-backends 就好了。

Citre 支持用 xref 查定义和引用。想用 xref 界面(就是 M-.M.,)的话,至少有两种方法:

  1. 参考 Citre 的 wiki ,可以实现 lsp 查不到定义/引用的时候 fallback 到 Citre

  2. 什么都不用做。打开文件的时候 Citre 会尝试找当前工程的 tags 文件或 gtags 文件,找得到就会启用 citre-mode,然后 xref 后端就会被设为 Citre。但如果 lsp 在打开文件时也有类似的动作的话可能会打架,我不用 lsp 所以只能楼主自己解决了。

如果想用类似 helm 的界面,可以使用 citre-jump 命令和 citre-jump-to-reference 命令,在 citre-mode-map 中把 M-.M-, 绑定给它们就行了,这样在 citre-mode 不开启的时候它们就还是 xref 的功能。

最后就是推荐一下用用 citre-peekcitre-peek-reference(记得读文档),也许用过以后就不会再想念 xref 这种工具了。

1 个赞

我到用不到这么动态。我只需要在用不了lsp的时候用helm-gtags就行了。甚至可以手动操作配置一个开关之类的都可以。

比如一个机器上有lsp,我就做个选择用lsp,如果另一台机器上没有,我就配置一下用gtags。

但是快捷键需要一样。

多谢,抽空看看。

这个看起来不错。我折腾完了试试