基于 ripgrep 的代码搜索和重构工具

发到issue吧,我一会盲修一下

好的,好的,好的

在windows下用cmdproxy确实很讨厌。可是怎么才能让emacs在windows下使用其他的shell来处理命令呢?我试了修改shell-file-name到cygwin的bash,可是运行rg还是无法识别中文。但是bash下运行rg就是可以识别中文的。难道subprocess默认使用cmdproxy了吗? 谢谢

用win10吧, win7 都不维护了

是用的win10啊,有什么差别吗?默认的还是cmdproxy不是吗?

我的解决办法是用grep-mode,hi-lock-mode自己写一个简单的rg搜索前端,但代码写得有问题,不好意思放出来,平时自己都不想用,搜索英文还是用counsel-rg,必须要搜索中文时才用自己写的这个,rg可以搜索中文,是emacs的问题

Win10 开Unicode support秒解一切Emacs相关中文编码问题(代价是某些游戏可能会出现编码不兼容)

以前在ivy的issue区里长篇大论过这个问题,然而似乎没什么人有兴趣

1 个赞

各位道友,我为什么我win10使用color-rg,总是报错:wrong type argument:stringp,nil这个错误呢?谁能告诉我问题在哪里啊。我系统都重新安装了,之前确定是可以使用的,并且我使用counsel-rg都是可以正常搜索中英文的。

你的问题是 ripgrep 运行的时候编码错误,导致进程输出的字符串无法被Emacs正常分割,你需要研究一下为啥你的编码有问题。

我从来不用Windows,没法复现你说的问题。

现在我都没有更改编码了,直接就是windows默认的编码

不是迫不得已,谁也不会去用win :joy:

感谢 @manateelazycat@xhcoding 的中文搜索补丁,我更新测试了windows10搜索中文可行,系统本身是gbk时编码成gbk可以的,“\262\342\312\324”,这段不是乱码感觉没必要修正

color-rg-open-file 增加了一个可选的 stay 参数,以及增加了一个 color-rg-open-file-and-stay 函数,允许光标停留在刚刚打开的文件,就像 magit:

  • SPC 打开 diff 窗口,光标回 log 窗口。
  • RET 打开 diff 窗口,光标停留原地。

不知大家有没有同样的需求:

因为 color-rg-open-file 是一个内部函数,不光是RET按键,包括 color-rg-jump-next-keyword 和 color-rg-jump-prev-keyword 都会调用 color-rg-open-file

如果 color-rg-open-file-and-stay 只是临时在 color-rg buffer 里面调用一下,我觉得补丁可以直接合并到 color-rg.

如果默认就要停留在打开的文件,会导致跨文件查阅关键字的效率降低,这种行为要认真思考一下。

建议直接想好后直接提交PR,大家可以一起维护。

已提 PR。

magit 的情况跟你说的几乎一样。差别在于按键绑定,也正是考虑到按键对使用体验影响很大,所以我在 PR 里没有修改默认行为和按键绑定。

不过我还蛮赞同 magit 的按键定义。RET 表示更大的决心要进到 diff 窗口作长时间停留,SPC则是蜻蜓点水一样打开 diff 窗口立即返回 log 窗口继续操作。

1 个赞

谢谢,已经合并。 你说的挺有道理的,我已经把Return改成 color-rg-open-file-and-stay ,SPC改成 color-rg-open-file.

1 个赞

在我的win10,emacs26.3上做了尝试,发现这个方案不是特别完美; 第一是命令行中有乱码,这个就忍了 第二是搜索对于gbk编码的文件出结果时,对于utf8的文件就搜不出来了;在windows上用emacs的人,估计大部分都是两种编码文件都有的吧;我是在org中都是gbk,代码文件都是utf8,所以这种方式不适用于我;

想了一个办法,就是检查发起搜索的文件的编码属性,然后对rg的命令行增加编码选项,来适配不同编码格式的文件。这个方法有一个假设是搜索目录中的所有文件,都是统一的编码,否则也会出现乱码;好在我的文件在一个目录下基本上不出现混用的情况;

增加了一个函数: +(defun color-rg-buffer-add-encoding-param () (let ((sys (coding-system-plist buffer-file-coding-system))) (if (memq (plist-get sys :name) '(chinese-gbk)) “–encoding gbk” ;; (downcase (symbol-name (plist-get sys :name))) “” )))

然后在color-rg-build-command中,增加对这个函数的调用:

(let ((command-line (append

      (list (color-rg-buffer-add-encoding-param))

目前在我这里还算正常,欢迎大家一起试一试看看。

问题找到了,就是我的win10环境变量路径如果有空格的话,就会导致,emacs里面找不到对应的程序。还是感谢楼主的帮助。

我那个补丁只是保证 rg 这条命令能够正常的编码执行,并没有处理 rg 内部搜索用的编码。

还是统一编码吧,gbk感觉早晚要出问题,我测试了目录里面同时有gbk和utf-8两种编码搜索中文的情况,只能搜索出utf8的文件,然后用notepad+,vsc来搜索,也是一样的情况,不能两种编码混合搜索中文,其它编辑器也都这样,感觉就没必要去解决它