lsp bridge java文件中补全格式异常

录屏_选择区域_20240709211832 如图,补全会出现$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}

@LoveXiaPu

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

感谢大佬讲解, 我提交了一个补丁

@LoveXiaPu 你更新看看。

谢谢大佬指教,明白了

这样改以后确实解决了,感谢

录屏_选择区域_20240710165517

感谢大佬,更新了一下代码,但是看起来没有解决

我推送了 Use yas-selected-text to implement $TM_SELECTED_TEXT return by jdtls … · manateelazycat/lsp-bridge@212bbf8 · GitHub , 再更新试一下。

感谢 @ginqi7 大佬的解惑。

可以了,感谢大佬

1 个赞