lsp-mode (bingo) 补全末尾多出一个 0 如何消除?

go的lsp-mode在使用bingo补全后端的时候会在补全的末尾多出一个0。

这是我的lsp-mode配置

有人说是 yasnippet 的问题,不知道大家有遇到吗?

我也遇到过这个问题,换另一个server可以

现在go的server还有其他可用的吗?

go-langserver

这个优先级比bingo低,需要先卸载bingo

我也碰到这种情况。你可以给bingo提个issue。我英语不行。

bingo的开发者不是中国人吗?另外谷歌自己也在开发lsp服务器,不知道进展如何

已经有人提了。

这个问题,我也给作者提了issue。

现在的主要问题是比较慢,项目稍微大一点,就开始卡了。两周前,基本没法用它开发,出现很多问题。这周取了最新代码后,基本没什么问题了,但速度很难接受。

目前我做golang项目,还是以vim为主,vim-go插件很不错,并且速度快。

你这样一说,我都有重启vim的冲动了。

我现在,emacs和vim同时用,只是开发golang项目时用vim,做其他的或golang的小程序用emacs

原标题「请问有人使用lsp-mode的go补全吗?补全有些问题」没有意义,我帮你改了。

聊天的时候不要问「在吗」,提问的时候也一样(除非它真的是非常非常非常小众,大部分人都没听过,LSP 和 go 显然都不是)。应该直奔主题,用简明、概括的语句作为标题。


言归正传

末尾的 0 确实是 snippet 的问题,bingo 给出的模版是这样:

Print(${1:a})${0} 

可以手动展开来验证一下:

(yas-expand-snippet "Print(${1:a})${0}") ;; => Print(|a)0

如果把末尾的花括号去掉就不会了:

(yas-expand-snippet "Print(${1:a})$0") ;; => Print(|a)

bingo 最新的版本中已经 fix 了

如果你不打算升级 bingo

可以在 Emacs 端修复。我之前就是这么处理(我修改的是 helm(+completion-at-point) 的补全,并非 company,但思路是一样的):

(define-advice completion-at-point (:around (fn) expand-snippet)
  (let ((beg (point)))
    (funcall fn)
    (let* ((end (point))
           (str (replace-regexp-in-string
                 "${0}\\'"
                 "$0"
                 (buffer-substring-no-properties beg end))))
      (when (string-suffix-p "$0" str)
        (yas-expand-snippet str beg end)))))
1 个赞

恩,谢谢啦,我升级过bingo,在这个issue下面我也反馈过

标题我一开始也是差不多你这个标题,但论坛这边发不出去,然后我改成这个才发成功,我也很尴尬