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