Claude Code @ 引用完整教學:與其叫 AI 自己找檔案,不如把檔案拍在它桌上
終端機裡我打了一句「幫我看一下登入那段為什麼會噴 401」,Claude 開始 grep。第一次找到 auth.js,第二次跑去讀 authMiddleware,第三次翻 routes——三趟 tool call 過去,它讀的檔案沒一個是我心裡想的那個。我要它看的是 packages/mobile 底下那份,它一直在 web 那邊繞。
問題不在它笨。問題在我根本沒告訴它是哪個檔,只丟了一句「登入那段」,然後期待它通靈。
先講兩條死路
第一條:我自己複製。打開檔案、全選、貼進 prompt。兩百行 code 灌進終端機,畫面瞬間被洗版,而且我還得手動打字說明「這是 mobile 的 login.ts」。醜歸醜,至少它看到了。但下一個檔案呢?我要它比對 web 跟 mobile 兩份登入邏輯的差異,難道兩份都這樣貼?貼完 prompt 已經滑到看不到我最初問的問題。
第二條:叫它自己找。這條剛剛示範過了,它繞了三趟還找錯。每一趟 grep、每一次 read,都在燒 token、燒時間,最後燒出一個錯的檔案。
繞了一大圈才發現,我在做一件很蠢的事:我知道檔案在哪,卻硬要它去猜。這就像你明明手上拿著那份合約,卻叫同事去檔案室翻,翻半天翻錯一份回來——你氣他找不到,但一開始為什麼不直接把合約拍在他桌上?
@ 就是那張「拍在桌上」的動作
打一個 @,接檔名,Claude Code 會直接把那個檔案的完整內容塞進對話裡,不用它自己去找、去讀。官方文件寫得很直白:
1 | Explain the logic in @src/utils/auth.js |
這句的效果:
This includes the full content of the file in the conversation.(已驗證,官方 Common workflows)
差別在哪?沒有 @ 的時候,Claude 要先猜檔名、grep、read,三個 tool call 起跳,還可能猜錯。有 @ 的時候,檔案內容在你按 Enter 的那一刻就已經在它眼前了。省掉的不是打字,是「它自己找檔案」那一整趟來回。
那份卡我半天的 401,正確寫法其實是一行:
1 | 比對這兩份登入邏輯為什麼行為不一樣:@packages/web/src/auth/login.ts @packages/mobile/src/auth/login.ts |
一則訊息點兩個檔,它不用猜、不用繞,直接拿兩份原文開始比。官方也明講可以在同一則訊息引用多個檔案。這時候我才意識到,前面那三趟 grep 是我自己害的。
小提醒:路徑可以相對也可以絕對;而且你 @ 一個檔的時候,Claude 會順手把那個檔所在目錄、還有上層目錄的 CLAUDE.md 也一起帶進 context(已驗證,同一份官方文件)。所以規則有沒有生效,有時候跟你引用了哪個檔有關,這點蠻容易忽略。
@ 不只吃檔案
停一下,這裡有個大部分人沒用到的地方。@ 後面接的不一定是檔案。
接目錄,它給你的是那個目錄的檔案清單,不是把整包內容倒進來:
1 | What's the structure of @src/components? |
This provides a directory listing with file information.(已驗證)注意,是清單不是內容——想看結構用這個很省,想看內容還是得點到具體檔案。
更少人知道的是,如果你接了 MCP server,@ 可以直接把外部資料拉進來。格式是 @server:resource:
1 | Show me the data from @github:repos/owner/repo/issues |
這會從你連上的 MCP server 抓資料(已驗證)。等於說
@不只是「本機檔案的捷徑」,它是「把任何一塊 context 釘進對話」的統一入口——本機檔案、目錄結構、遠端 MCP 資源,同一個符號。
至於打 @server 會不會 fuzzy 比對到 server.py、tab 能不能補全——社群文件說可以,官方這頁沒明寫,我平常是用 tab 補全沒踩過雷,但 fuzzy 這件事還沒特別去驗,先當作「大概可以」看待。
圖片:一張截圖省你三百字
有些 bug 你打字打到手軟都講不清楚。「那個按鈕在手機上會往左邊歪大概三四個 pixel,然後 hover 的時候顏色怪怪的」——講完 Claude 還是不知道你在說哪個按鈕。這種時候,截圖直接丟進去,比你描述半天有用。
官方給了三個方法(已驗證):
- 把圖片檔拖進 Claude Code 視窗
- 複製圖片後用
Ctrl+V貼上——不要用Cmd+V - 直接在 prompt 裡給路徑:
Analyze this image: /path/to/your/image.png
第二點那個 Ctrl+V 是真的會害到人。Mac 用戶的手指反射就是 Cmd+V,但那個組合會被終端機本身吃掉,圖根本進不到 Claude Code。官方特別加了一句「Do not use cmd+v」不是沒原因的。至於 Windows、WSL 的貼上行為更雜(社群回報 WSL 要用 Alt+V,且某些版本才支援),這部分我自己沒有 Windows 環境,還沒自己試,跨平台請以你當下的版本實測為準。
貼進去之後,Claude 會用 [Image #1] 這種標記代表那張圖,之後在它的回覆裡看到 [Image #1],Cmd+Click(Mac)就能開圖來看(已驗證)。三種方法裡最穩的是給路徑那招——因為只有它能用在腳本裡,你要 pipe prompt 進去也是靠路徑。
最後一招:根本不存檔,直接 pipe
還有一種 context,它連檔案都不是——是某個指令的即時輸出。log、build 結果、一段 diff,你不想特地存成檔再引用。這時候走 Unix 老招數,pipe 進去:
1 | git log --oneline -20 | claude -p "summarize these recent commits" |
stdin、stdout 就跟一般 Unix 工具一樣接(已驗證)。piped 進來的資料,進 context 的方式跟檔案引用是一樣的,差別只在它不必先落地成檔案。build 噴一堆錯、CI log 一大坨,直接 pipe 給它,比你複製貼上乾淨多了。
還沒解掉的部分
講了半天好處,得誠實補幾句。
@ 把整個檔案塞進 context,這是雙面刃。小檔很爽,但你 @ 一個三千行的 God class,token 一口氣就下去了——它不像 Claude 自己 read 還會挑段落,@ 是全灌。大檔案我現在的做法是先請它 grep 定位,再視情況引用,而不是無腦 @。
再來,VS Code 裡從側邊欄拖檔案要按住 Shift 才會變成 context(不按就只是開檔),這個 Shift+drag 在 2026 年初有一段時間是壞的,社群回報過拖進去沒反應(GitHub issue)。這我沒踩到,但如果你拖了沒用,先別懷疑自己,可能是版本問題,退回打字 @ 最保險。
繞回開頭那個 401。現在我不會再丟「登入那段」然後看它 grep 三趟了。我會直接 @packages/mobile/src/auth/login.ts,要比對就再點一個 web 的,UI 歪掉就把截圖拖進去。它從「花三趟去猜我要什麼」變成「第一句就拿到對的東西」。
說到底,@ 補的不是打字速度,是你跟 AI 之間那條「你到底要我看哪裡」的頻寬。你把它當 tab 補全用,它就只是省你幾個字;你把它當「精準指定 context 的入口」用,它省掉的是 AI 到處亂翻、翻錯、還一路燒你 token 的那整段。工具一直都在,差別在你有沒有把它當「拍在桌上」那個動作來用。下一步想更進一階,可以回頭看看 @server:resource 背後的 MCP resources 怎麼設,那是把「引用」從你的硬碟延伸到整個外部世界的起點。






















































