所有文章

emacs使用自定义grep-find模板

被emacs的搜索功能纠结好久了,今天下定决心来解决一下。以前执行grep-find命令的时候查找的模板都是find . -type f -exec grep -nH -e {} +,但是这条命令在fish下没法用,找了一下发现在这个issue里面作者提到了为什么fish里面没法用find,因为在fish里面{}是有意义的,所以就会提示exec缺少参数,所以如果写成find . -type f -exec grep -nH -e '{}' +就可以了,接下来的任务就是修改emacs的配置,把默认的grep-find的行为改掉。

因为查找功能是emacs默认就有的,所以我直接就去源代码目录找了,在/usr/share/emacs/24.4/下执行grep 'grep-find' -R *,然后在lisp/ldefs-boot.ellisp/loaddefs.el找到了相关的代码,然后试着修改第12669行,这行看起来像是相关的代码,结果改完了半天不生效,无奈之下去stackoverflow提问,这个网站效率真的不是一般的高,很快就拿到答案了,有人说我找到的代码只不过是docstring而已,要修改的话得改grep-find-template,通过C-h v查看了一下这个变量的值,默认的是"find . <X> -type f <F> -exec grep <C> -nH -e <R> {} +",修改它就行了,编辑~/.emacs.d/personal/custom.el,在最底下加上(setq grep-find-template "find . <X> -type f <F> -exec grep <C> -nH -e <R> \'{}\' +"),然后eval-buffer,问题完美解决,不得不说emacs真是灵活,不用改源代码就能实现自定义功能。

后面又修改了find-grep-dired的模板,好像这条命令没有模板,所以我直接改的代码,/usr/share/emacs/24.4/lisp/find-dired.el.gz编辑第278行,把{}转义了。