Search File for Source Code
免費、開源(MIT)的 Find In Files 擴充套件。在狀態列加一顆 Find 按鈕,點下去開啟 Find In Files 對話框。對話框的欄位與選項會組成 grep 指令,搜尋結果輸出到「Find In Files」終端機。按住 Ctrl 點擊 路徑:行號 就會開啟檔案並跳到該行。
需求
- Windows。不需要另外安裝 Git:套件內建 grep,找不到可用的 grep 時會自動改用內建的。
使用的 grep
啟動時會依照下面的順序找 grep,每個候選都會先實際跑一次測試搜尋,通過才使用:
- 設定
findInFiles.grepPath
- Git for Windows 的
usr\bin\grep.exe(從登錄檔、預設安裝路徑、scoop、PATH 上 git.exe 的位置尋找)
- 套件內建的
bin\grep.exe(取自 Git for Windows,授權說明見 bin\NOTICE.txt)
- PATH 上其他的
grep.exe
都不能用時,狀態列按鈕會變成 ⚠ Find。
終端機的 grep 指令
PATH 找不到 grep 時,會把套件內建的 grep 加到 Kiro 終端機的 PATH,讓終端機可以直接打 grep。這個做法只影響 Kiro 開的終端機,不會改執行原則,也不會改 PowerShell profile。新開的終端機才會生效。不想要的話,把 findInFiles.terminalGrep 設成 false。
檢查 grep 設定
在 Command Palette 執行 Find: 檢查 grep 設定,會重新偵測,並把結果寫到「Find In Files」輸出視窗:
- 搜尋用的是哪一支 grep、版本、來源,以及每個候選失敗的原因
- Kiro 終端機的 grep 設定狀態
- PowerShell profile 裡的
Set-Alias grep ... 是否指向不存在的檔案。如果有,可以一鍵修正:有 Git for Windows 就改指向它,沒有就停用該行。修正前會先備份成 .find-in-files.bak。
使用
- 點左下角狀態列的
Find,或在 Command Palette 執行 Find: Find In Files (grep)。
- Find 欄位預設帶入目前選取的文字或游標所在的單字。
- File types 用
; 分隔,例如 *.sdl;*.c;*.h;*.* 或留空代表全部檔案。大小寫不同的副檔名(*.sdl / *.SDL)都會搜尋到。
- In 可以填多個資料夾,用
; 分隔;... 開啟資料夾選擇視窗。
- Enter 執行搜尋,Esc 關閉對話框;在欄位按 ↓ 可叫出歷史紀錄。
- 搜尋中在結果終端機按 Ctrl+C 可取消。
選項對應的 grep 參數
| 選項 |
grep 參數 |
| Match whole word only |
-w |
| Match case |
不勾時加 -i |
| Wildcard search |
* ? 轉成 -E 的 .* . |
| Regular expressions |
-E |
| 其他情況 |
-F(純文字) |
| Look in subfolders |
-r,File types 轉成 --include |
| Exclude files and folders |
--exclude / --exclude-dir(結尾加 \ 只排除資料夾) |
| List matching file names only |
-l |
固定會加 -I(略過 binary 檔)與 -s(不顯示無法讀取的檔案錯誤),並以 LC_ALL=C 執行,讓含 Big5 等非 UTF-8 內容的檔案也能正常顯示比對到的行。
UTF-16 檔案(.uni 等)
grep 以位元組比對,UTF-16 檔案(EDK II 的 .uni 大多是這種格式)裡每個 ASCII 字元後面都夾著 00,而且會被 -I 當成 binary 跳過,所以單靠 grep 永遠找不到。搜尋時會多跑一輪 grep -l -a,找出含 NUL 位元組的檔案,再依檔頭(BOM 或 00 的分布)判斷是否為 UTF-16LE / UTF-16BE,是的話解碼後逐行比對:
- 結果格式與 grep 相同,接在 grep 的結果後面,一樣可以 Ctrl+點擊跳到該行。
- 選項(大小寫、整個單字、Wildcard、正規表示式、只列檔名)比照 grep 的行為;正規表示式以 JavaScript 解讀,常用的
[[:alpha:]] 這類 POSIX 字元類別與 \< \> 會自動轉換。
- 有搜到 UTF-16 檔案時,結尾的統計會註明搜尋了幾個 UTF-16 檔案。
設定
findInFiles.grepPath:grep.exe 的完整路徑;留空自動尋找。
findInFiles.terminalGrep:PATH 找不到 grep 時,是否把內建 grep 加到 Kiro 終端機的 PATH(預設 true)。
重新打包
bin\ 需要有 grep.exe、msys-2.0.dll、msys-iconv-2.dll、msys-intl-8.dll、msys-pcre-1.dll(從 C:\Program Files\Git\usr\bin 複製)。
powershell -NoProfile -ExecutionPolicy Bypass -File .\build-vsix.ps1
kiro --install-extension .\search-file-for-source-code-0.2.2.vsix --force
授權
本套件免費使用,程式碼以 MIT 授權釋出,見 LICENSE.txt。bin\ 內建的 grep 與 msys DLL 取自 Git for Windows,未經修改,各自沿用原本的授權(GPL / LGPL / BSD),原始碼取得方式見 bin\NOTICE.txt。