查詢檔案、跟隨符號、核對原始碼引用
什麼時候用找檔案、全文搜尋或語言服務導覽,以及結果缺失時該檢查什麼。
知道檔案大概在哪,用Go to File;知道它寫了什麼,用全文搜尋;想沿著符號往下讀,用語言服務導覽。三種方式換著用,通常比反覆修改一個寬泛的搜尋詞更快。
選對搜尋方式
| 已知線索 | 用什麼 | 例子 |
|---|---|---|
| 檔名或路徑的一部分 | Command-P(Go to File…) | SettingsStore、src/config |
| 一段訊息、設定名或程式碼片段 | 檔案欄裡的Search All Files | 完整的錯誤訊息、設定 key |
| 目前檔案裡的某個符號 | Go to Definition、Find References | 函式的實作、呼叫方 |
找檔案只匹配檔名和路徑,不搜檔案內容。要找程式列印的錯誤訊息,就用全文搜尋,而且儘量搜有辨識度的字串,別搜 data、result 這種詞。
檔案或結果找不到時,先看專案根目錄對不對,再看隱藏檔案和被 Git 忽略的檔案有沒有顯示。預設值在Settings → General → Files裡,同時作用於檔案欄、找檔案和全文搜尋;每個專案還可以在檔案欄的狀態列裡單獨調整。
從錯誤訊息找到觸發它的分支
錯誤訊息能提供一個起點,但列印它的那一行,也可能只是在包裝別處傳來的失敗。
- 搜固定的部分。 點檔案欄的放大鏡開啟Search All Files,去掉執行階段插入的時間戳、請求 ID 和路徑。先關閉Regex和Whole word;不確定大小寫時,在 Aa 選單裡選Ignore。
- 檢查搜尋範圍。 開啟Filters,先清掉上次留下的目錄或檔案匹配規則,再擴大搜尋。確定大概在哪個模組後,可以縮小目錄,或用
*.rs這樣的規則限定檔案。出現Best matches提示,說明清單不完整;先縮小搜尋,再判斷某個位置是否沒有匹配。 - 讀匹配位置的上下文。 開啟結果,找到走到這裡的條件。這條訊息是在這裡建立的,還是 catch 或日誌層給另一個錯誤補充了上下文?如果是後者,繼續追那個失敗的操作。
- 往回追輸入。 找包含這段邏輯的函式由誰呼叫,以及哪個值選中了這個分支。語言伺服器支援時用Find References;否則搜尋函式名、設定名,再逐處核對使用位置的上下文。
- 核對解釋。 用已有的針對性測試,或同一程式碼版本的執行日誌,對照推測的輸入和分支。記清證據確認了什麼、還有什麼沒確認;只找到錯誤文字,還不能確定原因。
全文搜尋針對目前工作區,也包括已開啟檔案中尚未儲存的文字,不會遍歷所有 Git 歷史版本。如果錯誤來自舊建置,先比較對應版本,再判斷目前原始碼能否解釋它。
語言伺服器
跳至定義、查詢引用、實作和呼叫層級,都由語言伺服器提供:
| 語言 | 伺服器 |
|---|---|
| Swift | SourceKit-LSP |
| Rust | rust-analyzer |
| C、C++、Objective-C、Objective-C++ | clangd |
| Python | Pyright |
| JavaScript、JSX、TypeScript、TSX | TypeScript Language Server |
| Go | gopls |
rust-analyzer 可以在Settings → Code Navigation裡由 Yenpo 安裝。SourceKit-LSP 和 clangd 來自目前選擇的 Xcode 工具鏈;Pyright、TypeScript Language Server 和 gopls 需要你自己安裝,並且能在 PATH 裡找到。不同伺服器支援的功能不一樣,有些專案還要額外設定,導覽才能正常工作。
確定存在的符號卻跳不過去時,檢查三件事:開啟的是不是專案根目錄,伺服器裝好了沒有,專案依賴和建置設定是否齊全。(沒有語言伺服器時,語法高亮也照樣正常。)
沒有語言伺服器,文字搜尋也能解決大部分問題:搜出宣告和使用位置,再根據型別和 import 區分同名符號。
跟著行為讀,別丟了起點
去別處看定義時,把最開始的檔案留在標籤頁裡。每遇到一個重要呼叫,記下輸入是什麼,以及由什麼決定下一步走哪條路:設定、型別、registry 裡的 key,還是目前狀態。
查詢引用顯示的是語言伺服器回傳的使用位置,不是執行軌跡。伺服器支援情況、專案設定和結果數量限制,都可能讓清單不完整。如果一個 registry 裡同時有本機和遠端兩種實作,要找到選中其中一個的那個值。遇到非同步呼叫,還要看結果回傳之前哪些狀態可能變了。
追一個設定值時,筆記可以這樣記:
命令行输入 → 配置选择 → 校验 → 请求构造
实际来源:环境变量覆盖
失败时:非法值在构造请求前就被拒绝
未确认:哪个父进程设置了这个环境变量
給真正核對過的步驟補上檔案和行號。設定追蹤案例用可執行的測試完整走了一遍。
核對 AI 回答裡的原始碼引用
點選 AI 回答中的原始碼引用,會在Quick Look裡開啟對應的幾行程式碼。片段太短看不明白時,點Open File在標籤頁裡開啟整個檔案。
依賴回答之前,先看看周圍的條件和呼叫方。比如一行刪除快取項目的程式碼,可能只有在項目仍屬於目前請求時才安全。引用告訴你該看哪裡,周圍的程式碼才決定結論站不站得住。
文件和歷史版本
Markdown 檔案預設以閱讀模式開啟,也可以切換到編輯原始碼。把 README 或測試放在實作旁邊對照著讀,兩者說法不一致時記下來。
Git 歷史版本的檔案可以和目前檔案同時開啟。跟隨引用或動手修改之前,先確認標籤頁顯示的是哪個版本:對舊提交的解釋,未必適用於你現在的程式碼。如何選擇版本,見比較提交與分支。