樣式:將所有模組片段改為括號呈現(xiàn)的完整指南)
Starship Bracketed Segments 預設(shè)樣式將所有模組片段改為括號呈現(xiàn)的完整指南【免費下載鏈接】starship?? The minimal, blazing-fast, and infinitely customizable prompt for any shell!項目地址: https://gitcode.com/GitHub_Trending/st/starship本篇指南以 Starship 官方提供的 Bracketed Segments 預設(shè)樣式為核心說明它如何把內(nèi)建模組的提示片段從預設(shè)的「via」「on」等文字改為整齊的括號包覆格式並透過starship preset指令一鍵套用。讀完本文你將掌握預設(shè)樣式的安裝方式、完整 TOML 設(shè)定內(nèi)容、格式字串format string的底層語法以及如何在此基礎(chǔ)上自訂屬於自己的提示樣式。Bracketed Segments 預設(shè)樣式的執(zhí)行截圖這個預設(shè)樣式在做什麼Starship 的內(nèi)建模組module在預設(shè)情況下會以「via」「on」等連接文字來描述提示片段例如via ? main、on v3.11.0。Bracketed Segments 預設(shè)樣式做的事情很單純把每一個模組的顯示格式format全部改寫讓內(nèi)容一律被[ ]括號包覆藉此獲得視覺上更整齊、更接近「區(qū)塊化」的提示畫面。以 預設(shè)樣式總覽 中的描述為準這個樣式「使所有模組使用括號片段內(nèi)的格式顯示而非使用 Starship 預設(shè)via、on 等」。它不更動各模組的符號、顏色或顯示邏輯只統(tǒng)一調(diào)整片段的包覆方式因此非常適合作為自訂樣式的起點也方便與其他樣式如 Tokyo Night、Pastel Powerline搭配微調(diào)。安裝與套用使用 starship preset 指令官方提供一鍵套用的指令starship preset bracketed-segments -o ~/.config/starship.toml執(zhí)行後Starship 會把 Bracketed Segments 的完整設(shè)定寫入~/.config/starship.toml若該檔案已存在且未加上-f會被視為衝突。寫入完成後重新載入 shell或執(zhí)行exec $SHELL即可看到所有模組片段以括號呈現(xiàn)。除了寫入設(shè)定檔你也可以先將設(shè)定輸出到終端機檢視內(nèi)容# 直接輸出到 stdout不寫入檔案 starship preset bracketed-segments # 列出所有可用的預設(shè)樣式名稱 starship preset --list指令選項的原始碼定義preset子指令的參數(shù)定義位於 src/main.rs由 clap 解析選項說明注意事項name要輸出的預設(shè)樣式名稱如bracketed-segments為枚舉值需為--list列出的名稱之一-o, --output PATH將預設(shè)樣式輸出到指定檔案取代預設(shè)的 stdout與--list互斥conflicts_with list-f, --force若輸出檔案已存在則強制覆寫必須搭配-o使用requires output-l, --list列出所有預設(shè)樣式名稱與--output互斥實際執(zhí)行邏輯位於 src/print.rs 的preset_command當指定--list時印出樣式清單否則透過shadow::get_preset_content取得對應 TOML 內(nèi)容再依是否指定-o決定寫入檔案使用原子寫入write_file_atomic或輸出到 stdout。相關(guān)行為有對應的單元測試src/print.rs例如驗證preset_command能正確輸出到檔案、以及--force能覆寫既有檔案。完整 TOML 設(shè)定內(nèi)容本預設(shè)樣式的完整設(shè)定檔為 docs/public/presets/toml/bracketed-segments.toml內(nèi)容如下$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 官方發(fā)布的 JSON Schemaconfig-schema.json用途是讓支援 JSON Schema 的編輯器在編輯此 TOML 時提供自動補全與即時驗證。其餘部分則是一長串[模組名稱]區(qū)段每個區(qū)段只覆寫該模組的format鍵沒有更動style、symbol等其他設(shè)定——這正是此預設(shè)樣式「輕量」的原因它只改變呈現(xiàn)包覆方式保留各模組原本的外觀與行為。深入解析格式字串語法要理解並改造 Bracketed Segments必須先掌握 Starship 的格式字串語法。官方完整的格式字串說明位於 docs/config/README.md以下整理與本預設(shè)樣式直接相關(guān)的三個核心概念。變數(shù)Variable格式字串中$後接變數(shù)名稱即為變數(shù)例如$version、$symbol、$branch。變數(shù)名稱只能包含字母、數(shù)字與底線。範例$version是名為version的變數(shù)$git_branch $git_commit是兩個以空格分隔的變數(shù)。Bracketed Segments 的每個format都大量使用$symbol與$version等變數(shù)例如[rust]區(qū)段的\[$symbol($version)\]就是「符號」與可選的「版本」組合。文字群組Text Group與樣式字串文字群組由兩部分組成第一部分是包在[ ]中的格式字串可包含文字、變數(shù)甚至巢狀群組第二部分是包在( )中的樣式字串用於設(shè)定第一部分的顯示樣式。例如on以紅色粗體印出on? $version以綠色粗體印出?與版本內(nèi)容a [b c](green)b為紅色a與c為綠色。樣式字串的常見寫法包括fg:green bg:blue綠字藍底、bold fg:27粗體 ANSI 色號 27、underline bg:#bf5700底線 自訂色等且最終呈現(xiàn)受終端模擬器支援度影響。關(guān)鍵在於括號字元[與]本身在格式字串中具有語法意義若要顯示真正的方括號必須以\[與\]跳脫。這就是 Bracketed Segments 設(shè)定中處處可見\[...\]的原因——外層的\[與\]是「要顯示的括號」內(nèi)層的...才是文字群組語法。以[git_branch]為例[git_branch] format \[$symbol$branch\]解讀順序為顯示一個跳脫的左括號[接著是套用$style樣式的文字群組內(nèi)容為$symbol與$branch最後顯示跳脫的右括號]。($style)保留各模組原本定義的樣式變數(shù)因此括號的顏色會與片段內(nèi)容一致。條件式格式字串Conditional Format Strings包在( )中的格式字串是「條件式」的當其中所有變數(shù)皆為空值時整段不會渲染。例如($region)若region為空則不顯示否則顯示加上區(qū)域名稱(\[$a$b\] )僅當$a與$b皆為空時不顯示。Bracketed Segments 大量運用此機制讓括號內(nèi)的次要資訊如版本、環(huán)境名稱在不存在時自動隱藏避免出現(xiàn)空括號。以 [python] 區(qū)段為例[python] format \[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]其中(${version})與(\($virtualenv\))皆為條件式?jīng)]有版本就不顯示版本段沒有虛擬環(huán)境就不顯示(venv)段但外層的\[\]括號恆常顯示包裹至少存在的符號內(nèi)容。重點模組格式拆解不同模組的format呈現(xiàn)出幾種典型模式理解後即可自行改寫模式範例說明符號 條件式版本[rust]、[nodejs]、[python]等語言模組\[$symbol($version)\]有版本才顯示版本符號 固定欄位[git_branch]、[aws]、[kubernetes]直接拼接$symbol與分支設(shè)定檔context 名稱條件式括號內(nèi)再包括號[container]、[netns]、[singularity]內(nèi)層使用\[$name\]顯示真正的名稱括號與外層區(qū)塊括號區(qū)隔複合指標[git_status]、[git_metrics]、[fossil_metrics]以\[$added\]\[-$deleted\]等把不同樣式$added_style、$deleted_style的片段各自括起特殊字元開頭[cmd_duration]? $duration、[dotnet] $tfm在括號內(nèi)保留時鐘、目標框架等標記符號例如[git_status]的([\[$all_status$ahead_behind\]]($style))外層再包一層條件式群組讓整段狀態(tài)在沒有內(nèi)容時完全不顯示而[memory_usage]的\$symbol[$ram( | $swap)\]則把括號只套在記憶體數(shù)值上符號留在括號外。原始碼層面的實作佐證starship preset的完整運作鏈可以從原始碼驗證指令定義src/main.rs 中以 clap 定義Preset子指令name參數(shù)型別為print::Preset並標註value_enum因此--list所列的名稱即為合法輸入。名稱枚舉src/print.rs 中Preset結(jié)構(gòu)實作ValueEnumvalue_variants呼叫shadow::get_preset_list()取得內(nèi)建樣式清單。內(nèi)容輸出src/print.rs 的preset_command依--list-o-f分支處理最終以原子寫入方式將 TOML 內(nèi)容寫到目標路徑或 stdout。測試驗證src/print.rs 的單元測試涵蓋樣式清單非空、正確輸入不 panic、輸出至檔案以及--force覆寫既有檔案等行為並以include_str!(../docs/public/presets/toml/nerd-font-symbols.toml)比對寫入內(nèi)容證明 CLI 輸出的設(shè)定檔即倉庫內(nèi)文件。換句話說docs/public/presets/toml/bracketed-segments.toml 不僅是文件也是starship preset指令實際派發(fā)的內(nèi)容來源兩者保持同步。在此基礎(chǔ)上自訂與微調(diào)套用預設(shè)樣式後~/.config/starship.toml即包含上述所有format覆寫。你可以直接編輯該檔案進行微調(diào)常見做法包括調(diào)整特定模組只改某個[模組名]區(qū)段的format例如把[git_branch]的括號改成全形「【 】」、或拿掉括號改回預設(shè)樣式搭配其他樣式先套用 Tokyo Night 或 Catppuccin Powerline 這類色彩樣式再手動合併 Bracketed Segments 的format區(qū)段即可同時擁有配色與括號區(qū)塊新增模組本樣式未覆寫的模組如 fill 這類特殊模組仍維持預設(shè)行為可自行補上format還原預設(shè)刪除~/.config/starship.toml中對應的[模組名]區(qū)段或直接移除整個設(shè)定檔即回到 Starship 出廠樣式。若想了解其他官方預設(shè)樣式與套用方式可參閱 預設(shè)樣式總覽格式字串、樣式字串與條件式語法的完整規(guī)範則可查閱 設(shè)定文件中的 Format Strings 章節(jié)。安裝 Starship 本體的方式可參考 安裝指南?!久赓M下載鏈接】starship?? The minimal, blazing-fast, and infinitely customizable prompt for any shell!項目地址: https://gitcode.com/GitHub_Trending/st/starship創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考