<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Path on Tarragon</title><link>https://tarrragon.github.io/blog/tags/path/</link><description>Recent content in Path on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 29 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/path/index.xml" rel="self" type="application/rss+xml"/><item><title>PATH、Plugin 與 Prompt</title><link>https://tarrragon.github.io/blog/linux/dotfile/02-shell-config/path-plugin-prompt/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/02-shell-config/path-plugin-prompt/</guid><description>&lt;p>PATH、plugin manager 和 prompt 是 shell 配置裡「每個開發者都會碰到、但容易放任不管」的三個區域。&lt;/p>
&lt;h2 id="path-管理">PATH 管理&lt;/h2>
&lt;p>PATH 是最容易腐化的環境變數——每裝一個工具就加一條，最後 PATH 變成一長串看不懂的路徑，順序還會互相影響。&lt;/p>
&lt;p>管理原則：&lt;/p>
&lt;ul>
&lt;li>PATH 設定集中在一個地方（&lt;code>.zshenv&lt;/code> 或 &lt;code>env.zsh&lt;/code>），不散落在多個檔案&lt;/li>
&lt;li>新增前先想：這個路徑是所有機器都需要、還是特定機器才需要？共用的進 env.zsh，特定的進 local.zsh&lt;/li>
&lt;li>用 &lt;code>typeset -U PATH&lt;/code> (Zsh) 自動去除重複項目，避免多次 source 導致 PATH 不斷加長&lt;/li>
&lt;/ul>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># ~/.config/zsh/env.zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="nb">typeset&lt;/span> -U PATH &lt;span class="c1"># 去重&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># 自己的 script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="s2">/.local/bin:&lt;/span>&lt;span class="nv">$PATH&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="s2">/bin:&lt;/span>&lt;span class="nv">$PATH&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="plugin-manager-選型">Plugin Manager 選型&lt;/h2>
&lt;p>Zsh plugin manager 的選擇很多，差異主要在載入速度和功能豐富度：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>無 plugin manager&lt;/strong>：直接 git clone plugin 到某個目錄，手動 source。最簡單、最透明、但更新要自己管&lt;/li>
&lt;li>&lt;strong>zinit&lt;/strong>（原 zplugin）：載入速度最快（turbo mode 延遲載入）、功能最多、但配置語法學習曲線高&lt;/li>
&lt;li>&lt;strong>antidote&lt;/strong>：宣告式（一個 &lt;code>.zsh_plugins.txt&lt;/code> 列出所有 plugin），概念簡單&lt;/li>
&lt;li>&lt;strong>sheldon&lt;/strong>：Rust 寫的、速度快、設定用 TOML&lt;/li>
&lt;/ul>
&lt;p>常用 plugin：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>zsh-autosuggestions&lt;/strong>：根據歷史指令自動補全建議（灰色字，按右箭頭接受）&lt;/li>
&lt;li>&lt;strong>zsh-syntax-highlighting&lt;/strong>：指令行即時語法高亮&lt;/li>
&lt;li>&lt;strong>zsh-completions&lt;/strong>：額外的 tab 補全定義&lt;/li>
&lt;/ul>
&lt;h2 id="prompt-設計">Prompt 設計&lt;/h2>
&lt;p>Prompt 是每次按 Enter 都會看到的東西，值得花時間設計但不需要複雜。&lt;/p>
&lt;p>基本款（不用框架）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># 顯示目錄 + git branch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">autoload -Uz vcs_info
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">precmd&lt;span class="o">()&lt;/span> &lt;span class="o">{&lt;/span> vcs_info &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">zstyle &lt;span class="s1">&amp;#39;:vcs_info:git:*&amp;#39;&lt;/span> formats &lt;span class="s1">&amp;#39; (%b)&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="nv">PROMPT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;%F{blue}%~%f%F{green}${vcs_info_msg_0_}%f %# &amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>框架款：Starship（跨 shell、用 TOML 設定、Rust 寫的速度快）是目前最常被推薦的 prompt 工具。它的配置進 &lt;code>~/.config/starship.toml&lt;/code>，也是 dotfile 的一部分。&lt;/p>
&lt;h2 id="dotfile-結構對應">Dotfile 結構對應&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/01-dotfile-management/" data-link-title="模組一：管理工具與目錄結構" data-link-desc="要把散落在家目錄的配置檔集中版控時，選 bare repo、stow 還是 chezmoi、目錄該怎麼組織">管理工具與目錄結構&lt;/a>裡的 stow 目錄結構，shell 配置的對應：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">~/dotfiles/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">└── zsh/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> ├── .zshenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> ├── .zshrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> └── .config/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> └── zsh/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> ├── aliases.zsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> ├── functions.zsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> ├── plugins.zsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> ├── prompt.zsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> ├── tools.zsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> └── env.zsh&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>stow zsh&lt;/code> 會在家目錄建立 &lt;code>.zshenv&lt;/code> 和 &lt;code>.zshrc&lt;/code> 的 symlink，在 &lt;code>.config/zsh/&lt;/code> 下建立各模組檔案的 symlink。&lt;code>local.zsh&lt;/code> 不在 repo 裡，各機器自己建。&lt;/p></description><content:encoded><![CDATA[<p>PATH、plugin manager 和 prompt 是 shell 配置裡「每個開發者都會碰到、但容易放任不管」的三個區域。</p>
<h2 id="path-管理">PATH 管理</h2>
<p>PATH 是最容易腐化的環境變數——每裝一個工具就加一條，最後 PATH 變成一長串看不懂的路徑，順序還會互相影響。</p>
<p>管理原則：</p>
<ul>
<li>PATH 設定集中在一個地方（<code>.zshenv</code> 或 <code>env.zsh</code>），不散落在多個檔案</li>
<li>新增前先想：這個路徑是所有機器都需要、還是特定機器才需要？共用的進 env.zsh，特定的進 local.zsh</li>
<li>用 <code>typeset -U PATH</code> (Zsh) 自動去除重複項目，避免多次 source 導致 PATH 不斷加長</li>
</ul>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># ~/.config/zsh/env.zsh</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">typeset</span> -U PATH  <span class="c1"># 去重</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 自己的 script</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/.local/bin:</span><span class="nv">$PATH</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/bin:</span><span class="nv">$PATH</span><span class="s2">&#34;</span></span></span></code></pre></div><h2 id="plugin-manager-選型">Plugin Manager 選型</h2>
<p>Zsh plugin manager 的選擇很多，差異主要在載入速度和功能豐富度：</p>
<ul>
<li><strong>無 plugin manager</strong>：直接 git clone plugin 到某個目錄，手動 source。最簡單、最透明、但更新要自己管</li>
<li><strong>zinit</strong>（原 zplugin）：載入速度最快（turbo mode 延遲載入）、功能最多、但配置語法學習曲線高</li>
<li><strong>antidote</strong>：宣告式（一個 <code>.zsh_plugins.txt</code> 列出所有 plugin），概念簡單</li>
<li><strong>sheldon</strong>：Rust 寫的、速度快、設定用 TOML</li>
</ul>
<p>常用 plugin：</p>
<ul>
<li><strong>zsh-autosuggestions</strong>：根據歷史指令自動補全建議（灰色字，按右箭頭接受）</li>
<li><strong>zsh-syntax-highlighting</strong>：指令行即時語法高亮</li>
<li><strong>zsh-completions</strong>：額外的 tab 補全定義</li>
</ul>
<h2 id="prompt-設計">Prompt 設計</h2>
<p>Prompt 是每次按 Enter 都會看到的東西，值得花時間設計但不需要複雜。</p>
<p>基本款（不用框架）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 顯示目錄 + git branch</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">autoload -Uz vcs_info
</span></span><span class="line"><span class="ln">3</span><span class="cl">precmd<span class="o">()</span> <span class="o">{</span> vcs_info <span class="o">}</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">zstyle <span class="s1">&#39;:vcs_info:git:*&#39;</span> formats <span class="s1">&#39; (%b)&#39;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nv">PROMPT</span><span class="o">=</span><span class="s1">&#39;%F{blue}%~%f%F{green}${vcs_info_msg_0_}%f %# &#39;</span></span></span></code></pre></div><p>框架款：Starship（跨 shell、用 TOML 設定、Rust 寫的速度快）是目前最常被推薦的 prompt 工具。它的配置進 <code>~/.config/starship.toml</code>，也是 dotfile 的一部分。</p>
<h2 id="dotfile-結構對應">Dotfile 結構對應</h2>
<p><a href="/blog/linux/dotfile/01-dotfile-management/" data-link-title="模組一：管理工具與目錄結構" data-link-desc="要把散落在家目錄的配置檔集中版控時，選 bare repo、stow 還是 chezmoi、目錄該怎麼組織">管理工具與目錄結構</a>裡的 stow 目錄結構，shell 配置的對應：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">~/dotfiles/
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">└── zsh/
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    ├── .zshenv
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    ├── .zshrc
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    └── .config/
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        └── zsh/
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">            ├── aliases.zsh
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            ├── functions.zsh
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            ├── plugins.zsh
</span></span><span class="line"><span class="ln">10</span><span class="cl">            ├── prompt.zsh
</span></span><span class="line"><span class="ln">11</span><span class="cl">            ├── tools.zsh
</span></span><span class="line"><span class="ln">12</span><span class="cl">            └── env.zsh</span></span></code></pre></div><p><code>stow zsh</code> 會在家目錄建立 <code>.zshenv</code> 和 <code>.zshrc</code> 的 symlink，在 <code>.config/zsh/</code> 下建立各模組檔案的 symlink。<code>local.zsh</code> 不在 repo 裡，各機器自己建。</p>
]]></content:encoded></item></channel></rss>