Starship Bracketed Segments 預設樣式:將所有模組片段改為括號呈現的完整指南
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
本篇指南以 Starship 官方提供的 Bracketed Segments 預設樣式為核心,說明它如何把內建模組的提示片段從預設的「via」「on」等文字,改為整齊的括號包覆格式,並透過starship preset指令一鍵套用。讀完本文,你將掌握預設樣式的安裝方式、完整 TOML 設定內容、格式字串(format string)的底層語法,以及如何在此基礎上自訂屬於自己的提示樣式。
Bracketed Segments 預設樣式的執行截圖
這個預設樣式在做什麼
Starship 的內建模組(module)在預設情況下,會以「via」「on」等連接文字來描述提示片段,例如via main、on 🐍 v3.11.0。Bracketed Segments 預設樣式做的事情很單純:把每一個模組的顯示格式(format)全部改寫,讓內容一律被[ ]括號包覆,藉此獲得視覺上更整齊、更接近「區塊化」的提示畫面。
以 預設樣式總覽 中的描述為準,這個樣式「使所有模組使用括號片段內的格式顯示,而非使用 Starship 預設("via"、"on" 等)」。它不更動各模組的符號、顏色或顯示邏輯,只統一調整片段的包覆方式,因此非常適合作為自訂樣式的起點,也方便與其他樣式(如 Tokyo Night、Pastel Powerline)搭配微調。
安裝與套用
使用 starship preset 指令
官方提供一鍵套用的指令:
starship preset bracketed-segments -o ~/.config/starship.toml執行後,Starship 會把 Bracketed Segments 的完整設定寫入~/.config/starship.toml(若該檔案已存在且未加上-f,會被視為衝突)。寫入完成後重新載入 shell(或執行exec $SHELL),即可看到所有模組片段以括號呈現。
除了寫入設定檔,你也可以先將設定輸出到終端機檢視內容:
# 直接輸出到 stdout,不寫入檔案 starship preset bracketed-segments # 列出所有可用的預設樣式名稱 starship preset --list指令選項的原始碼定義
preset子指令的參數定義位於 src/main.rs,由 clap 解析:
| 選項 | 說明 | 注意事項 |
|---|---|---|
name | 要輸出的預設樣式名稱(如bracketed-segments) | 為枚舉值,需為--list列出的名稱之一 |
-o, --output <PATH> | 將預設樣式輸出到指定檔案,取代預設的 stdout | 與--list互斥(conflicts_with = "list") |
-f, --force | 若輸出檔案已存在則強制覆寫 | 必須搭配-o使用(requires = "output") |
-l, --list | 列出所有預設樣式名稱 | 與--output互斥 |
實際執行邏輯位於 src/print.rs 的preset_command:當指定--list時印出樣式清單;否則透過shadow::get_preset_content取得對應 TOML 內容,再依是否指定-o決定寫入檔案(使用原子寫入write_file_atomic)或輸出到 stdout。相關行為有對應的單元測試(src/print.rs),例如驗證preset_command能正確輸出到檔案、以及--force能覆寫既有檔案。
完整 TOML 設定內容
本預設樣式的完整設定檔為 docs/public/presets/toml/bracketed-segments.toml,內容如下:
"$schema" = 'https://starship.rs/config-schema.json' [aws] format = '\[[$symbol($profile)(\($region\))(\[$duration\])]($style)\]' [azure] format = '\[$symbol($subscription)\]' [battery] format = '\[$symbol$percentage\]' [buf] format = '\[$symbol($version)\]' [bun] format = '\[$symbol($version)\]' [c] format = '\[$symbol($version(-$name))\]' [cmake] format = '\[$symbol($version)\]' [cmd_duration] format = '\[⏱ $duration\]' [cobol] format = '\[$symbol($version)\]' [conda] format = '\[$symbol$environment\]' [container] format = '\[[$symbol \[$name\]]($style)\]' [cpp] format = '\[$symbol($version(-$name))\]' [crystal] format = '\[$symbol($version)\]' [daml] format = '\[$symbol($version)\]' [dart] format = '\[$symbol($version)\]' [deno] format = '\[$symbol($version)\]' [direnv] format = '\[$symbol$loaded/$allowed\]' [docker_context] format = '\[$symbol$context\]' [dotnet] format = '\[$symbol($version)(🎯 $tfm)\]' [elixir] format = '\[$symbol($version \(OTP $otp_version\))\]' [elm] format = '\[$symbol($version)\]' [erlang] format = '\[$symbol($version)\]' [fennel] format = '\[$symbol($version)\]' [fortran] format = '\[$symbol($version)\]' [fossil_branch] format = '\[$symbol$branch\]' [fossil_metrics] format = '\[+$added\]\[-$deleted\]' [gcloud] format = '\[$symbol$account(@$domain)(\($region\))\]' [git_branch] format = '\[$symbol$branch\]' [git_commit] format = '\[\($hash$tag\)\]' [git_metrics] format = '\[+$added\]\[-$deleted\]' [git_state] format = '\[$state ($progress_current/$progress_total)\]' [git_status] format = '([\[$all_status$ahead_behind\]]($style))' [gleam] format = '\[$symbol($version)\]' [golang] format = '\[$symbol($version)\]' [gradle] format = '\[$symbol($version)\]' [guix_shell] format = '\[$symbol\]' [haskell] format = '\[$symbol($version)\]' [haxe] format = '\[$symbol($version)\]' [helm] format = '\[$symbol($version)\]' [hg_branch] format = '\[$symbol$branch\]' [hostname] format = '\[$ssh_symbol($hostname)\] ' [java] format = '\[$symbol($version)\]' [jj_bookmark] format = '\[$symbol$bookmark(@$remote)$diverged( \(+$overflow_count others\))\]' [jj_change] format = '\[\($change\)\]' [jobs] format = '\[$symbol$number\]' [julia] format = '\[$symbol($version)\]' [kotlin] format = '\[$symbol($version)\]' [kubernetes] format = '\[$symbol$context( \($namespace\))\]' [localip] format = '\[$localipv4\]' [lua] format = '\[$symbol($version)\]' [maven] format = '\[$symbol($version)\]' [memory_usage] format = '\$symbol[$ram( | $swap)\]' [meson] format = '\[$symbol$project\]' [mise] format = '\[$symbol$health\]' [mojo] format = '\[$symbol($version)\]' [nats] format = '\[$symbol$name\]' [netns] format = '\[[$symbol \[$name\]]($style)\]' [nim] format = '\[$symbol($version)\]' [nix_shell] format = '\[$symbol$state( \($name\))\]' [nodejs] format = '\[$symbol($version)\]' [ocaml] format = '\[$symbol($version)(\($switch_indicator$switch_name\))\]' [odin] format = '\[$symbol($version )\]' [opa] format = '\[$symbol($version)\]' [openstack] format = '\[$symbol$cloud(\($project\))\]' [os] format = '\[$symbol\]' [package] format = '\[$symbol$version\]' [perl] format = '\[$symbol($version)\]' [php] format = '\[$symbol($version)\]' [pijul_channel] format = '\[$symbol$channel\]' [pixi] format = '\[$symbol$version( $environment)\]' [pulumi] format = '\[$symbol$stack\]' [purescript] format = '\[$symbol($version)\]' [python] format = '\[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]' [quarto] format = '\[$symbol($version)\]' [raku] format = '\[$symbol($version-$vm_version)\]' [red] format = '\[$symbol($version)\]' [rlang] format = '\[$symbol($version)\]' [ruby] format = '\[$symbol($version)\]' [rust] format = '\[$symbol($version)\]' [scala] format = '\[$symbol($version)\]' [shell] format = '\[$indicator\]' [singularity] format = '\[[$symbol\[$env\]]($style)\]' [solidity] format = '\[$symbol($version)\]' [spack] format = '\[$symbol$environment\]' [status] format = '\[$symbol$status\]' [sudo] format = '\[as $symbol\]' [swift] format = '\[$symbol($version)\]' [terraform] format = '\[$symbol$workspace\]' [time] format = '\[$time\]' [typst] format = '\[$symbol($version)\]' [username] format = '\[$user\]' [vagrant] format = '\[$symbol($version)\]' [vcsh] format = '\vcsh [$symbol$repo\]' [vlang] format = '\[$symbol($version)\]' [xmake] format = '\[$symbol($version)\]' [zig] format = '\[$symbol($version)\]'檔案開頭的"$schema"鍵指向 Starship 官方發布的 JSON Schema(config-schema.json),用途是讓支援 JSON Schema 的編輯器在編輯此 TOML 時提供自動補全與即時驗證。其餘部分則是一長串[模組名稱]區段,每個區段只覆寫該模組的format鍵,沒有更動style、symbol等其他設定——這正是此預設樣式「輕量」的原因:它只改變呈現包覆方式,保留各模組原本的外觀與行為。
深入解析格式字串語法
要理解並改造 Bracketed Segments,必須先掌握 Starship 的格式字串語法。官方完整的格式字串說明位於 docs/config/README.md,以下整理與本預設樣式直接相關的三個核心概念。
變數(Variable)
格式字串中,$後接變數名稱即為變數,例如$version、$symbol、$branch。變數名稱只能包含字母、數字與底線。範例:
'$version'是名為version的變數;'$git_branch $git_commit'是兩個以空格分隔的變數。
Bracketed Segments 的每個format都大量使用$symbol與$version等變數,例如[rust]區段的'\[$symbol($version)\]',就是「符號」與可選的「版本」組合。
文字群組(Text Group)與樣式字串
文字群組由兩部分組成:第一部分是包在[ ]中的格式字串(可包含文字、變數,甚至巢狀群組);第二部分是包在( )中的樣式字串,用於設定第一部分的顯示樣式。例如:
'on':以紅色粗體印出on;'⌘ $version':以綠色粗體印出⌘與版本內容;'a [b c](green)':b為紅色,a與c為綠色。
樣式字串的常見寫法包括'fg:green bg:blue'(綠字藍底)、'bold fg:27'(粗體 + ANSI 色號 27)、'underline bg:#bf5700'(底線 + 自訂色)等,且最終呈現受終端模擬器支援度影響。
關鍵在於:括號字元[與]本身在格式字串中具有語法意義,若要顯示真正的方括號,必須以\[與\]跳脫。這就是 Bracketed Segments 設定中處處可見\[...\]的原因——外層的\[與\]是「要顯示的括號」,內層的...才是文字群組語法。以[git_branch]為例:
[git_branch] format = '\[$symbol$branch\]'解讀順序為:顯示一個跳脫的左括號[,接著是套用$style樣式的文字群組(內容為$symbol與$branch),最後顯示跳脫的右括號]。($style)保留各模組原本定義的樣式變數,因此括號的顏色會與片段內容一致。
條件式格式字串(Conditional Format Strings)
包在( )中的格式字串是「條件式」的:當其中所有變數皆為空值時,整段不會渲染。例如:
'(@$region)':若region為空則不顯示,否則顯示@加上區域名稱;'(\[$a$b\] )':僅當$a與$b皆為空時不顯示。
Bracketed Segments 大量運用此機制,讓括號內的次要資訊(如版本、環境名稱)在不存在時自動隱藏,避免出現空括號。以 [python] 區段為例:
[python] format = '\[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]'其中(${version})與(\($virtualenv\))皆為條件式:沒有版本就不顯示版本段,沒有虛擬環境就不顯示(venv)段,但外層的\[\]括號恆常顯示,包裹至少存在的符號內容。
重點模組格式拆解
不同模組的format呈現出幾種典型模式,理解後即可自行改寫:
| 模式 | 範例 | 說明 |
|---|---|---|
| 符號 + 條件式版本 | [rust]、[nodejs]、[python]等語言模組 | '\[$symbol($version)\]',有版本才顯示版本 |
| 符號 + 固定欄位 | [git_branch]、[aws]、[kubernetes] | 直接拼接$symbol與分支/設定檔/context 名稱 |
| 條件式括號內再包括號 | [container]、[netns]、[singularity] | 內層使用\[$name\]顯示真正的名稱括號,與外層區塊括號區隔 |
| 複合指標 | [git_status]、[git_metrics]、[fossil_metrics] | 以\[+$added\]\[-$deleted\]等把不同樣式($added_style、$deleted_style)的片段各自括起 |
| 特殊字元開頭 | [cmd_duration](⏱ $duration)、[dotnet](🎯 $tfm) | 在括號內保留時鐘、目標框架等標記符號 |
例如[git_status]的'([\[$all_status$ahead_behind\]]($style))',外層再包一層條件式群組,讓整段狀態在沒有內容時完全不顯示;而[memory_usage]的'\$symbol[$ram( | $swap)\]'則把括號只套在記憶體數值上,符號留在括號外。
原始碼層面的實作佐證
starship preset的完整運作鏈可以從原始碼驗證:
- 指令定義:src/main.rs 中以 clap 定義
Preset子指令,name參數型別為print::Preset並標註value_enum,因此--list所列的名稱即為合法輸入。 - 名稱枚舉:src/print.rs 中
Preset結構實作ValueEnum,value_variants呼叫shadow::get_preset_list()取得內建樣式清單。 - 內容輸出:src/print.rs 的
preset_command依--list/-o/-f分支處理,最終以原子寫入方式將 TOML 內容寫到目標路徑或 stdout。 - 測試驗證:src/print.rs 的單元測試涵蓋樣式清單非空、正確輸入不 panic、輸出至檔案,以及
--force覆寫既有檔案等行為,並以include_str!("../docs/public/presets/toml/nerd-font-symbols.toml")比對寫入內容,證明 CLI 輸出的設定檔即倉庫內文件。
換句話說,docs/public/presets/toml/bracketed-segments.toml 不僅是文件,也是starship preset指令實際派發的內容來源,兩者保持同步。
在此基礎上自訂與微調
套用預設樣式後,~/.config/starship.toml即包含上述所有format覆寫。你可以直接編輯該檔案進行微調,常見做法包括:
- 調整特定模組:只改某個
[模組名]區段的format,例如把[git_branch]的括號改成全形「【 】」、或拿掉括號改回預設樣式; - 搭配其他樣式:先套用 Tokyo Night 或 Catppuccin Powerline 這類色彩樣式,再手動合併 Bracketed Segments 的
format區段,即可同時擁有配色與括號區塊; - 新增模組:本樣式未覆寫的模組(如 fill 這類特殊模組)仍維持預設行為,可自行補上
format; - 還原預設:刪除
~/.config/starship.toml中對應的[模組名]區段,或直接移除整個設定檔,即回到 Starship 出廠樣式。
若想了解其他官方預設樣式與套用方式,可參閱 預設樣式總覽;格式字串、樣式字串與條件式語法的完整規範,則可查閱 設定文件中的 Format Strings 章節。安裝 Starship 本體的方式,可參考 安裝指南。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考