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

现在我都没有更改编码了,直接就是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来搜索,也是一样的情况,不能两种编码混合搜索中文,其它编辑器也都这样,感觉就没必要去解决它

evil 的话,可以采用陈斌在一年里提的 git-timemachine 案例

;; https://emacs.stackexchange.com/a/10588/22102
(eval-after-load 'color-rg
  '(progn
     (evil-make-overriding-map color-rg-mode-map 'normal)
     ;; force update evil keymaps after git-timemachine-mode loaded
     (add-hook 'color-rg-mode-hook #'evil-normalize-keymaps)))

这样冲突的快捷键就以 color-rg 为主

1 个赞

在 替换的模式下,如果来点 这些替换快捷键提示 ,就更好了。

最新版顶部就有啊

不是这个提示,比如 按 r 进入替换后,再按 RET 开始替换, 现在就在提示: “ 按 y 或者 n 来表示是否替换当前行,按!替换所有。”

纯属小白个人建议

有计划支持preview feature吗?counsel-rg可以边输入边查看搜索结果,然后如果需要再打开buffer,这个功能挺实用的

snails

多谢!

提个意见,希望可以将每个backend的一些hardcode的prefix长度改成可以设置的变量。比方说这里https://github.com/manateelazycat/snails/blob/master/snails-backend-rg.el#L94。6个字符太长了。

然后麻烦再请教个问题, 目前是没有办法在snails下,将搜索的结果打开成为一个buffer吗?比方说ivy里C-c C-o就是ivy-occur。将snails rg 的结果直接打开成color-rg的buffer,应该蛮有用的。

你要的是ivy,直接用ivy吧

color-rg 和 snails 有自己的设计目标,不会什么都兼顾的

1 个赞

我的是win7,编码设置也比较奇怪,实测了magit,ORG,eshell后得出的:

(prefer-coding-system ‘utf-8)
(set-default 'process-coding-system-alist
             '(("[pP][lL][iI][nN][kK]" utf-8 . gbk-dos)
               ("[cC][mM][dD][pP][rR][oO][xX][yY]" utf-8 . gbk-dos)
               ("grep" utf-8 . gbk-dos)
               ("cmd" gbk-dos . gbk-dos)
               ("ag" utf-8-dos . gbk-dos)
               ("rg" utf-8-dos . gbk-dos)
               ("diff" utf-8-dos . gbk-dos)
               ("sdcv" utf-8 . gbk-dos)
               ("find" utf-8 . gbk-dos)))

在使用color-rg时编码也出现问题,要将下面这句注释掉才正常,应该是多加了一次编码。

(when (memq system-type '(cygwin windows-nt ms-dos))
     (setq command-line (encode-coding-string command-line locale-coding-system)))
1 个赞