在Emacs中写代码的时候,经常须要查找一个函数、方法,或者变量的定义。若是是正在写Common Lisp,那么SLIME已经配置好了相应的快捷键M-.
,只须要将光标移动到要查看的函数、方法,或者变量的名字上,按下M-.
即可以跳转过去——再按一下M-,
还能回到原来的位置。css
若是是写其它语言的代码,不少时候都没办法方便地跳转过去,这时候就须要依赖于文本搜索了,这也是本篇所要讲述的主题。node
一般状况下,用C-s
和C-r
就足够了——一个负责“往下”搜索一个负责“往上”搜索。尤为在安装了Emacs的插件swiper以后,只需使用C-s
即可以同时查看到上下两个方向的匹配文本。git
但C-s
也有其局限性。例如,它不能跨文件搜索,若是要查看的函数、方法,或者变量的定义不在当前buffer中,就不得不手动在多个buffer间切换并频繁按下C-s
了。github
有多种办法能够解决上面这种问题。例如,能够用Emacs的projectile-ag
。一般,若是代码散布在多个源文件中,那么它们多半是放在一个项目中——好比一个Git仓库。打开位于项目中的文件时,Emacs的projectile-mode
就会启动。此时,按下C-c C-p s s
这套组合键,会调用projectile-ag
函数。projectile-ag
会在minibuffer中等候输入要搜索的内容,按下回车后,Emacs会调用命令行工具ag来搜索这个项目下的全部文件,找出匹配关键字的行并显示。正则表达式
projectile-ag
函数会打开另外一个buffer来展现搜索结果,一个示例以下shell
ag --literal --group --line-number --column --color --color-match 30\;43 --color-path 1\;32 --smart-case --stats -- emacs . 0 matches 0 files contained matches 36 files searched 111365 bytes searched 0.007795 seconds
使用projectile-ag
的前提是要搜索的文件都在同一个一个项目中,但并不是全部时候都知足这个要求。这时,能够用Emacs的find-grep
函数。函数
find-grep
函数调起后一样要求使用者在minibuffer输入内容,但它更原始一点工具
光标会定位在-e
选项以后,须要填补交给grep
的正则表达式。因为minibuffer中给出的是完整的、将会被运行的命令,所以能够也给find
命令添加一些选项和参数,来改变搜索行为。spa
若是是在一个Node.js项目中搜索,通常还要让find
忽略一些文件,如node_modules目录下的大量依赖,或者构建产生出来的.css和.js文件。这些文件中的行不只极可能会命中输入的正则表达式,还很可能成片地出现,占据搜索结果中的半壁江山。.net
除了grep
以外,还有许多命令行的文本搜索工具,例如ack
和rg
,而且它们都称本身更快。要在Emacs中使用它们也很简单,尤为是后者还有相应的插件rg.el
能够方便调起。
若是常常要控制find
来忽略node_modules,能够考虑用git-grep
。man git-grep
中说到,它只会搜索tracked的文件
node_modules通常都不会被git跟踪,天然也就不会被搜索。
全文完
【阅读原文】