跳到主要內容

arc completion

arc completion 把 bash / zsh / fish 的補全指令碼打到 stdout——它自己從不寫檔案,落地成檔案是你自己控制的一步。

arc completion 為你的 shell 生成一份 tab 補全指令碼,打到 stdout。它從不往磁碟上寫任何東西——把輸出變成一個檔案,或者追加進你 shell 的啟動檔案,是你自己動手的一步。

對照版本:arc 2.0.0-beta.48(commit 5a5316bde,main,2026-09-10)。複製下面任何內容前先跑 arc --version;生成的指令碼可能隨構建變化。

用法

bash
arc completion [shell]
  • shellbashzsh、或 fish。省略時 arc$SHELL 探測;如果 $SHELL 沒設定,或者設成了這三者之外的東西,就回落到 bash
bash
$ env -i PATH="$PATH" SHELL=/bin/zsh arc completion | head -1
#compdef arc
$ env -i PATH="$PATH" SHELL=/usr/bin/tcsh arc completion | head -1
###-begin-arc-completions-###

生成指令碼

三份指令碼長度不一樣——bash 自己做匹配和轉義,zsh 把大部分工作交給 _describe,fish 只是一次 complete 呼叫:

bash
$ arc completion bash | wc -l
86
$ arc completion zsh | wc -l
67
$ arc completion fish | wc -l
14

三個合法值之外的 shell 名字,會像任何其它非法 choice 取值一樣被拒絕——一個 yargs 校驗錯誤,exit 5

bash
$ arc completion nosuchshell
ERROR: Invalid values:
  Argument: shell, Given: "nosuchshell", Choices: "bash", "zsh", "fish"

(此處截斷——剩下的部分和 arc completion --help 列印的文本相同)

怎麼裝

每份指令碼自己的開頭註釋都寫了該怎麼裝。arc completion <shell> 只列印,不會替你寫到下面任何一個路徑。

bash

bash
arc completion bash >> ~/.bashrc

macOS 上改用 ~/.bash_profile,腳本里的註釋寫的就是這個。開一個新 shell,或者 source 這個檔案,就能生效。

zsh

bash
arc completion zsh >> ~/.zshrc

如果你的 ~/.zshrc 從沒跑過 compinit,指令碼第一次載入時會自己引導它,你不需要另外加這一步。它還會在每個 prompt 上重新註冊自己,這樣你環境裡後面某處再跑一次 compinit 重建補全表時,不會悄悄把 arc 這條丟掉。

fish

bash
mkdir -p ~/.config/fish/completions
arc completion fish > ~/.config/fish/completions/arc.fish

mkdir -p 這一步很關鍵——> 不會自動建父目錄,而 fish 只認已經在 ~/.config/fish/completions/ 裡面的補全檔案。

能補全什麼

在下面任何一種位置按 Tab,裝好的指令碼都會去問正在跑的那個 arc 二進位制該給什麼——所以答案永遠匹配你實際裝的那個二進位制,不是生成指令碼那一刻定住的快照:

  • 命令名 —— arc d<TAB> 給出 diddeploydraindsl
  • 子命令名 —— arc did <TAB> 給出 initcheckissueverifyinfolistissuer
  • --instance / -i 取值 —— 和 arc service list 會顯示的同一批名字,所以 arc service status -i <TAB> 只會給出你真的有的例項
  • --recipe / --template 取值 —— arc blocklet create --recipe <TAB> 給出和 arc blocklet create --help 列出的一樣的選項:basicblankblogagentminimal-appagent-workspacesupport-community

除此之外的位置——比如 arc afs ls <TAB> 裡的 AFS 路徑——不屬於上面任何一個槽位,指令碼會落回你 shell 自帶的普通檔名補全。

取值怎麼落到命令列上

例項名和 recipe 名不是生成指令碼那一刻定住的。每按一次鍵都會去查詢你現在實際裝的那個 arc 二進位制,所以上週生成的指令碼,照樣能給出你五分鐘前才建的例項。

不管取值裡是什麼字元,插入這一步也是安全的。bash 在插入每個候選值之前都用 printf %q 轉義,所以一個字面上叫 my prod box 的例項,補全出來是安全的三段詞 my\ prod\ box,不會拆成三個獨立的詞;一個含 shell 元字元的名字,永遠不會被未轉義地交給 shell。zsh 的 _describe 內建了同樣的性質。

退出碼

你跑了什麼退出碼
arc completion bash / zsh / fish0
arc completion(不帶引數,探測到的 shell)0
arc completion <其它任何值>5