<?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>模組三：終端機與編輯器 on Tarragon</title><link>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/</link><description>Recent content in 模組三：終端機與編輯器 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/linux/dotfile/03-terminal-ecosystem/index.xml" rel="self" type="application/rss+xml"/><item><title>Terminal Emulator 配置</title><link>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/terminal-emulator-config/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/terminal-emulator-config/</guid><description>&lt;p>Terminal emulator 是你看到的那個「視窗」本身——字型渲染、配色、透明度、快捷鍵、分頁行為。常見的選擇和它們的配置檔位置：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Terminal&lt;/th>
 &lt;th>OS&lt;/th>
 &lt;th>配置格式&lt;/th>
 &lt;th>配置路徑&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Alacritty&lt;/td>
 &lt;td>跨平台&lt;/td>
 &lt;td>TOML&lt;/td>
 &lt;td>&lt;code>~/.config/alacritty/alacritty.toml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Kitty&lt;/td>
 &lt;td>跨平台&lt;/td>
 &lt;td>自定義 key=value&lt;/td>
 &lt;td>&lt;code>~/.config/kitty/kitty.conf&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>WezTerm&lt;/td>
 &lt;td>跨平台&lt;/td>
 &lt;td>Lua&lt;/td>
 &lt;td>&lt;code>~/.config/wezterm/wezterm.lua&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>iTerm2&lt;/td>
 &lt;td>macOS&lt;/td>
 &lt;td>plist（GUI 設定）&lt;/td>
 &lt;td>可匯出 JSON profile&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Foot&lt;/td>
 &lt;td>Linux/Wayland&lt;/td>
 &lt;td>INI&lt;/td>
 &lt;td>&lt;code>~/.config/foot/foot.ini&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Windows Terminal&lt;/td>
 &lt;td>Windows&lt;/td>
 &lt;td>JSON&lt;/td>
 &lt;td>特定路徑下的 settings.json&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Dotfile 管理的判讀：配置格式是純文字（TOML/Lua/INI/JSON）的 terminal emulator，配置檔可以直接進 dotfile repo。iTerm2 這種以 GUI 面板為主的，要用它的匯出功能另外處理。&lt;/p>
&lt;p>選型建議：如果跨 macOS + Linux 雙平台，Alacritty 或 WezTerm 的「一份配置兩邊通用」是明確優勢。如果只在 Linux 上用 Wayland，Foot 是輕量首選。&lt;/p>
&lt;h2 id="該放進配置的核心項目">該放進配置的核心項目&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>字型&lt;/strong>：字型家族、大小、行高。建議使用 Nerd Font（含 icon glyph 的程式字型），很多 TUI 工具和 prompt 依賴這些 glyph&lt;/li>
&lt;li>&lt;strong>配色&lt;/strong>：前景/背景色、ANSI 16 色的定義。配色方案（Catppuccin、Tokyo Night、Gruvbox 等）通常有各 terminal 的預設配置檔可直接套用&lt;/li>
&lt;li>&lt;strong>快捷鍵&lt;/strong>：分頁/分割畫面的快捷鍵。注意跟 tmux/zellij 的快捷鍵衝突問題&lt;/li>
&lt;li>&lt;strong>渲染&lt;/strong>：GPU 加速、字型 hinting、抗鋸齒設定&lt;/li>
&lt;/ul>
&lt;h2 id="配色系統的跨工具一致性">配色系統的跨工具一致性&lt;/h2>
&lt;p>配色方案（color scheme）會同時影響 terminal emulator、editor、tmux status bar、shell prompt。用同一套配色方案（例如 Catppuccin Mocha）跨工具統一視覺是 rice 的基礎。&lt;/p>
&lt;p>管理方式：&lt;/p>
&lt;ul>
&lt;li>每個工具各自的配色設定檔都放進 dotfile repo&lt;/li>
&lt;li>主題選擇集中記錄（例如 dotfile repo 的 README 寫「全域使用 Catppuccin Mocha」），換主題時有對照清單知道要改哪些檔案&lt;/li>
&lt;li>部分配色方案提供「一鍵安裝腳本」涵蓋多個工具，也可以放在 bootstrap script 裡&lt;/li>
&lt;/ul>
&lt;h2 id="字型管理">字型管理&lt;/h2>
&lt;p>Nerd Font 是需要安裝在系統上的，不是單純的配置檔。處理方式：&lt;/p>
&lt;ul>
&lt;li>macOS：Brewfile 裡加 &lt;code>cask &amp;quot;font-hack-nerd-font&amp;quot;&lt;/code>（透過 homebrew-cask-fonts tap）&lt;/li>
&lt;li>Linux：套件管理器安裝或手動下載到 &lt;code>~/.local/share/fonts/&lt;/code>&lt;/li>
&lt;li>字型檔案本身不進 dotfile repo（太大、有版權），只記錄「安裝哪個字型」在套件清單或 bootstrap script 裡&lt;/li>
&lt;/ul>
&lt;p>安裝字型後如果畫面仍然顯示豆腐方塊，原因通常不是字型沒裝好，而是顯示它的程式在安裝之前就已啟動。每個 process 的可用字型集合在啟動時決定，之後新裝的字型對它不可見——需要重啟該程式才生效。詳見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">字型的可用集合在 process 啟動時決定&lt;/a>。fontconfig 的工具分工與 fallback 機制見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/fontconfig/" data-link-title="fontconfig — 字型搜尋、匹配與 fallback 服務" data-link-desc="不確定 fc-list / fc-match / fc-cache 各做什麼、或 fontconfig fallback 機制怎麼運作時回來讀">fontconfig&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Terminal emulator 是你看到的那個「視窗」本身——字型渲染、配色、透明度、快捷鍵、分頁行為。常見的選擇和它們的配置檔位置：</p>
<table>
  <thead>
      <tr>
          <th>Terminal</th>
          <th>OS</th>
          <th>配置格式</th>
          <th>配置路徑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Alacritty</td>
          <td>跨平台</td>
          <td>TOML</td>
          <td><code>~/.config/alacritty/alacritty.toml</code></td>
      </tr>
      <tr>
          <td>Kitty</td>
          <td>跨平台</td>
          <td>自定義 key=value</td>
          <td><code>~/.config/kitty/kitty.conf</code></td>
      </tr>
      <tr>
          <td>WezTerm</td>
          <td>跨平台</td>
          <td>Lua</td>
          <td><code>~/.config/wezterm/wezterm.lua</code></td>
      </tr>
      <tr>
          <td>iTerm2</td>
          <td>macOS</td>
          <td>plist（GUI 設定）</td>
          <td>可匯出 JSON profile</td>
      </tr>
      <tr>
          <td>Foot</td>
          <td>Linux/Wayland</td>
          <td>INI</td>
          <td><code>~/.config/foot/foot.ini</code></td>
      </tr>
      <tr>
          <td>Windows Terminal</td>
          <td>Windows</td>
          <td>JSON</td>
          <td>特定路徑下的 settings.json</td>
      </tr>
  </tbody>
</table>
<p>Dotfile 管理的判讀：配置格式是純文字（TOML/Lua/INI/JSON）的 terminal emulator，配置檔可以直接進 dotfile repo。iTerm2 這種以 GUI 面板為主的，要用它的匯出功能另外處理。</p>
<p>選型建議：如果跨 macOS + Linux 雙平台，Alacritty 或 WezTerm 的「一份配置兩邊通用」是明確優勢。如果只在 Linux 上用 Wayland，Foot 是輕量首選。</p>
<h2 id="該放進配置的核心項目">該放進配置的核心項目</h2>
<ul>
<li><strong>字型</strong>：字型家族、大小、行高。建議使用 Nerd Font（含 icon glyph 的程式字型），很多 TUI 工具和 prompt 依賴這些 glyph</li>
<li><strong>配色</strong>：前景/背景色、ANSI 16 色的定義。配色方案（Catppuccin、Tokyo Night、Gruvbox 等）通常有各 terminal 的預設配置檔可直接套用</li>
<li><strong>快捷鍵</strong>：分頁/分割畫面的快捷鍵。注意跟 tmux/zellij 的快捷鍵衝突問題</li>
<li><strong>渲染</strong>：GPU 加速、字型 hinting、抗鋸齒設定</li>
</ul>
<h2 id="配色系統的跨工具一致性">配色系統的跨工具一致性</h2>
<p>配色方案（color scheme）會同時影響 terminal emulator、editor、tmux status bar、shell prompt。用同一套配色方案（例如 Catppuccin Mocha）跨工具統一視覺是 rice 的基礎。</p>
<p>管理方式：</p>
<ul>
<li>每個工具各自的配色設定檔都放進 dotfile repo</li>
<li>主題選擇集中記錄（例如 dotfile repo 的 README 寫「全域使用 Catppuccin Mocha」），換主題時有對照清單知道要改哪些檔案</li>
<li>部分配色方案提供「一鍵安裝腳本」涵蓋多個工具，也可以放在 bootstrap script 裡</li>
</ul>
<h2 id="字型管理">字型管理</h2>
<p>Nerd Font 是需要安裝在系統上的，不是單純的配置檔。處理方式：</p>
<ul>
<li>macOS：Brewfile 裡加 <code>cask &quot;font-hack-nerd-font&quot;</code>（透過 homebrew-cask-fonts tap）</li>
<li>Linux：套件管理器安裝或手動下載到 <code>~/.local/share/fonts/</code></li>
<li>字型檔案本身不進 dotfile repo（太大、有版權），只記錄「安裝哪個字型」在套件清單或 bootstrap script 裡</li>
</ul>
<p>安裝字型後如果畫面仍然顯示豆腐方塊，原因通常不是字型沒裝好，而是顯示它的程式在安裝之前就已啟動。每個 process 的可用字型集合在啟動時決定，之後新裝的字型對它不可見——需要重啟該程式才生效。詳見 <a href="/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">字型的可用集合在 process 啟動時決定</a>。fontconfig 的工具分工與 fallback 機制見 <a href="/blog/linux/dotfile/knowledge-cards/fontconfig/" data-link-title="fontconfig — 字型搜尋、匹配與 fallback 服務" data-link-desc="不確定 fc-list / fc-match / fc-cache 各做什麼、或 fontconfig fallback 機制怎麼運作時回來讀">fontconfig</a>。</p>
]]></content:encoded></item><item><title>Multiplexer：tmux vs zellij</title><link>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/multiplexer-tmux-zellij/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/multiplexer-tmux-zellij/</guid><description>&lt;p>Multiplexer 在一個終端機視窗裡切分多個 pane、管理多個 session、SSH 斷線後保持 session 存活。&lt;/p>
&lt;h2 id="tmux">tmux&lt;/h2>
&lt;p>tmux 是最成熟、生態最廣的選擇。配置在 &lt;code>~/.config/tmux/tmux.conf&lt;/code>（新版）或 &lt;code>~/.tmux.conf&lt;/code>（傳統位置）。&lt;/p>
&lt;h3 id="核心配置項目">核心配置項目&lt;/h3>





&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"># prefix key（預設是 Ctrl-b，很多人改成 Ctrl-a）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">unbind C-b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -g prefix C-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> C-a send-prefix
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="c1"># 分割 pane 的快捷鍵（預設不直覺，改成 | 和 -）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> &lt;span class="p">|&lt;/span> split-window -h -c &lt;span class="s2">&amp;#34;#{pane_current_path}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> - split-window -v -c &lt;span class="s2">&amp;#34;#{pane_current_path}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="c1"># 用 vim 風格的 hjkl 切換 pane&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> h &lt;span class="k">select&lt;/span>-pane -L
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> j &lt;span class="k">select&lt;/span>-pane -D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> k &lt;span class="k">select&lt;/span>-pane -U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> l &lt;span class="k">select&lt;/span>-pane -R
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl">&lt;span class="c1"># 啟用滑鼠支援&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -g mouse on
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl">&lt;span class="c1"># 256 色支援&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -g default-terminal &lt;span class="s2">&amp;#34;tmux-256color&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -ag terminal-overrides &lt;span class="s2">&amp;#34;,xterm-256color:RGB&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl">&lt;span class="c1"># status bar 位置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -g status-position top&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="tmux-plugin">tmux plugin&lt;/h3>
&lt;p>用 TPM（Tmux Plugin Manager）管理，常用：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>tmux-sensible&lt;/strong>：合理的預設值&lt;/li>
&lt;li>&lt;strong>tmux-resurrect&lt;/strong>：重開機後還原 session 佈局&lt;/li>
&lt;li>&lt;strong>tmux-continuum&lt;/strong>：自動儲存 session&lt;/li>
&lt;/ul>
&lt;h2 id="zellij">zellij&lt;/h2>
&lt;p>zellij 是較新的替代品，Rust 寫的，內建佈局系統、tab 命名、浮動 pane。配置在 &lt;code>~/.config/zellij/config.kdl&lt;/code>（KDL 格式）。&lt;/p>
&lt;p>跟 tmux 的主要差異：&lt;/p>
&lt;ul>
&lt;li>開箱即用的 UI 提示（底部顯示可用快捷鍵），學習曲線較低&lt;/li>
&lt;li>佈局用 KDL 宣告式描述，比 tmux 的 script 式設定更容易管理&lt;/li>
&lt;li>Plugin 系統用 WASM，跟 tmux 的 bash script 式 plugin 不同&lt;/li>
&lt;li>生態較新、plugin 和整合沒有 tmux 多&lt;/li>
&lt;/ul>
&lt;h2 id="選型判讀">選型判讀&lt;/h2>
&lt;p>已經熟 tmux 的人通常沒有強烈理由遷移；從零開始的人 zellij 的上手成本更低。&lt;/p>
&lt;h2 id="深入">深入&lt;/h2>
&lt;p>這篇是多工器的概覽（在終端機生態裡的定位、tmux 與 zellij 的取捨）。把它們當「遠端工作工具」深入用——session 持久化的核心概念、遠端斷線接回、瀏覽器連遠端 session——見工具選單的深度頁：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 持久化與基礎&lt;/a>——session 持久化怎麼保住遠端工作。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">zellij 分頁與 pane&lt;/a>——內建佈局的操作深入。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">zellij 遠端 web 客戶端&lt;/a>——從瀏覽器連遠端 session。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/linux/tools/remote/connection-and-sync-tools/" data-link-title="遠端連線與同步工具選型：連得穩、斷得起、檔案一致" data-link-desc="遠端工作要挑連線與檔案同步工具、在 ssh/mosh/autossh 之間、或 rsync/sshfs/mutagen 之間拿不定、想知道各自解哪個問題與代價時回來讀">遠端連線與同步工具選型&lt;/a>——多工器之外的連線（mosh/autossh）與同步（rsync/sshfs/mutagen）。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Multiplexer 在一個終端機視窗裡切分多個 pane、管理多個 session、SSH 斷線後保持 session 存活。</p>
<h2 id="tmux">tmux</h2>
<p>tmux 是最成熟、生態最廣的選擇。配置在 <code>~/.config/tmux/tmux.conf</code>（新版）或 <code>~/.tmux.conf</code>（傳統位置）。</p>
<h3 id="核心配置項目">核心配置項目</h3>





<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"># prefix key（預設是 Ctrl-b，很多人改成 Ctrl-a）</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">unbind C-b
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nb">set</span> -g prefix C-a
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nb">bind</span> C-a send-prefix
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1"># 分割 pane 的快捷鍵（預設不直覺，改成 | 和 -）</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nb">bind</span> <span class="p">|</span> split-window -h -c <span class="s2">&#34;#{pane_current_path}&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="nb">bind</span> - split-window -v -c <span class="s2">&#34;#{pane_current_path}&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"># 用 vim 風格的 hjkl 切換 pane</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="nb">bind</span> h <span class="k">select</span>-pane -L
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="nb">bind</span> j <span class="k">select</span>-pane -D
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="nb">bind</span> k <span class="k">select</span>-pane -U
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="nb">bind</span> l <span class="k">select</span>-pane -R
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1"># 啟用滑鼠支援</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="nb">set</span> -g mouse on
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="c1"># 256 色支援</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="nb">set</span> -g default-terminal <span class="s2">&#34;tmux-256color&#34;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="nb">set</span> -ag terminal-overrides <span class="s2">&#34;,xterm-256color:RGB&#34;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="c1"># status bar 位置</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="nb">set</span> -g status-position top</span></span></code></pre></div><h3 id="tmux-plugin">tmux plugin</h3>
<p>用 TPM（Tmux Plugin Manager）管理，常用：</p>
<ul>
<li><strong>tmux-sensible</strong>：合理的預設值</li>
<li><strong>tmux-resurrect</strong>：重開機後還原 session 佈局</li>
<li><strong>tmux-continuum</strong>：自動儲存 session</li>
</ul>
<h2 id="zellij">zellij</h2>
<p>zellij 是較新的替代品，Rust 寫的，內建佈局系統、tab 命名、浮動 pane。配置在 <code>~/.config/zellij/config.kdl</code>（KDL 格式）。</p>
<p>跟 tmux 的主要差異：</p>
<ul>
<li>開箱即用的 UI 提示（底部顯示可用快捷鍵），學習曲線較低</li>
<li>佈局用 KDL 宣告式描述，比 tmux 的 script 式設定更容易管理</li>
<li>Plugin 系統用 WASM，跟 tmux 的 bash script 式 plugin 不同</li>
<li>生態較新、plugin 和整合沒有 tmux 多</li>
</ul>
<h2 id="選型判讀">選型判讀</h2>
<p>已經熟 tmux 的人通常沒有強烈理由遷移；從零開始的人 zellij 的上手成本更低。</p>
<h2 id="深入">深入</h2>
<p>這篇是多工器的概覽（在終端機生態裡的定位、tmux 與 zellij 的取捨）。把它們當「遠端工作工具」深入用——session 持久化的核心概念、遠端斷線接回、瀏覽器連遠端 session——見工具選單的深度頁：</p>
<ul>
<li><a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 持久化與基礎</a>——session 持久化怎麼保住遠端工作。</li>
<li><a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">zellij 分頁與 pane</a>——內建佈局的操作深入。</li>
<li><a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">zellij 遠端 web 客戶端</a>——從瀏覽器連遠端 session。</li>
<li><a href="/blog/linux/tools/remote/connection-and-sync-tools/" data-link-title="遠端連線與同步工具選型：連得穩、斷得起、檔案一致" data-link-desc="遠端工作要挑連線與檔案同步工具、在 ssh/mosh/autossh 之間、或 rsync/sshfs/mutagen 之間拿不定、想知道各自解哪個問題與代價時回來讀">遠端連線與同步工具選型</a>——多工器之外的連線（mosh/autossh）與同步（rsync/sshfs/mutagen）。</li>
</ul>
]]></content:encoded></item><item><title>Neovim 配置</title><link>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/neovim-config/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/neovim-config/</guid><description>&lt;p>Neovim 的配置是 dotfile 裡最複雜的單一工具——plugin 生態龐大、整個配置系統基於 Lua。Lua 語法基礎見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/lua-scripting-language/" data-link-title="Lua 腳本語言" data-link-desc="在 Hyprland 或 Neovim 配置檔遇到 Lua 語法看不懂時回來讀 — 配置檔需要的最小 Lua 知識">Lua 腳本語言&lt;/a>。&lt;/p>
&lt;p>配置路徑：&lt;code>~/.config/nvim/&lt;/code>&lt;/p>
&lt;h2 id="配置結構">配置結構&lt;/h2>





&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">~/.config/nvim/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">├── init.lua # 入口，source 其他模組
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">├── lua/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">│ ├── options.lua # 基本設定（行號、tab 寬度、搜尋行為）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">│ ├── keymaps.lua # 快捷鍵
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">│ ├── autocmds.lua # 自動指令
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">│ └── plugins/ # 各 plugin 的配置
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">│ ├── init.lua # plugin manager 載入
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">│ ├── lsp.lua # LSP 設定
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">│ ├── telescope.lua # fuzzy finder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">│ ├── treesitter.lua
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">│ └── ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">└── lazy-lock.json # lazy.nvim 的 lockfile（要進 Git）&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="是否該用預設配置包">是否該用預設配置包&lt;/h2>
&lt;p>LazyVim、NvChad、AstroNvim 這類預設配置包提供了一整套開箱即用的 neovim 設定。判讀：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用預設配置包&lt;/strong>：想要快速可用的 IDE-like 體驗、不想花時間逐一選 plugin 和配置。Dotfile 裡放的是「對預設的覆寫」&lt;/li>
&lt;li>&lt;strong>自己從零組&lt;/strong>：想完全理解每一個 plugin 做什麼、容忍前期投入時間。Dotfile 裡放的是完整配置&lt;/li>
&lt;/ul>
&lt;p>兩種都是 dotfile 管理的合法對象。差異在出問題時的除錯路徑：自己組的知道每一行做什麼，預設配置包的要先理解它的分層才能改。&lt;/p>
&lt;h2 id="dotfile-結構對應">Dotfile 結構對應&lt;/h2>





&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">├── alacritty/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">│ └── .config/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">│ └── alacritty/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">│ └── alacritty.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">├── tmux/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">│ └── .config/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">│ └── tmux/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">│ └── tmux.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">├── nvim/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">│ └── .config/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">│ └── nvim/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">│ ├── init.lua
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">│ ├── lazy-lock.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">│ └── lua/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl">│ └── ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl">└── zellij/ # 如果用 zellij
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> └── .config/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> └── zellij/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> └── config.kdl&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每個工具是獨立的 stow package，可以在不同機器選擇性安裝。例如伺服器只 &lt;code>stow tmux nvim&lt;/code>、桌面機才加 &lt;code>stow alacritty&lt;/code>。&lt;/p></description><content:encoded><![CDATA[<p>Neovim 的配置是 dotfile 裡最複雜的單一工具——plugin 生態龐大、整個配置系統基於 Lua。Lua 語法基礎見 <a href="/blog/linux/dotfile/knowledge-cards/lua-scripting-language/" data-link-title="Lua 腳本語言" data-link-desc="在 Hyprland 或 Neovim 配置檔遇到 Lua 語法看不懂時回來讀 — 配置檔需要的最小 Lua 知識">Lua 腳本語言</a>。</p>
<p>配置路徑：<code>~/.config/nvim/</code></p>
<h2 id="配置結構">配置結構</h2>





<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">~/.config/nvim/
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">├── init.lua              # 入口，source 其他模組
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">├── lua/
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">│   ├── options.lua       # 基本設定（行號、tab 寬度、搜尋行為）
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">│   ├── keymaps.lua       # 快捷鍵
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">│   ├── autocmds.lua      # 自動指令
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">│   └── plugins/          # 各 plugin 的配置
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">│       ├── init.lua      # plugin manager 載入
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">│       ├── lsp.lua       # LSP 設定
</span></span><span class="line"><span class="ln">10</span><span class="cl">│       ├── telescope.lua # fuzzy finder
</span></span><span class="line"><span class="ln">11</span><span class="cl">│       ├── treesitter.lua
</span></span><span class="line"><span class="ln">12</span><span class="cl">│       └── ...
</span></span><span class="line"><span class="ln">13</span><span class="cl">└── lazy-lock.json        # lazy.nvim 的 lockfile（要進 Git）</span></span></code></pre></div><h2 id="是否該用預設配置包">是否該用預設配置包</h2>
<p>LazyVim、NvChad、AstroNvim 這類預設配置包提供了一整套開箱即用的 neovim 設定。判讀：</p>
<ul>
<li><strong>用預設配置包</strong>：想要快速可用的 IDE-like 體驗、不想花時間逐一選 plugin 和配置。Dotfile 裡放的是「對預設的覆寫」</li>
<li><strong>自己從零組</strong>：想完全理解每一個 plugin 做什麼、容忍前期投入時間。Dotfile 裡放的是完整配置</li>
</ul>
<p>兩種都是 dotfile 管理的合法對象。差異在出問題時的除錯路徑：自己組的知道每一行做什麼，預設配置包的要先理解它的分層才能改。</p>
<h2 id="dotfile-結構對應">Dotfile 結構對應</h2>





<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">├── alacritty/
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">│   └── .config/
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">│       └── alacritty/
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">│           └── alacritty.toml
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">├── tmux/
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">│   └── .config/
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">│       └── tmux/
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">│           └── tmux.conf
</span></span><span class="line"><span class="ln">10</span><span class="cl">├── nvim/
</span></span><span class="line"><span class="ln">11</span><span class="cl">│   └── .config/
</span></span><span class="line"><span class="ln">12</span><span class="cl">│       └── nvim/
</span></span><span class="line"><span class="ln">13</span><span class="cl">│           ├── init.lua
</span></span><span class="line"><span class="ln">14</span><span class="cl">│           ├── lazy-lock.json
</span></span><span class="line"><span class="ln">15</span><span class="cl">│           └── lua/
</span></span><span class="line"><span class="ln">16</span><span class="cl">│               └── ...
</span></span><span class="line"><span class="ln">17</span><span class="cl">└── zellij/                    # 如果用 zellij
</span></span><span class="line"><span class="ln">18</span><span class="cl">    └── .config/
</span></span><span class="line"><span class="ln">19</span><span class="cl">        └── zellij/
</span></span><span class="line"><span class="ln">20</span><span class="cl">            └── config.kdl</span></span></code></pre></div><p>每個工具是獨立的 stow package，可以在不同機器選擇性安裝。例如伺服器只 <code>stow tmux nvim</code>、桌面機才加 <code>stow alacritty</code>。</p>
]]></content:encoded></item></channel></rss>