)
Starship No Empty Icons 預設完全解析讓工具圖標只在版本可識別時出現(xiàn)【免費下載鏈接】starship?? The minimal, blazing-fast, and infinitely customizable prompt for any shell!項目地址: https://gitcode.com/GitHub_Trending/st/starshipStarship 是一個極簡、極速、可無限自定義的跨 shell 提示符prompt項目。當你在某個包含Cargo.toml、package.json、*.rs等工程文件的目錄中工作Starship 會自動掃描并顯示對應工具鏈的圖標與版本號。No Empty Icons 是官方維護的一組 Preset預設配置它的用途非常聚焦只有當工具鏈的版本信息真正被探測到時才顯示該工具的圖標否則連同圖標一起隱藏整個模塊從而避免提示符里出現(xiàn)孤零零一個圖標、卻沒有版本號的視覺噪音。讀完本文你將掌握這個預設的默認行為差異、底層 format 字符串機理、一鍵安裝方法以及如何按需裁剪配置。一、這個預設解決什么問題默認行為 vs 預設行為No Empty Icons 預設文檔本文依據(jù)的多語言版本之一與 英文原版 內容一致對本預設給出了準確描述默認行為只要識別出工具集文件toolset files工具集圖標就會被顯示而當工具本身缺失、無法據(jù)此確定版本號時版本號這一部分不會被顯示。預設行為將上面的邏輯反轉過來——只有當工具集信息尤其是版本號能被確定時才顯示圖標一旦版本無法探測圖標連同一整段內容一起消失。換句話說默認配置可能出現(xiàn)有圖標無版本的輸出而 No Empty Icons 追求的是要么圖標與版本一起出現(xiàn)要么都不出現(xiàn)。官方 Preset 總覽頁 docs/presets/README.md 對它的概括也正是This preset does not show icons if the toolset is not found.當工具集不存在時不顯示圖標。以下截圖即官方倉庫中該預設的效果預覽二、工作原理一行 format 字符串背后的條件渲染機制要理解這個預設為什么能實現(xiàn)圖標隨版本一起消失需要先理解 Starship 模塊的format字符串語法。每個模塊如 Rust、Python、Node.js都由一個format字段驅動渲染其中的三個基本元素是普通文本如via、with原樣輸出。變量如$symbol圖標、$version版本號、$tfm目標框架、$otp_versionErlang/OTP 版本渲染時替換為實際值若對應信息探測不到變量解析結果為空。條件組( ... )僅當組內引用的全部變量都能解析出非空值時整組內容才被渲染否則整組被丟棄。這條規(guī)則正是本預設的核心杠桿其實現(xiàn)可見 src/formatter/string_formatter.rs源碼注釋明確寫著當內部所有變量均為空時則不顯示該條件組Show the conditional format string if all the variables inside are not none or empty string。樣式段...對其中內容套用style指定的前景色/背景色等樣式。以 Rust 模塊為例其默認format定義在 src/configs/rust.rs# 默認default format via $symbol($version )其中($version )是一個條件組當rustc/rustup無法給出版本時比如環(huán)境中沒有安裝 Rust 工具鏈該組被丟棄但via 仍會輸出——于是出現(xiàn)一個沒有版本號的空圖標。而本預設把整個格式串包進一層外層條件組# No Empty Icons 預設 format (via $symbol($version ))$version無法解析時外層( ... )判定組內變量為空于是via、圖標、樣式段全部被丟棄模塊整體輸出為空、從提示符中消失。這就是只顯示能被確定的工具信息這一行為的直接來源。需要注意這一判斷的觸發(fā)點發(fā)生在每個模塊真正執(zhí)行探測命令之后從 src/modules/rust.rs 的模塊邏輯可以看出模塊先通過detect_files/detect_extensions掃描確定當前目錄屬于何種項目再調用版本探測命令獲取版本只有當探測結果為空時$version才渲染為空外層條件組才被跳過。三、如何安裝與啟用根據(jù)預設文檔官方推薦的一鍵式啟用命令為starship preset no-empty-icons -o ~/.config/starship.toml這條命令會把預設內容寫入~/.config/starship.toml即 Starship 的全局配置文件。該命令使用了-o/--output之類的輸出參數(shù)將結果落盤具體可用參數(shù)可執(zhí)行starship preset --help查看你本機版本的幫助說明。手動方式同樣可行預設內容本身就是一個獨立的 TOML 片段存放在倉庫的 docs/public/presets/toml/no-empty-icons.toml你可以直接下載后合并進自己的配置。[!TIP] 配置落盤提醒 如果你現(xiàn)有的~/.config/starship.toml中已經(jīng)寫有大量自定義內容直接執(zhí)行上述-o命令可能會以預設內容覆蓋既有文件。更穩(wěn)妥的做法是先備份現(xiàn)有配置或僅把下文第四節(jié)中你需要的模塊[xxx]表手動合并進原配置。無論采用哪種方式Starship 都會在配置變更后于下一次渲染提示符時讀取新配置無需重新安裝或重啟 shell。四、預設的完整內容全量 TOML該預設一次性改寫了46 個版本類模塊的format覆蓋絕大多數(shù)帶版本探測的語言與構建工具。完整內容如下與 docs/public/presets/toml/no-empty-icons.toml 保持一致$schema https://starship.rs/config-schema.json [buf] format (with $symbol($version )) [bun] format (via $symbol($version )) [c] format (via $symbol($version(-$name) )) [cpp] format (via $symbol($version(-$name) )) [cmake] format (via $symbol($version )) [cobol] format (via $symbol($version )) [crystal] format (via $symbol($version )) [daml] format (via $symbol($version )) [dart] format (via $symbol($version )) [deno] format (via $symbol($version )) [dotnet] format (via $symbol($version )( $tfm )) [elixir] format (via $symbol($version \(OTP $otp_version\) )) [elm] format (via $symbol($version )) [erlang] format (via $symbol($version )) [fennel] format (via $symbol($version )) [fortran] format (via $symbol($version )) [gleam] format (via $symbol($version )) [golang] format (via $symbol($version )) [haskell] format (via $symbol($version )) [helm] format (via $symbol($version )) [java] format (via $symbol($version )) [julia] format (via $symbol($version )) [kotlin] format (via $symbol($version )) [lua] format (via $symbol($version )) [nim] format (via $symbol($version )) [nodejs] format (via $symbol($version )) [ocaml] format (via $symbol($version )(\($switch_indicator$switch_name\) )) [opa] format (via $symbol($version )) [package] format (is $symbol$version ) [perl] format (via $symbol($version )) [php] format (via $symbol($version )) [purescript] format (via $symbol($version )) [python] format (via ${symbol}${pyenv_prefix}(${version} )(\($virtualenv\) )) [quarto] format (via $symbol($version )) [raku] format (via $symbol($version-$vm_version )) [red] format (via $symbol($version )) [rlang] format (via $symbol($version )) [ruby] format (via $symbol($version )) [rust] format (via $symbol($version )) [scala] format (via $symbol($version )) [swift] format (via $symbol($version )) [typst] format (via $symbol($version )) [vagrant] format (via $symbol($version )) [vlang] format (via $symbol($version )) [xmake] format (via $symbol($version )) [zig] format (via $symbol($version ))五、46 個模塊的內容分類與差異點速查雖然絕大多數(shù)條目結構相同但其中一部分模塊因自身變量較多改寫方式并不完全一樣值得逐一區(qū)分模塊預設 format 的差異點說明buf前綴詞為with該模塊默認文案即 with區(qū)別于其余模塊的 viac、cpp($version(-$name))版本后還附帶一個可選的編譯器/實現(xiàn)名稱條件組dotnet($version)( $tfm)額外包含目標框架Target Framework變量$tfmelixir(OTP $otp_version)版本之外還會顯示 OTP 版本用轉義括號包裹ocaml($switch_indicator$switch_name)額外包含 switch切換開關相關變量package前綴詞為is直接形如 is [v1.2.3]package無圖標展示來自package.json等清單文件的包版本python${symbol}${pyenv_prefix}(${version})(\($virtualenv\))保留pyenv前綴與虛擬環(huán)境名變量的條件顯示raku($version-$vm_version)同時顯示 Raku 版本與其虛擬機MoarVM 等版本fortran雙引號字符串內容與其他via型一致僅 TOML 引號寫法不同其余 37 個模塊(via $symbol($version ))bun、cmake、cobol、crystal、daml、dart、deno、elm、erlang、fennel、fortran、gleam、golang、haskell、helm、java、julia、kotlin、lua、nim、nodejs、opa、perl、php、purescript、quarto、red、rlang、ruby、rust、scala、swift、typst、vagrant、vlang、xmake、zig值得注意的一點是這些改寫的外層包裹方式高度統(tǒng)一——都是把原先不帶外層條件的默認format整段塞進( ... )。你可以對照各模塊在 src/configs 中的默認實現(xiàn)來觀察這一規(guī)律例如Rust 默認via $symbol($version )出自 src/configs/rust.rsPython 默認via ${symbol}${pyenv_prefix}(${version} )(\\($virtualenv\\) )出自 src/configs/python.rsbuf 默認with $symbol($version )出自 src/configs/buf.rs。由此可以總結出一個通用經(jīng)驗如果你未來希望讓任意圖標版本型模塊也遵循版本不可知即整段隱藏的規(guī)則只需要把它的默認format用一對圓括號整體包起來即可No Empty Icons 本質上是把這條規(guī)則批量應用到了 46 個模塊上。六、適用場景與定制建議這個預設最適合以下幾類使用者經(jīng)常在未安裝完整工具鏈的環(huán)境中工作例如切換頻繁的 CI 容器、DevContainer、遠程服務器機器上保留了項目文件如Cargo.toml、go.mod但對應編譯器cargo、go尚未安裝不希望提示符反復出現(xiàn)只有圖標沒有版本的模塊追求提示符信息的可信度堅持出現(xiàn)的內容必須信息完整。如果你只想對其中個別模塊生效、而非全局套用可以在手動合并時僅摘取所需條目例如只隱藏無版本的 Rust 模塊[rust] format (via $symbol($version ))另外需要注意這個預設只改寫具備版本探測語義的模塊諸如directory、git_branch、character等與工具鏈版本無關的模塊完全不受影響它也獨立于其他官方預設如 No Runtime Versions 是去掉版本只留圖標與沒版本就連圖標一起隱藏的 No Empty Icons 思路恰好相反可按需搭配或擇一使用。若與其它同時改寫format的預設疊加后寫入的模塊format會覆蓋先前的值合并時需自行取舍。七、驗證方式與小結啟用后如何驗證效果在任意包含語言項目文件、但對應工具鏈未安裝的目錄中重新渲染提示符即可——如果 No Empty Icons 已生效該語言的圖標與 via ... 字樣應整體消失而在已安裝完整工具鏈的目錄中圖標與版本號會同時正常出現(xiàn)。兩種場景的對比截圖即官方倉庫中的 docs/public/presets/img/no-empty-icons.png。若需手動核對配置合法性可使用倉庫中生成的 JSON Schema 進行編輯器內校驗見 docs/public/config-schema.json預設 TOML 首行的$schema字段即指向該校驗入口。歸根結底No Empty Icons 通過一層統(tǒng)一的外層條件組把顯示內容必須是可被證實的工具信息這一原則貫徹到了全部 46 個工具鏈模塊。理解它的工作原理之后你不僅能熟練安裝這一預設也能舉一反三地利用format字符串的括號分組語法為自己定制出信息缺失即隱藏的各類模塊行為。本預設的完整 TOML 文件同時提供了官方下載路徑 docs/public/presets/toml/no-empty-icons.toml可與本文內容逐一對照?!久赓M下載鏈接】starship?? The minimal, blazing-fast, and infinitely customizable prompt for any shell!項目地址: https://gitcode.com/GitHub_Trending/st/starship創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考