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

capf肯定是没法适应LSP协议的, 而 capf 所有想要实现的功能, acm 都是完全可以实现的, 我之所以没有抽象通用接口的原因是, 现实世界根本不像 capf 现有固定接口设计的那样发展。

我的建议是先可以工作, 只要逻辑没有问题, 重构的问题我可以来改一版就好了。

2 个赞

目前所处理的一个python项目的结构如下

repo
├── main.py
├── src
│   ├── training
│   │   ├── distributed.py
│   │   ├── logger.py

在 main.py 中, 首先将 src 加入 sys.path

import sys
sys.path.append("/path/to/repo/src")

from training.distributed import is_master
from training.logger import setup_logging, get_exp_name

但似乎 lsp-bridge 解析不到相应的函数

可以临时打开调试选项看lsp server啥反馈,readme底部有讲怎么打开调试选项。

切换完虚拟环境更,执行lsp-bridge-restart-process之后,没有lsp补全,这是什么原因

重启emacs再来一次就正常 :joy:

大佬你好,lsp-bridge各方面都太赞了,但是我在使用时遇到一个问题,补全的窗口在输入时会不停的刷新闪烁,从而导致体验不是太好,不知道有没有什么好的解决办法。现象可以参考下面这个gif: blink 可以发现:

  1. 尝试输入单个字母时,总会闪烁几次
  2. 输入name. 前缀时,也先显示了一个关键字的补齐列表,然后再被有语义的补齐对象覆盖

感觉是每次输入都导致了补齐内容更新了多次造成的,这一块儿有什么好的改进措施或者使用建议吗?希望编辑器的补齐效果能够更加平稳一些,能够达到vs code的那种体验

这是太快的原因,emacs 的frame没法做到不闪烁

Archlinux 使用paru安装了 python-epc,并且 python 中可以直接 import。但是在 Emacs 中却提示找不到 epc 可能是什么原因呢?我使用 doomemacs

感谢回复,关于前面提到的第二个问题再请教一下:当我输入 name. 时,可以看到acm显示闪现了一个关键字的补全list,然后一闪而过再是name这个类型对应的方法,这里可以有办法取消掉第一个list的内容吗?因为用户已经输入了name. ,显示有语义的提示应该就好了

因为lsp-bridge快到,你每个字符的补全它都可以计算。

我暂时没有想到怎么解决这个问题。

请看readme写的安装方式。

问题找到了,我有 pypy3 和 python3,而 lsp-bridge 默认找 pypy3 而不是 python3。因此我把 pypy3 删除然后再重启就好了

1 个赞

今天写了点东西,发现以下情况:

  1. jdtls 当前版本在响应 textDocument/hover时格式有点奇葩
{
   "contents": [
     {
        "language": "java",
        "value": "org.springframework.boot.SpringBootApplication"
     },
     "Class that can be used to bootstrap ....."
   ]
}

导致解析时进入到增加 text block的代码片段,那么 show/popup doc 都显示不正常。

  1. rust-analyzer textDocument/hover 响应了plaintext, 导致 show/popup doc 都显示不正常, 但可以通过配置language-server表明ClientCapabilities支持markdown修复。

我认为问题1时jdtls的问题,不太应该算作lsp-bridge的问题,所以修复的代码有点monkey hack的感觉,就没有发补丁了,如果过些时间jdtls修复了,lsp-bridge是不用修改的。

From c46061b01f2aee5441f3556d3cd7c23e30775de7 Mon Sep 17 00:00:00 2001
From: Zhou Peng <[email protected]>
Date: Wed, 31 Jan 2024 19:51:54 +0800
Subject: [PATCH] Fix jdtls, rust-analyzer documentation issues.

current jdtls lsp server textDocument/hover request response is messy
{
   "contents": [
     {
        "language": "java",
        "value": "org.springframework.boot.SpringBootApplication"
     },
     "Class that can be used to bootstrap ....."
   ]
}

jdtls and rust-analyzer requires client capabilities cocnfiguration to
request sever to respond "markdown" format content.
---
 core/handler/hover.py         | 14 ++++++++++++--
 langserver/jdtls.json         |  7 +++++++
 langserver/rust-analyzer.json |  7 +++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/core/handler/hover.py b/core/handler/hover.py
index 98efc62..2339525 100644
--- a/core/handler/hover.py
+++ b/core/handler/hover.py
@@ -35,9 +35,19 @@ class Hover(Handler):
             elif "language" in contents:
                 render_strings.append(make_code_block(contents["language"], contents["value"]))
         elif content_type == list:
+            language = ""
             for item in contents:
-                if item != "":
-                    self.parse_hover_contents(item, render_strings)
+                if type(item) == dict:
+                    language = item["language"]
+                    val = item["value"]
+                    if type(val) == str and val != "":
+                        render_strings.append("```java\n{content}\n```".format(content=val))
+                if type(item) == str:
+                    if item != "":
+                        if language == "java":
+                            render_strings.append(item)
+                        else:
+                            self.parse_hover_contents(item, render_strings)
         return "\n".join(render_strings)
 
     def process_response(self, response: dict) -> None:
diff --git a/langserver/jdtls.json b/langserver/jdtls.json
index 5f0ddea..5fd7b2c 100644
--- a/langserver/jdtls.json
+++ b/langserver/jdtls.json
@@ -5,6 +5,13 @@
     "jdtls"
   ],
   "settings": {},
+  "capabilities": {
+    "textDocument": {
+      "hover": {
+        "contentFormat": ["markdown"]
+      }
+    }
+  },
   "initializationOptions": {
     "settings": {
       "java": {
diff --git a/langserver/rust-analyzer.json b/langserver/rust-analyzer.json
index 3f2d920..f2cd6cb 100644
--- a/langserver/rust-analyzer.json
+++ b/langserver/rust-analyzer.json
@@ -3,6 +3,13 @@
   "languageId": "rust",
   "command": ["rust-analyzer"],
   "settings": {},
+  "capabilities": {
+    "textDocument": {
+      "hover": {
+        "contentFormat": ["markdown"]
+      }
+    }
+  },
   "initializationOptions": {
     "enableExperimental": false,
     "diagnostics": {
-- 
2.43.0


大佬,可以发补丁

lsp-bridge这边做兼容没问题的。

使用tramp的 访问文件/sudo:root@localhost:/etc/environment 报错 or: Wrong type argument: lsp-bridge-epc-manager, nil

在lsp-bridge开启时,若我一直按住C-n/C-p移动光标时,会时不时卡几下是什么原因呢?

emacs -Q 对比测试

如何设置才能让lsp-bridge支持racket的racket-langserver ?

点开我发送的连接

racket-langserver.json 文件是否可以修改成如下?

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