使用 lsp-pyright ,提示 too many open files, 大家有没有遇到过这种情况?

使用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 有小半年了,印象中没有遇到这个问题。

https://emacstalk.github.io/post/022/

经过一番探索,终于成功将这个最大文件打开数调大了。

2 个赞

赞!紫薯布丁

把这篇文章翻译成英文了,有用户评论到已经有个 branch 来解这个问题了,在下面这个分支上

看来文章还是要写英文的,这样得到的反馈会更有价值些🤔

3 个赞
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的所有细节。

1 个赞

微软的文档里面不是列了几点 server 监听的问题嘛,lsp-mode 其实也可以配置来 ignore 某些文件,可以一定程度上避免这个问题。

这个就不知道他的实现了,已经转向 eglot 好久了。。。

我的意思是事实上LSP server已经监听文件的变动,server不监听文件变动,补全和定义跳转怎么会有啊。

事实上,lsp client没有必要实现这个协议,微软也只是从多个语言的角度去说那几点,但是事实上lsp client没有实现也可以正常补全和定义跳转。