如图,补全会出现$TM_SELECTED_TEXT,请问一下这个是什么原因导致的,要怎么解决
看readme安装elisp依赖 yasnippet
这可能确实是个问题。$TM_SELECTED_TEXT 应该是 jdtls 内置的一个变量,表示之前选中的文本。在 TextMate snippets 或者 vscode snippets里支持。
但是 yasnippet 没有内置这个变量。所以会直接展示这个文本。 lsp 返回的 response 里的 new-text,类似于:
while (${1:condition}) {\n\t$TM_SELECTED_TEXT${0}\n}
yasnippet 有一个类似功能的变量:yas-selected-text
如果想要 yasnippet 能够正常展开应该需要改为:
while (${1:condition}) {\n\t`yas-selected-text`${0}\n}
lsp-bridge 是通过 yas-expand-snippet
把 lsp server 传递的 snippet 展开的。
可以通过一个 advice 修改这个 snippet 让它变成正确的 yasnippet 的语法,来正确的展开。例如:
(defun yas-expand-snippet-advice (orig-fun &rest args)
(apply orig-fun (string-replace "$TM_SELECTED_TEXT" "`yas-selected-text`" (car args)) (cdr args)))
(advice-add 'yas-expand-snippet :around
#'yas-expand-snippet-advice)
PS. 实际上在 lsp 补全场景, $TM_SELECTED_TEXT 或者 yas-selected-text
好像没有什么用。它需要选中一个字符串,然后再展开snippet, 把选中的内容塞入到相应的位置。但是通过 lsp 补全的使用场景,不会选中任何文本,因此 selected-text 一直是空的。
所以上述 advice 的效果,看起来就是删除了 $TM_SELECTED_TEXT
谢谢大佬指教,明白了
这样改以后确实解决了,感谢
感谢大佬,更新了一下代码,但是看起来没有解决
我推送了 Use yas-selected-text to implement $TM_SELECTED_TEXT return by jdtls … · manateelazycat/lsp-bridge@212bbf8 · GitHub , 再更新试一下。
感谢 @ginqi7 大佬的解惑。
可以了,感谢大佬