请教:counsel-rg中输入太快会导致emacs卡死

用了以下配置,还是卡死了。emacs-26.2-x86_64测试了也会卡死。emacs -Q后:

(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/ivy-20200424.1054/")
(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/swiper-20200319.1334/")
(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/counsel-20200422.1208/")
(package-initialize)
(require 'ivy)
(require 'swiper)
(require 'counsel)

安装包的方法不一样吧,用elpa的方法安装的包在(package-initialize)之后就有counsel-rg等命令不用在require了(要在原elpa安装包的目录下),elpa安装的包在~/.emacs.d/elpa/ 目录

你是不是改了HOME路径,emacs在win的HOME路径C:\Users\用户名\AppData\Roaming\,我原来用(setenv "HOME" "d:/123/")改过,后来出问题就没改了,还是用默认的HOME路径

HOME路径写在注册表里。

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GNU\Emacs] “HOME”=“f:\emacs”

现在直接没用 (package-initialize), 还是卡死。

(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/ivy-20200424.1054/")
(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/swiper-20200319.1334/")
(add-to-list 'load-path "F:/emacs/.emacs.d/elpa--test-smartparens/27.0.60/counsel-20200422.1208/")
(require 'ivy)
(require 'swiper)
(require 'counsel)
(getenv "HOME")
"f:\\emacs"

我把注册表的HOME删除了,还是有卡: (getenv “HOME”) “C:\Users\hh\AppData\Roaming” 在spacemacs时我用helm-ag,命令用的rg。没出现卡死问题。应该就是counsel-rg在windows下问题了。

奇怪为什么CTRL-g不能结束命令呢?

可以用 counsel-etags-grep, 来自于counsel-etags,如果有rg就用rg,没有就用grep、

当时我给 counsel/ivy 提了两个方案,第一个方案没被采纳,虽然我认为是上策。此方案用在我自己的插件counsel-etags里了。

第二个方案见 use timer to improve the ivy-read performance · Issue #1218 · abo-abo/swiper · GitHubivy-dynamic-exhibit-delay-ms 解决了这个问题。但是我认为是中策

谢谢。请问把emacs搞得C-g也不起作用会是什么原因?

第二种方案的确不好。所有ivy查询命令均受影响,上下移动的C-n,C-p都慢了,不只是需要async等外部进程的慢了。

aboabo说他不用windows。大神能不能教两招怎么调试这种直接卡死emacs的方法?我看他那个函数是异步调用的。在哪卡住也无法定位。windows真是坑,但只能用它。

windows图形界面emacs卡死我也常遇到,C-g或去任务管理器看emacs下的子进程把它结束,还不行就只能重启了,如果在终端下用emacs会不会更好些,卡死的情况更少,好多大神都用的终端,我没在终端下用主要是因为输入法的问题

1 个赞

只有降低启动process的频率。如果有更完美的方案我也不写counsel-etags-grep了。反正grep,代码导航,代码自动完成,文件查找,我都是使用自己的插件。也针对Window优化了。在任何平台上速度都是秒杀其他编辑器和IDE。

所以最好方案就是和我使用同样的插件,抄我的配置,我已对Windows进行优化了,

  • counsel-etags , grep 代码导航
  • find-file-in-project , 找文件
  • company-ctags , 代码自动完成
  • wucuo , flyspell加强

我对插件的态度就是把它们当作api的集合。ivy/counsel对我来说无非就是提供了ivy-readoccur等API而已。

好的,谢谢你。单纯的grep用起来不是太方便。我的需求是用counsel可以实时根据查询条件,更新查询结果。不知道你的配置有没有把ounsel-etags-grep和更新查询结果结合?我去学习下。

降低启动process的频率,我的情况不是这样,是emacs的子进程启动的有点多(apache,nginx,swoole都被我在emacs下启动),但因为子进程导致emacs卡死的情况却很少,大多都是因为elisp的问题,比如说,我原来想用elisp写个定时器,然后调试的时候把emacs卡死好几回,然后就不敢用elisp写了,老老实实用js和php写,然后在emacs开个子进程调用,启动后就不停止,这样少写elisp反倒能减少卡死emacs的情况 :joy:

1 个赞

请问你的配置提交到github了吗,按你名字搜索没搜到,学习下,我工作环境只能windows。

你是在命令行用吗?我机器4core 3.6Ghz, 8G内存,你的配置启动要9s。doom要6s。我看你的ivy-dynamic-exhibit-delay-ms也是设置为250,C-n,C-p也是卡顿的感觉。能否说明下你的第一种方案主要的地方?

我的想法是只有在“输入框”中输入一些条件后,稍作停顿后(delay-ms),才创建查询的进程。现在好像是输入内容一有改变,就创建,然后又KILL掉,大量创建进程。在windows下就容易卡死。昨天我调试了下。大概是用start-file-process-shell-command创建了进程后,set-process-sentinel设置守护进程时有时卡死。

手册上说:

Quitting is normally inhibited within a sentinel—otherwise, the effect of typing ‘C-g’ at command level or to quit a user command would be unpredictable. If you want to permit quitting inside a sentinel, bind ‘inhibit-quit’ to ‘nil’. In most cases, the right way to do this is with the macro ‘with-local-quit’.

但我在sentinel里两种都试了,仍然不能用C-g结束。aboabo让检查下rg或者在cygwin里试,我试了最新的windows版本和gnu版本,不行。cygwin里试不太明白。

问题貌似难解决。emacs suppended when input(change) too quick in counsel-rg · Issue #2517 · abo-abo/swiper · GitHub

As an aside: I don’t know what other Unix-like shells are available on Windows, but perhaps it would be worth testing whether the issue happens with shells other than Bash.

这个不太明白怎么测试。

有人提了个PR,目前用起来没碰到卡死了。

2 个赞

我的配置没有提交到github,主要是配置太乱了,自己都理不清楚,有些配置是写在…el.org文件里,从org中取出elisp代码段生成el文件(又是用php写的生成el文件),有些又写在el文件,命名更是混乱,变量名这些就不说了,文件名都直接用中文加上数字1 2 3 4 5编号,可能有点参考价值的,比如我的按键绑定设置等 都发论坛了

截个图,