要不要把acm拆出去作为一个单独的包维护?
是不是没有在main.rs里面引用这些文件?
lsp-bridge 不管这些吧, 自己配置工具可以用梯子或者用国内镜像吧, lsp-bridge 不能管太多。
没有必要啊, acm + lsp-bridge 威力才大, acm 本身只提供绘制功能, 不提供补全功能,和在一起好用, 用户安装了 lsp-bridge 就是开箱即用, 我不想拆开以后, 用户还要折腾两个包。
以前那些补全方案,要折腾一堆安装包, 多麻烦。
引用过了哦 。。。
你们的不会出问题吗?
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 的优势主要有两点:
- 实时性能, 实时补全不卡Emacs
- 针对 foo-bar-new 的情况, 如果搜索不到 foo-bar-* 开头的单词, 会把 foo-bar-new 拆开, 针对 new 进行二次搜索, 特别方便你要创建新变量同时变量最后一个单词其实存在于Emacs的情况
再也不用 dabbrev-expand 按到手抽筋了, acm-backend-search-words 对于写 elisp 代码超级爽。
我在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大佬,有没有遇到过这样的问题? 是怎么解决的?
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)