Starship Bracketed Segments 預設樣式:將所有模組片段改為括號呈現的完整指南
2026/9/10 19:40:41 网站建设 项目流程

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  mainon 🐍 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鍵,沒有更動stylesymbol等其他設定——這正是此預設樣式「輕量」的原因:它只改變呈現包覆方式,保留各模組原本的外觀與行為。

深入解析格式字串語法

要理解並改造 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為紅色,ac為綠色。

樣式字串的常見寫法包括'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的完整運作鏈可以從原始碼驗證:

  1. 指令定義:src/main.rs 中以 clap 定義Preset子指令,name參數型別為print::Preset並標註value_enum,因此--list所列的名稱即為合法輸入。
  2. 名稱枚舉:src/print.rs 中Preset結構實作ValueEnumvalue_variants呼叫shadow::get_preset_list()取得內建樣式清單。
  3. 內容輸出:src/print.rs 的preset_command--list-o-f分支處理,最終以原子寫入方式將 TOML 內容寫到目標路徑或 stdout。
  4. 測試驗證: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询