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

花了几天时间写了一个基于 ripgrep 的代码搜索和重构工具: GitHub - manateelazycat/color-rg: Search and refactoring tool based on ripgrep.

color-rg 的功能和 color-moccur 是一样的, 只不过是基于 ripgrep 而不是 grep, 最明显的提升是, 搜索整个目录下的文件简直快到飞起.

使用方法很简单, 绑定按键到下面几个函数:

color-rg-search-input
color-rg-search-symbol
color-rg-search-project
color-rg-search-project-rails

浏览模式按键如下:

按键 按键说明
C-a 跳到当前行第一个可编辑字符
j 跳到下一个匹配行
k 跳到上一个匹配行
h 跳到下一个匹配文件
l 跳到上一个匹配文件
RET 打开匹配行关联的文件
r 全局替换
f 保留搜索结果中匹配正则的行
F 删除搜索结果中匹配正则的行
D 从搜索结果中删除当前行
s 用新的关键词搜索
d 在新的目录搜索
e 进入编辑模式
i 重新搜索, 包括 ignore 文件
c 重新搜索, 区分大小写
t 重新搜索, 不适用正则
m 重新搜索, 使用自定义参数
q 退出

编辑模式按键如下:

按键 按键说明
C-a 跳到当前行第一个可编辑字符
C-c C-j 跳到下一个匹配行
C-c C-k 跳到上一个匹配行
C-c C-h 跳到下一个匹配文件
C-c C-l 跳到上一个匹配文件
C-c C-RET 打开匹配行关联的文件
C-c C-d 删除当前行
C-c C-r 恢复当前行
C-c C-q 退出
C-c C-c 应用修改到文件
23 个赞

赞,希望早日可以提交到melpa里

不想学习的我去看了一眼use-package能不能用在这里,结果是可以把straight.el嵌入use-package来用 还是要学

更新了20几个commit, 应该小问题都修复了, 可以稳定使用了.

已经有这样的项目了,不过我个人都不喜欢这种基于搜索工具的模糊搜索的搜索/跳转工具,我更加倾向于基于语义的跳转, 因为基于正则表达式的搜索/跳转 基本是靠猜的.

我这个主要用于重构.

BTW, dumb-jump 这货还是不错的, 比如 rails 跳转就很准, 但是 elisp 不准, 我写了一个 EmacsWiki: find-define.el 来解决 dumb-jump 在 elisp mode 不准的问题.

1 个赞

elisp 跳转我习惯用的是 xref-find-definitions, 感觉还不错.

我的 EmacsWiki: find-func-extension.el 可以智能识别函数, 变量, face

Add function color-rg-filter-results · manateelazycat/color-rg@f6ee364 · GitHub 加了个函数 color-rg-filter-results 可以对搜索结果进行正则表达式过滤, 所以不匹配的行都会从搜索结果中删除, 当然你可以递归过滤, 直到过滤到你想重构的行.

Add new functions: color-rg-filter-match-results, · manateelazycat/color-rg@dac5c5d · GitHub 添加了三个函数 color-rg-filter-match-results, color-rg-filter-mismatch-results, color-rg-remove-line-from-results

现在可以对搜索结果进行正则保留, 正则删除, 单行删除.

这三个函数可以递归对搜索结果进行过滤, 达到快速重构的目的

进入编辑模式修改后,浅色主题的修改部分的字体颜色是白色,看不清

希望也能支持evil~

自己自定义主题吧

不用evil

最新版加了 color-rg-filter-match-files 和 color-rg-filter-mismatch-files 两个函数.

文件跳转的时候, 也会对匹配行闪一下, 方便搜索的时候查看.

可以写一个evil state

Switch to literal search automaticity when parsing keyword regexp fai… · manateelazycat/color-rg@41f931a · GitHub 今天加了个补丁, 默认正则搜索, 正则搜索失败后会自动启用 literal 搜索, 不用看到错误后手动切换.

搜索结果buffer的一个限制是,syntax table不能跟对应文件的buffer保持一致,因为会搜索不同类型的文件。这样,在搜索结果buffer里就不方便针对symbol进行操作,只能进行一些简单低级的操作

没看懂你说的啥, 来个截图?

就是正则表达式里的symbol,有的mode比如c,下划线是symbol的一部分,有的mode比如org-mode,下划线不是symbol的一部分,两种都出现在搜索结果里,操作就不方便了