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

要不要把acm拆出去作为一个单独的包维护?

是不是没有在main.rs里面引用这些文件?

lsp-bridge 不管这些吧, 自己配置工具可以用梯子或者用国内镜像吧, lsp-bridge 不能管太多。

没有必要啊, acm + lsp-bridge 威力才大, acm 本身只提供绘制功能, 不提供补全功能,和在一起好用, 用户安装了 lsp-bridge 就是开箱即用, 我不想拆开以后, 用户还要折腾两个包。

以前那些补全方案,要折腾一堆安装包, 多麻烦。

2 个赞

引用过了哦 。。。
你们的不会出问题吗?

dabbrev 对于非语义的补全非常方便,但是 dabbrev 的算法性能非常差,特别是当它搜索所有 buffer 并提取单词的时候非常耗性能, 再加上当前输入的关键字和所有单词做对比性能就更慢了,甚至会卡手。

今天实现了一个新的后端 acm-backend-search-words, 用来替换 acm-backend-dabbrev, acm-backend-search-words 后端的原理是, Emacs告诉 Python 进程哪些文件被打开了, Python 进程就开一个子线程在后台计算每个文件的单词, 并对提取的单词进行清洗、去重和排序。

当我们在Emacs输入字符时, acm-backend-search-words 会开启一个新的线程用于对比输入字符和所有单词, 只把匹配的单词返回给 Emacs 来实现 dabbrev 同等功能。

相对于 dabbrev 的优势主要有两点:

  1. 实时性能, 实时补全不卡Emacs
  2. 针对 foo-bar-new 的情况, 如果搜索不到 foo-bar-* 开头的单词, 会把 foo-bar-new 拆开, 针对 new 进行二次搜索, 特别方便你要创建新变量同时变量最后一个单词其实存在于Emacs的情况

再也不用 dabbrev-expand 按到手抽筋了, acm-backend-search-words 对于写 elisp 代码超级爽。

6 个赞

我在Windows下,在python-mode 中打开lsp-bridge 会出现类似如下错误:

E:\Python39\python.exe .\testsubprocess.py
path: ['C:\Users\wcq\Desktop', 'E:\Python39\python39.zip', 'E:\Python39\DLLs', 'E:\Python39\lib', 'E:\Python39', 'E:\Python39\lib\site-packages', 'C:\Users\wcq\AppData\Roaming\npm']
Traceback (most recent call last):
File "C:\Users\wcq\Desktop\testsubprocess.py", line 20, in
subprocess.Popen(['pyright-langserver', '--stdio'], bufsize=DEFAULT_BUFFER_SIZE, stdin=PIPE, stdout=PIPE, stderr=stderr)
File "E:\Python39\lib\subprocess.py", line 951, in init
self._execute_child(args, executable, preexec_fn, close_fds,
File "E:\Python39\lib\subprocess.py", line 1420, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 系统找不到指定的文件。

subprocess.Popen(['pyright-langserver', '--stdio'], bufsize=DEFAULT_BUFFER_SIZE, stdin=PIPE, stdout=PIPE, stderr=stderr)

改成

subprocess.Popen(['pyright-langserver', '--stdio'], bufsize=DEFAULT_BUFFER_SIZE, stdin=PIPE, stdout=PIPE, stderr=stderr, shell=True)

就好了, 我专门把这个函数放到一个单独的文件中, 分别在 cmd.exe , powershell, msys2, 还有emacs 安装路径下的 cmdproxy.exe 去跑这个文件, 无一例外都报错了。 我的环境:

Anaconda 安装的Python3.8

官网下载安装包安装的Python3.9

msys2 下 pacman 安装的Python3.9

npm 安装的pyright (npm -g install pyright)

想请教一下各位Windows大佬,有没有遇到过这样的问题? 是怎么解决的?

这个我发现只要不事先打开main.rs补全就不能打开,卡在那个

大家都这样吗?

pip install pyright 可解,或者把 pyright.json 拷贝成 pyright_windows.json 里面 pyright-langserver 改成 pyright-langserver.cmd

Windows是不是一定要用 pyright-langserver.cmd ? 可以内置对 Windows pyright 的支持。

完全按照 readme, 用 pip install pyright 是没问题的,只有 npm 装的 pyright 才需要改成 cmd

在 Windows系统中,通过npm安装的server一般都需要加 .cmd,例如:volar 对应的是 vue-language-server.cmd

另外,在Windows系统中,volar的配置中必须设置"serverPath"。

例如:“serverPath”: “x:/xx/xx/node_modules/typescript/lib/tsserverlibrary.js”

所以是不是加个try except 就可以兼容windows下npm安装的server了?

不是呀,你这种属于不同操作系统的路径问题, lsp-bridge 已经有机制支持多种操作系统的路径:

其实你的问题是需要找到 Windows 的路径以后,添加一个 pyright_windows.json 文件, 而不是在代码中 try/catch, 那如果 mac 是不同的路径, 代码就会一团糟。

如果在 Windows 中使用volar,可以在lsp-bridge的langserver目录中增加volar_windows.json文件,并且可以通过次文件对volar进行定制。serverPath根据自己电脑上的typescript路径调整。

{
  "name": "volar",
  "languageId": "vue",
  "command": ["vue-language-server.cmd", "--stdio"],
  "settings": {},
  "initializationOptions": {
    "typescript": {
      "serverPath": "x:/xx/xx/node_modules/typescript/lib/tsserverlibrary.js"
    },
    "languageFeatures": {
      "references": true,
      "implementation": true,
      "definition": true,
      "typeDefinition": true,
      "callHierarchy": true,
      "hover": true,
      "rename": true,
      "renameFileRefactoring": true,
      "signatureHelp": true,
      "codeAction": true,
      "workspaceSymbol": true,
      "completion": {
        "defaultTagNameCase": "",
        "defaultAttrNameCase": "",
        "getDocumentNameCasesRequest": false,
        "getDocumentSelectionRequest": false
      },
      "schemaRequestService": {
        "getDocumentContentRequest": false
      }
    },
    "documentFeatures": {
      "selectionRange": true,
      "foldingRange": true,
      "linkedEditingRange": true,
      "documentSymbol": true,
      "documentColor": true,
      "documentFormatting": {
        "defaultPrintWidth": 100,
        "getDocumentPrintWidthRequest": false
      }
    }
  }
}

你的问题是不是 pyright-langserver.cmd 可以找到,但是 pyright-langserver 找不到?

主要 pip 安装的 pyright 会包装一个 pyright-langserver.exe, 没有 .cmd, 但是 npm 装的, 是 pyright-langserver.cmd, 没有 .exe, 所以我觉得可能最多在 readme 加个说明就够了。

是的,windows 下npm安装的 pyright-langserver 是脚本文件,需要用shell去跑, subprocess.Popen默认不要shell去跑

好的,谢谢!

你试一下这段代码, 可以我就推送:

        if get_os_name() == "windows":
            server_command = self.server_info["command"][0]
            if not shutil.which(server_command) and shutil.which(server_command + ".cmd"):
                self.server_info["command"] = [server_command + ".cmd"] + self.server_info["command"][1:]
        
        self.p = subprocess.Popen(self.server_info["command"], bufsize=DEFAULT_BUFFER_SIZE, stdin=PIPE, stdout=PIPE, stderr=stderr)