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

你要自己实验哈, 建议参考一下 VSCode 是怎么写的, 如果 lsp server 没有什么额外参数, 这样写是可以的。

建议json改成 racket.json 的名字,写完 json 只是第一步, 还要按照上面的连接, 把 racket-mode 和 “racket” 绑定, 重启Emacs就可以测试了。

按照我上面的连接一步一步的来吧, 依葫芦画瓢很快就可以做好。

1.将racket-langserver.json更改如下

{
  "name": "racket-langserver",
  "languageId": "racket",
    "command": [
      "racket",
       "--lib",
      "racket-langserver"
    ],
  "settings": {}
}

2.在lsp-bridge.el的lsp-bridge-single-lang-server-mode-list 下添加 (racket-mode . “racket-langserver”) 经过上面的两步设置后在racket-mode 下实现了补全,看是否考虑更新到lsp-bridge 下一版本中以支持racket?

你可以自己推补丁,让楼主合并

直接发补丁吧,谢谢

社区开发者增加了对 Org roam 的补全后端, 欢迎大家试用反馈。

代码水平有限,如有问题或更好的解决方案,还请各位指出。

目前比较影响使用体验的是含有空格的字符串。一个是在输入空格后,补全菜单会关闭,可能是因为大部分补全都不会包含空格,所以设计上 acm 会在空格后关闭?另一个问题是一个含有空格的候选项,如foo bar,以空格为分界,除了最后一个(bar)以外必须完全匹配(大小写不敏感),即 fo ba不会出现该候选项,可能和上一个问题有关,orderless 的匹配模式只运用在最后一个上。我还没有读完所有的acm代码,所以没有找到方法。

第二问题的解决方式, 可以用 acm-filter M-u 键来模糊搜索候选词

1 个赞

已经添加到 lsp-bridge 中, 更新即可

1 个赞

第一个问题, 需要检查 lsp-bridge-completion-popup-predicates 是否导致菜单无法弹出? 看看是哪个条件函数需要兼容 acm-in-roam-bracket-p ?

大致已经解决了。

第一个问题是这个predicate:

(defun lsp-bridge-not-only-blank-before-cursor ()
  "Hide completion if only blank before cursor, except in roam bracket."
  (or (not
       (null
        (split-string (buffer-substring-no-properties
                       (max (1- (point)) (line-beginning-position))
                       (point)))))
      ;; Keep completion after space in Org roam bracket.
      (acm-in-roam-bracket-p)))

这样实现有没有问题?我需不需要把 acm-in-roam-bracket-p移到lsp-bridge.el中,这样如果有人不需要org-roam的后端删掉了这个文件,也可以正常使用。

第二个问题改成 orderless 就行了:

(setq acm-candidate-match-function 'orderless-flex)

第一个补丁我已经合并到主分支了。

感谢 @kongds 大佬的帮助, 今天最新版修复了 lsp-bridge 无法在 org src block 区域手动补全的bug, 用 lsp-bridge 手动挡的用户可以更新到最新版。

bug详情在 org-mode source block, manually complete not work , although auto pop up menu completion working · Issue #874 · manateelazycat/lsp-bridge · GitHub

1 个赞

之前 orderless 更新了,可以搜索 annotation,比如在 describe-variable 的时候通过变量的值筛选候选项。

但是我在更新了 orderless 后,无法在 (setq acm-candidate-match-function 'orderless-flex) 时 补全 yasnippet 后端,默认的 regexp-quote 可以。

我尝试 bisect 了一下,应该是 orderless这个 commit 引起的。

因为 backtrace 报错信息太长了,所以我提交了一个 issue

应该给orderless发issue呀,为什么要给被破坏兼容性的lsp-bridge发issue呀?

感谢大佬加了个hook!我也糊了一个flycheck的前端。放在这里给有需要的道友吧。这个绕开了我在这里提到的diagnostics的列表不会自动更新的问题,顺带让modeline上可以显示error的数量了。

为什么不修lsp-bridge呢,因为我在100行内修不好啊(逃 :joy:

2 个赞

已经提交PR,详细讨论: Compatibility problem with lsp-bridge? (wrong-type-argument stringp (seq (group 100))) · Issue #168 · oantolin/orderless · GitHub

  • orderless的更新使部分函数返回 rx 表达式,我在 acm 相关函数中分别处理了字符串和 `rx。
  • 维护者 minad 认为 acm 中使用的部分函数为内部函数,所以并不视为一个重大的破坏性改变。
  • minad 和 oantolin 提议让 acm 的相关函数同时处理字符串和 rx
  • minad 不认为这些函数会有进一步的兼容性问题。

我对 acm-candidate-match-function 的所有变量进行了简单的测试,并没有发现明显问题,同时禁用 orderless 不影响默认值 regexp-quote。我认为这个改动是合理的,也许之后考虑改用 orderless-compile

希望有使用最新的 orderlesslsp-bridge 的人可以提供反馈。

3 个赞

可以直接提交一个 lsp-bridge-flycheck.el 文件哈, 虽然我觉得LSP场景下没有必要用 flycheck/flymake, 但是我乐于合并, 以方便那些喜欢 flycheck/flymake 的同学。 :wink:

1 个赞

感谢耐心沟通, 虽然 orderless 新版引入新的 rx sexp 结构, 但是兼容 orderless 的补丁看起来并不复杂, 我已经合并了兼容补丁。

再次感谢耐心的沟通, 向你学习。

1 个赞

过奖了,我也是为自己的需求去提交补丁的,这一切的前提是这个开放好用的包,要感谢你对 Emacs 作出的贡献。在 Emacs 方面,我还有许多要学习的地方。
最近我打算在空闲时间看看其他编辑器的补全设计,看看有什么值得借鉴的地方,比如,我觉得目前的图标设计并不是那么直观,想在这方面进行改进,希望能够从中学习到新的东西。

4 个赞

今天修复了 Rust Inlay Hint 有时候不会渲染的问题, 主要是 InlayHint 请求才发送以后, 如果这时候发送 didChange 请求就会导致 rust lsp server 报错。

上面这个补丁的作用是探测到这种错误后, 重新尝试再发送一次 InlayHint

1 个赞