在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跟蹤,天然也就不會被搜索。
全文完
【閱讀原文】