使用lsp-mode 和 lsp-pyright,启动lsp的时候读取了非常非常多的文件,然后显示如图,我尝试修改了系统文件数量限制,不好使而且我认为他打开这么多文件还没有关闭,本身应该是有问题的,想了解下大家有没有经验,是不是我的使用方式不对,还是有什么设置?
启动lsp时的 message
lsp-log
使用lsp-mode 和 lsp-pyright,启动lsp的时候读取了非常非常多的文件,然后显示如图,我尝试修改了系统文件数量限制,不好使而且我认为他打开这么多文件还没有关闭,本身应该是有问题的,想了解下大家有没有经验,是不是我的使用方式不对,还是有什么设置?
启动lsp时的 message
lsp-log
Emacs bug,很烦。最大打开文件好像是 macos 写死 1024 个,也不是写死,是编译 Emacs 的时候读的一个环境变量。
Linux 下应该是不用重新编译 Emacs 也可以调整的。
如果是你项目中有一些不需要加进去的(比如依赖文件 编译文件 等)被加进去了,那么可以设置 ignore 把这些文件忽略跟踪。
他打开这么多文件是为了跟踪文件变化,所以我想应该可以动态增加跟踪列表。不知道有啥更好解决方案没。
能定位到哪个文件吗, 经常遇到这个问题,很烦人。macos。
个人理解,为了跟踪变化,打开文件读取后,理论上应该关闭文件io吧,这看起来应该是一直在占用。还是有什么原因? 这个看起来就像是读取文件然后bug忘记了关掉io,然后累加造成的==!(盲猜,没有验证)
不是 bug 啊,监控变化是会占用文件描述符的,不是只有 IO 才会占用。
你搜搜那句报错,reddit 上有讨论。
嗯,可能是我不太懂,暂时先用回 python-lsp 了,他可能不是bug,但这么大的占用我总感觉不对==!
我是用lsp-pyright 有小半年了,印象中没有遇到这个问题。
赞!紫薯布丁
diff --git a/Formula/[email protected] b/Formula/[email protected]
index 87b9f0d..c25bb5c 100644
--- a/Formula/[email protected]
+++ b/Formula/[email protected]
@@ -114,6 +114,7 @@ class EmacsPlusAT29 < EmacsBase
args << "--with-native-compilation" if build.with? "native-comp"
ENV.append "CFLAGS", "-g -Og" if build.with? "debug"
+ ENV.append "CFLAGS", " -DFD_SETSIZE=10000 -DDARWIN_UNLIMITED_SELECT "
args <<
if build.with? "dbus"
我使用 homebrew-emacs-plusp安装emacs , 使用上面的补丁来实现
# cd /usr/local/Homebrew/Library/Taps/d12frosted/homebrew-emacs-plus/ ;git diff >~/.emacs.d/bin/emacs.patch
cd /usr/local/Homebrew/Library/Taps/d12frosted/homebrew-emacs-plus/
patch -t -N -p1 <~/.emacs.d/bin/emacs.patch
cd -
brew reinstall --with-native-comp --with-xwidgets emacs-plus@29
有精力的话,最好还是用上面的分支吧, configure 时加上 --with-poll
,看看有没有问题,尽早合到 master 版本。
我是打算 cherry pick 到 28 的最新 commit 试试。
lsp-mode要分析所有文件干嘛?这个问题不应该存在
代码跳转,补全都需要分析依赖吧,按说分析完可以关闭,但怎么区分哪些是源文件,哪些是依赖没有什么标准
并不需要,lsp client不需要监听所有文件,就能正常跳转和补全。
主要是这个 workspace/didChangeWatchedFiles
,下面是微软的文档
没有必要,事实是lsp server会自己监听文件变动的。
而且3.16协议其实通过打开,重命名和关闭协议就可以覆盖文件的新建,重命名和删除。
lsp-mode这种从实现和前端都模仿vscode,同时elisp性能不行,只会越来越卡。
我一直觉得emacs的lsp client要结合emacs的生态,把全键盘操作和流畅性能优势发挥出来,不要全盘抄vscode的所有细节。
微软的文档里面不是列了几点 server 监听的问题嘛,lsp-mode 其实也可以配置来 ignore 某些文件,可以一定程度上避免这个问题。
这个就不知道他的实现了,已经转向 eglot 好久了。。。
我的意思是事实上LSP server已经监听文件的变动,server不监听文件变动,补全和定义跳转怎么会有啊。
事实上,lsp client没有必要实现这个协议,微软也只是从多个语言的角度去说那几点,但是事实上lsp client没有实现也可以正常补全和定义跳转。