lsp-bridge -- 速度最快的语法补全插件

你的目标是 zsh 文件不启动 lsp-bridge 吗?

不启动bash server就行了,因为他zsh语法总是报错

zsh文件的规则是什么样的? 分享一下吧, 我觉得可以在lsp-bridge-default-mode-hooks就拦截了

我就简单regexp match了常用的几个 xx.zsh, .zshenv, .zshrc

我看那个函数 lsp-bridge-has-server-p 好像只能返回当前文件major-mode对应的server,其他附加的emmet,tailwindcss都无法获取,这个能改进吗? 获取当前文件所关联的所有lsp server.

我有一些函数想在文件所有server启动后运行,又需要获取server 列表, 函数lsp-bridge-has-server-p 只能返回一个主server. 现在的解决办法是直接在 server detect函数内运行,感觉不是好办法.

比如说:

(defun my/bridge-server-setup (filepath server)
  (with-current-buffer (get-file-buffer filepath)
    ;; enable : in emmet completion
    (when (string-match-p "emmet" server)
      (setq-local lsp-bridge-completion-hide-characters
                  (delete ":" lsp-bridge-completion-hide-characters)))
    ;; enable - in tailwindcss completion
    (when (string-match-p "tailwindcss" server)
      (modify-syntax-entry ?- "w"))))

简言之, 最好提供两个接口:

  1. 一个hook: after-server-setup-hook
  2. 一个函数: 获取当前文件所关联的所有server

虽然我在detect函数里面也可以用

其实我发现 css server(css,scss,less), typescript server(js,ts,jsreact, tsreact)也可以保持 languageId=“‘, 这样就可以动态获取id 了,只需要一个基本的json,而不需要准备三四个,

我推送了一个补丁

在lsp-bridge-default-mode-hooks源头一开始就把 zsh 文件排除在外, 这样不用把后面的项目目录判断函数搞的过于复杂。

.zsh是后缀, 但是 .zshenv和.zshrc是文件名,你取后缀的话后两者返回nil哦

Done

1 个赞

解决了, :grin:

lsp-bridge-has-lsp-server-p 这个函数不是只返回 major-mode 对应的 server, 它是返回 lspbridge/langserver lspbridge/multiserver 这两个目录下对应的 json 文件名。

你为啥要检查当前文件对应的所有 LSP server name ? 我先把这个搞清楚以后, 因为我对 lsp-bridge 代码更为熟悉, 可以把代码加到合适的地方, 你直接说要提供什么接口, 反而会把事情搞复杂。

我这边打开一个tsx文件启动了三个server: typescript, emmet和tailwindcss, 可是lsp-bridge-has-lsp-server-p 只能返回一个 typescript, 返回的不是multi的那个json 文件名,你确定是返回值没问题?

我需要那个启动的 json名字,方便设置buffer的属性,比如启动了tailwindcss,那我就要设置当前buffer的 (modify-syntax-entry ?- “w”), 这样补全含有dash的classname就不会中断了, 我现在的做法就是在 detect函数里面直接调用返回的 json filename来做判断, 但我觉得在detect函数里面做这些不太好, 万一是在

lsp-bridge-multi-lang-server-extension-list

lsp-bridge-multi-lang-server-mode-list

这些环节启动的tailwindcss 那我的设置函数就没用了, 所以我想把设置函数放到最后来进行,这样就必须依赖其他方式来获取当前buffer关联的json文件名了,然后我发现这个函数lsp-bridge-has-lsp-server-p 的问题. 至于hook倒不是必须的,我可以写一个timer 挂在 lsp-bridge-mode-hook上延迟执行都可以

你的这个 tsx 的多服务器 json 文件是你自己写的吧?

我看最简单的办法就是: 只要成功启动了server, 就设置一个buffer-local var 把启动的json文件名写进去, 然后我就可以写一个timer比如延迟3s后来根据这个var判断要不要执行设置函数. 或者正式一点,写一个 server-start-succeed-hook, 传入 buffer 和json文件名作为参数

是啊,不是有自定义的 lsp-bridge-user-multiserver-dir ? 你是说没包括自定义的文件夹

lsp-bridge Python 端如果检查到 lsp-bridge-user-multiserver-dir 设置, 并且有同名的 json 文件, 会用用户目录的 json 文件覆盖 lsp-bridge 默认的配置。

但是 lsp-bridge-has-lsp-server-p 函数只考虑了 lsp-bridge-get-multi-lang-server-by-extension, lsp-bridge-get-multi-lang-server-by-file-mode, lsp-bridge-get-single-lang-server-by-extension, lsp-bridge-get-single-lang-server-by-file-mode这四种情况, 我在想是不是你根据 project-path 自定义的函数, 并不在 lsp-bridge-has-lsp-server-p 检查范围导致的?

你说的这个变量是已经有的, LSP Server 一旦成功启动, 就会设置 acm-backend-lsp-server-names 这个局部变量

我看了 has-server 函数的实现,后半段为什么不直接调用已经存好的局部变量呢,反正启动server的时候已经查找过一次了

lsp-bridge-has-lsp-server-p是 lsp-bridge 项目最开始启动的时候就写了的。

多服务器的功能是 lsp-bridge 项目创建半年后才加入的, 写 lsp-bridge-has-lsp-server-p 的时候就没有考虑到多服务器的情况。

你的情况我在想想怎么弄吧。

我好像没找到这个局部变量啊, C-h v找不到