一些在Emacs中搜索文本的方法

在Emacs中寫代碼的時候,常常需要查找一個函數、方法,或者變量的定義。如果是正在寫Common Lisp,那麼SLIME已經配置好了相應的快捷鍵M-.,只需要將光標移動到要查看的函數、方法,或者變量的名字上,按下M-.便可以跳轉過去——再按一下M-,還能回到原來的位置。

如果是寫其它語言的代碼,很多時候都沒辦法方便地跳轉過去,這時候就需要依賴於文本搜索了,這也是本篇所要講述的主題。

通常情況下,用C-sC-r就足夠了——一個負責“往下”搜索一個負責“往上”搜索。尤其在安裝了Emacs的插件swiper之後,只需使用C-s便可以同時查看到上下兩個方向的匹配文本。

C-s也有其侷限性。例如,它不能跨文件搜索,如果要查看的函數、方法,或者變量的定義不在當前buffer中,就不得不手動在多個buffer間切換並頻繁按下C-s了。

有多種辦法可以解決上面這種問題。例如,可以用Emacs的projectile-ag。通常,如果代碼散佈在多個源文件中,那麼它們多半是放在一個項目中——比如一個Git倉庫。打開位於項目中的文件時,Emacs的projectile-mode就會啓動。此時,按下C-c C-p s s這套組合鍵,會調用projectile-ag函數。projectile-ag會在minibuffer中等候輸入要搜索的內容,按下回車後,Emacs會調用命令行工具ag來搜索這個項目下的所有文件,找出匹配關鍵字的行並顯示。

projectile-ag函數會打開另一個buffer來展示搜索結果,一個示例如下

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命令添加一些選項和參數,來改變搜索行爲。

如果是在一個Node.js項目中搜索,一般還要讓find忽略一些文件,如node_modules目錄下的大量依賴,或者構建產生出來的.css和.js文件。這些文件中的行不僅很可能會命中輸入的正則表達式,還極可能成片地出現,佔據搜索結果中的半壁江山。

除了grep之外,還有許多命令行的文本搜索工具,例如ackrg,並且它們都稱自己更快。要在Emacs中使用它們也很簡單,尤其是後者還有相應的插件rg.el可以方便調起。

如果經常要控制find來忽略node_modules,可以考慮用git-grepman git-grep中說到,它只會搜索tracked的文件

git-grep的man文檔

node_modules一般都不會被git跟蹤,自然也就不會被搜索。

全文完

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章