web-mode 里 lsp-bridge 补全列表的设置

web-mode 里无论输入什么(除了 dabbrev)第一个结果都是这个 Snippet的补全,这个补全结果就是右边的 HTML 标签

这个东西可能是写 HTML 里面用到的类似 emmet-mode 的东西

如何禁掉这个东西呢,HTML 标签已经有emmet-mode 了,这个很烦人

经过测试,这个 Snippet 就是 acm-completion-backend-merge-order 里面的 “mode-first-part-candidates” 提供的,但是这个东西如果取消了,那很多提示都没了。。

acm-completion-mode-candidates-merge-order

我在另一台电脑里查到了那两个属性默认的值并且改了回去,但是改完后只有 yas 的提示了,连 eslint 的都没了 :flushed:

@manateelazycat 大佬,lsp-bridge 如何还原所有配置。。

我改过那俩属性后,回不去了,现有的配置删掉重新加载 lsp-bridge 也不行

你把你的配置删除就还原了。

重启emacs了吗

重启也不行,这个问题好像和 python 有关,现在启动后 holo-layer 的那个 python 脚本不会启动了,以前每次都和 emacs 一起启动

现在 emacs 总是有这个问题or: Wrong type argument: lsp-bridge-epc-manager, nil

epc 也没问题 image

我拉取了新的lsp-bridge代码,尝试更新一下 python 环境看看

通过打开日志 : (setq lsp-bridge-enable-log t) 看到是 python 的包找不到

那一堆包不知道为什么在 pip 的列表里而不在 pip3 里了,用 pip3 重新安装一遍即可:

pip3 install epc orjson sexpdata six setuptools paramiko rapidfuzz --break-system-packages

那个 Snippet 是 "lsp-candidates" 提供的,如果删掉其他的 js 提示也没了

(setq acm-completion-mode-candidates-merge-order '(
                                                  "elisp-candidates"
                                                  "lsp-candidates"
                                                  "jupyter-candidates"
                                                  "ctags-candidates"
                                                  "citre-candidates"
                                                  "org-roam-candidates"
                                                  "file-words-candidates"
                                                  "telega-candidates"
                                                  ))

;; by default

@manateelazycat 大佬,是否有办法在 web-mode里把这个关键字为 Snippet 的结果过滤掉

image

它在 acm.el 里:

;; Fetch syntax completion candidates.
(setq lsp-candidates (unless (acm-in-comment-p) (acm-backend-lsp-candidates keyword)))

我如果在这里直接过滤它 messages buffer 里会报错,补全列表也没了…

直接set candidates变量肯定不行,这个是补全插件频繁去更新的,你set一次必然不对,马上就被刷掉了。

确认这个补全项是lang server提供的,总算是前进了一步。不对,lang server怎么会返回snippet呢,有那种会展开为snippet的函数补全项啥的,但类型肯定是函数之类的,server返回的没有snippet吧!看看lazycat怎么说。

你为啥要过滤掉lsp server返回的snippet?

这个 Snippet 是 html 标签的 Snippet, 无论你在 .vue 文件的 html 里还是 js 里输入任何没有正常补全的内容, 回车就是<xx></xx>

比如我文件里有 west 这个变量,我输入weswest 在第一个

image

如果没有 west这个变量,那个 Snippet 就是第一个了

我真的需要 html 标签会用 emmet-mode ,完全不需要这个东西

只要是没有其他补全的他都会变成 Snippet 排在第一位

比如输入 cn, 我有个自定义的 yas-snippet 就是这个 key,但是现在被这个Snippet 覆盖了,准确的说,它覆盖了所有的 yas-snippet,而它没有任何用处

这个问题不会只有我的环境有吧…

@JJPandari 大佬,你那没有这个吗?

我现在用的react,看了下multi server配置下面有个volar_emmet,vue好像默认会带emmet,可能要自己配一下启用的server把emmet去掉…… 我看了lsp-bridge-single-lang-server-mode-list想确认一下,没找到vue/volar,有点奇怪

我把 lsp-bridge/multiserver/volar_emmet.json 里的 emmet-ls 都删掉后,就没有那个 Snippet

还有一些 SearchWord 会有点干扰, 通过设置触发字数也解决了

(setq acm-backend-search-file-words-candidate-min-length 3)

:pray: :pray: :pray: 感谢二位 @JJPandari @manateelazycat

根据你的需求, 添加了新的选项

  • acm-backend-lsp-block-kind-list: 过滤某些类型的 LSP 候选词, 默认是列表, 当值为 '("Snippet" "Enum") 的时候, 意味着 Snippet Enum 这两种类型的补全不会显示

这个值允许你根据类型来精确的过滤某些 LSP server 的补全候选词。

1 个赞

试了下这个目前没生效,有个其他问题

我在 .vue 里的补全的类型只有SnippetSearchWord

image

而且,每当我保存文件时,lsp-bridge 就会重启似的,这是 Message buffer的信息:

Saving file /Users/mzy/work/traffic/src/components/Cross/index.vue...
Wrote /Users/mzy/work/traffic/src/components/Cross/index.vue
[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/vue-language-server
[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/emmet-ls
[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/vue-language-server
[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/emmet-ls
[LSP-Bridge] Active project ’traffic’, enjoy hacking!

Lsp-bridge 日志:

*** lsp-bridge-try-completion execute predicate 'lsp-bridge-not-delete-command' failed with result: 'nil'

*** lsp-bridge-try-completion execute predicate 'lsp-bridge-not-delete-command' failed with result: 'nil'

*** lsp-bridge-try-completion execute predicate 'lsp-bridge-not-delete-command' failed with result: 'nil'

如果写 lisp 完全没有这些问题

在进入.vue 的时候lsp-bridge也没有报错,看起来都挺正常:

Eval in Emacs: (lsp-bridge--first-start '50717)
Eval in Emacs: (message '"[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/vue-language-server")
Eval in Emacs: (message '"[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/emmet-ls")
Eval in Emacs: (message '"[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/vue-language-server")
Eval in Emacs: (message '"[LSP-Bridge] found language server: /Users/mzy/.nvm/versions/node/v18.19.0/bin/emmet-ls")
Start lsp server (volar, emmet-ls) for /Users/mzy/work/traffic
Eval in Emacs: (message '"[LSP-Bridge] Active project 'traffic', enjoy hacking!")
Handlers: [<class 'core.handler.completion.Completion'>,
 <class 'core.handler.completion_item.CompletionItem'>,
 <class 'core.handler.find_define.FindDefine'>,
 <class 'core.handler.find_type_define.FindTypeDefine'>,
 <class 'core.handler.find_implementation.FindImplementation'>,
 <class 'core.handler.find_references.FindReferences'>,
 <class 'core.handler.peek.PeekFindDefine'>,
 <class 'core.handler.peek.PeekFindReferences'>,
 <class 'core.handler.hover.Hover'>,
 <class 'core.handler.signature_help.SignatureHelp'>,
 <class 'core.handler.prepare_rename.PrepareRename'>,
 <class 'core.handler.rename.Rename'>,
 <class 'core.handler.jdt_uri_resolver.JDTUriResolver'>,
 <class 'core.handler.deno_uri_resolver.DenoUriResolver'>,
 <class 'core.handler.code_action.CodeAction'>,
 <class 'core.handler.formatting.Formatting'>,
 <class 'core.handler.execute_command.ExecuteCommand'>,
 <class 'core.handler.workspace_symbol.WorkspaceSymbol'>,
 <class 'core.handler.call_hierarchy.PrepareCallHierarchy'>,
 <class 'core.handler.call_hierarchy.CallHierarchy'>,
 <class 'core.handler.call_hierarchy.PrepareCallHierarchyIncomingCalls'>,
 <class 'core.handler.call_hierarchy.PrepareCallHierarchyOutgoingCalls'>,
 <class 'core.handler.call_hierarchy.CallHierarchyIncomingCalls'>,
 <class 'core.handler.call_hierarchy.CallHierarchyOutgoingCalls'>,
 <class 'core.handler.document_symbol.DocumentSymbol'>,
 <class 'core.handler.jdtls.jdtls_list_overridable_methods.JdtlsListOverridableMethods'>,
 <class 'core.handler.jdtls.jdtls_add_overridable_methods.JdtlsAddOverridableMethods'>,
 <class 'core.handler.inlay_hint.InlayHint'>,
 <class 'core.handler.semantic_tokens.SemanticTokens'>]

你是怎么配置的?

这是所有的 lsp-bridge的配置:

(if (file-exists-p "~/AppData/Roaming/lsp-bridge")
    (add-to-list 'load-path "~/AppData/Roaming/lsp-bridge")
  (add-to-list 'load-path "~/emacs-packages/lsp-bridge"))
(require 'lsp-bridge)
(global-lsp-bridge-mode)
;; 当光标悬停在诊断位置时显示诊断工具提示,默认禁用
(setq lsp-bridge-enable-hover-diagnostic t)
(setq acm-enable-tabnine nil)
(setq acm-enable-yas nil)
(setq acm-backend-search-file-words-candidate-min-length 3)
(setq acm-backend-lsp-block-kind-list '("Snippet"))
(setq lsp-bridge-enable-log t)

那个总是重启的问题估计跟这行没什么关系,目前还没搞清楚

你这个配置就是让 LSP Server 不要显示 Snippet 补全信息, 这个没有用吗?

是的,没用,我在 el 文件里单独测试了下

el文件的补全不走lsp呀