<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PSReadLine on kenji.blog</title><link>http://kenji.blog/zh-tw/tags/psreadline/</link><description>Recent content in PSReadLine on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-tw/tags/psreadline/index.xml" rel="self" type="application/rss+xml"/><item><title>給開發者的終端機（PowerShell/Bash）效率化快捷鍵</title><link>http://kenji.blog/zh-tw/p/terminal-efficiency-powershell-bash-shortcuts/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/terminal-efficiency-powershell-bash-shortcuts/</guid><description>&lt;img src="http://kenji.blog/p/terminal-efficiency-powershell-bash-shortcuts/img/eyecatch.jpg" alt="Featured image of post 給開發者的終端機（PowerShell/Bash）效率化快捷鍵" />&lt;h1 id="前言終端機操作效率化帶來的壓倒性生產力提升">前言：終端機操作效率化帶來的壓倒性生產力提升
&lt;/h1>&lt;p>在現代軟體開發中，終端機（命令列介面）是開發者的「手足」，也是最重要的工具。無論是雲端基礎設施的管理、容器的建置、使用 Git 進行版本控制，還是執行各種腳本，可以毫不誇張地說，開發者一天中的大部分時間都在終端機上度過。&lt;/p>
&lt;p>然而，許多開發者雖然熟練掌握了終端機的基本指令（如 &lt;code>cd&lt;/code>, &lt;code>ls&lt;/code>, &lt;code>git&lt;/code>, &lt;code>docker&lt;/code> 等），卻往往忽略了**「將終端機的輸入本身最佳化」**這個觀點。伸手去拿滑鼠、移動游標、連按方向鍵來修正指令的錯字……這些微小損失的累積，長久下來將導致龐大的時間浪費與認知負荷。&lt;/p>
&lt;p>本文將基於「雙手不離開鍵盤」的哲學，針對在 Bash 及 PowerShell 環境下如何將終端機操作效率達到極致，非常詳細且技術性地解說快捷鍵、按鍵綁定設定、歷史紀錄搜尋的最佳化，以及終端機多工器（Terminal Multiplexer）的活用方法。&lt;/p>
&lt;hr>
&lt;h1 id="1-理論背景按鍵層次模型klm與時間成本的公式化">1. 理論背景：按鍵層次模型（KLM）與時間成本的公式化
&lt;/h1>&lt;p>為了定量理解效率化帶來的好處，讓我們引入在 HCI（人機互動）領域中使用的 &lt;strong>GOMS 模型&lt;/strong>的一種，即**按鍵層次模型（Keystroke-Level Model, KLM）**來思考。&lt;/p>
&lt;p>KLM 是一種用於預測熟練使用者完成特定無錯誤任務所需時間的模型。任務的執行時間 $T_{execute}$ 可用以下數學方程式來定義：&lt;/p>
$$ T_{execute} = \sum_{i} \left( K \cdot t_{k} + P \cdot t_{p} + H \cdot t_{h} + M \cdot t_{m} + R \cdot t_{r} \right) $$&lt;p>這裡，各個變數代表以下含義：&lt;/p>
&lt;ul>
&lt;li>$K$ : 按鍵（Keystroking）。按下鍵盤按鍵一次的動作。&lt;/li>
&lt;li>$P$ : 指向（Pointing）。使用滑鼠等指標裝置指向目標的動作。&lt;/li>
&lt;li>$H$ : 歸位（Homing）。手從鍵盤移動到滑鼠，或從滑鼠移回鍵盤的動作。&lt;/li>
&lt;li>$M$ : 心智準備（Mental preparation）。為了計畫與準備下一個實體動作的認知思考時間。&lt;/li>
&lt;li>$R$ : 系統回應（System Response）。使用者等待的時間。&lt;/li>
&lt;/ul>
&lt;p>各動作的平均所需時間（$t$），一般估算如下：&lt;/p>
&lt;ul>
&lt;li>$t_{k} \approx 0.2$ 秒 （針對熟練的打字者）&lt;/li>
&lt;li>$t_{p} \approx 1.1$ 秒&lt;/li>
&lt;li>$t_{h} \approx 0.4$ 秒&lt;/li>
&lt;li>$t_{m} \approx 1.35$ 秒&lt;/li>
&lt;/ul>
&lt;p>在終端機操作中，若試圖使用方向鍵或滑鼠來修正部分指令，就會產生歸位（$H$）與指向（$P$），每次修正大約會產生 1.5 秒到 2.0 秒的延遲懲罰。另一方面，如果掌握了適當的終端機快捷鍵，就能將 $H$ 和 $P$ 壓低至 &lt;strong>零&lt;/strong>，僅靠按鍵（$K$）即可達成目的。&lt;/p>
$$ 500 \text{次/日} \times 2 \text{秒} = 1000 \text{秒/日} \approx 16.6 \text{分鐘/日} $$&lt;p>
將這換算成一年（240 個工作日），就等於節省了**約 66 小時（約 8 個工作日）&lt;strong>的時間。更重要的是，藉由減少心智準備（$M$），還能獲得&lt;/strong>「思考不中斷（維持心流狀態）」**這個無可估量的巨大好處。&lt;/p>
&lt;hr>
&lt;h1 id="2-bash-readline-與-emacs-按鍵綁定的深淵">2. Bash Readline 與 Emacs 按鍵綁定的深淵
&lt;/h1>&lt;p>做為 Linux 與 macOS 預設 shell 的 Bash，內部使用的是名為 &lt;strong>GNU Readline&lt;/strong> 的函式庫來處理命令列的輸入。這個 Readline 的預設設定為 &lt;strong>Emacs 按鍵綁定&lt;/strong>，而掌握它正是終端機效率化的第一步。&lt;/p>
&lt;h2 id="21-移動類快捷鍵">2.1. 移動類快捷鍵
&lt;/h2>&lt;p>使用方向鍵將游標逐字元移動，是效率低下的極致。請將以下快捷鍵刻入「肌肉記憶（Muscle Memory）」中。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + A&lt;/code>&lt;/strong> : 移動到行首（Start of line）。非常常用。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + E&lt;/code>&lt;/strong> : 移動到行尾（End of line）。&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + B&lt;/code>&lt;/strong> (Meta+B) : 往回移動一個單字（Backward word）。以斜線或空白為分隔符，以單字為單位進行高速移動。&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + F&lt;/code>&lt;/strong> (Meta+F) : 往前移動一個單字（Forward word）。&lt;/li>
&lt;/ul>
&lt;pre class="mermaid">
flowchart LR
Start[&amp;#34;行首 (Ctrl+A)&amp;#34;] --- Cursor[&amp;#34;目前游標位置&amp;#34;]
Cursor --- End[&amp;#34;行尾 (Ctrl+E)&amp;#34;]
Cursor --&amp;gt; BackwardWord[&amp;#34;往回一個單字 (Alt+B)&amp;#34;]
Cursor --&amp;gt; ForwardWord[&amp;#34;往前一個單字 (Alt+F)&amp;#34;]
&lt;/pre>
&lt;h2 id="22-編輯類快捷鍵剪下與貼上--kill-and-yank">2.2. 編輯類快捷鍵（剪下與貼上 / Kill and Yank）
&lt;/h2>&lt;p>在 Emacs 術語中，剪下文字被稱為「Kill」，而貼上被稱為「Yank」。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + U&lt;/code>&lt;/strong> : 從游標位置 Kill（刪除）到行首。在密碼輸入錯誤，或是想重新輸入指令時，能一瞬間清空。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + K&lt;/code>&lt;/strong> : 從游標位置 Kill 到行尾。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + W&lt;/code>&lt;/strong> : 刪除游標位置前的一個單字。在刪除一個參數並重寫時非常方便。&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + D&lt;/code>&lt;/strong> (Meta+D) : 刪除游標位置後的一個單字。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + Y&lt;/code>&lt;/strong> : Yank（貼上）最後一次 Kill 的內容。可以實現進階用法，例如：移動到另一個目錄後，用 &lt;code>Ctrl+Y&lt;/code> 恢復剛才用 &lt;code>Ctrl+U&lt;/code> 刪除的指令。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + _&lt;/code>&lt;/strong> (或 &lt;code>Ctrl + x, Ctrl + u&lt;/code>) : 復原（Undo）。不小心刪除時可以還原。&lt;/li>
&lt;/ul>
&lt;h2 id="23-其他重要快捷鍵">2.3. 其他重要快捷鍵
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + L&lt;/code>&lt;/strong> : 清除畫面（等同於 &lt;code>clear&lt;/code> 指令）。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + C&lt;/code>&lt;/strong> : 取消目前的指令輸入，或中斷執行中的處理程序。&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + D&lt;/code>&lt;/strong> : 傳送 EOF (End Of File)。在沒有輸入文字的狀態下，會結束 shell (&lt;code>exit&lt;/code>)。&lt;/li>
&lt;/ul>
&lt;h2 id="24-透過-inputrc-來自訂-readline">2.4. 透過 ~/.inputrc 來自訂 Readline
&lt;/h2>&lt;p>編輯家目錄下的 &lt;code>~/.inputrc&lt;/code> 檔案，可以將這些按鍵綁定做進一步的最佳化。例如，加入以下設定後，就能使用上下鍵來搜尋符合目前輸入字串開頭的歷史紀錄。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ~/.inputrc 的設定範例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;\e[A&amp;#34;&lt;/span>: history-search-backward
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;\e[B&amp;#34;&lt;/span>: history-search-forward
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">set&lt;/span> completion-ignore-case on
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">set&lt;/span> show-all-if-ambiguous on
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這樣一來，輸入 &lt;code>docker &lt;/code> 後按下上方向鍵，就可以高速尋找過去以 &lt;code>docker&lt;/code> 開頭的指令歷史紀錄。&lt;/p>
&lt;hr>
&lt;h1 id="3-powershell-與-psreadline在-windows-環境下實現類似-bash-的操作">3. PowerShell 與 PSReadLine：在 Windows 環境下實現類似 Bash 的操作
&lt;/h1>&lt;p>Windows 的標準 shell「PowerShell」，在早期版本中只有與命令提示字元（cmd.exe）同等貧乏的輸入環境。然而，隨著導入 &lt;strong>PSReadLine&lt;/strong> 模組，它獲得了媲美甚至超越 Bash (Readline) 的進階命令列編輯功能。&lt;/p>
&lt;h2 id="31-啟用-psreadline-與-emacs-模式">3.1. 啟用 PSReadLine 與 Emacs 模式
&lt;/h2>&lt;p>PowerShell 5.1 以上版本（以及 PowerShell Core）已預設內建 PSReadLine。為了讓 Windows 使用者能將終端機的生產力提升到 Linux 的水準，必須將 PSReadLine 的編輯模式從預設的 Windows（類似 cmd）模式更改為 &lt;strong>Emacs 模式&lt;/strong>。&lt;/p>
&lt;p>編輯 PowerShell 的設定檔（&lt;code>$PROFILE&lt;/code>），讓設定能自動載入。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 在 VS Code 中開啟 $PROFILE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">code&lt;/span> &lt;span class="nv">$PROFILE&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>在 &lt;code>$PROFILE&lt;/code> 加上以下設定：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 匯入 PSReadLine 模組（如果要明確匯入的話）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Module&lt;/span> &lt;span class="n">PSReadLine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 將編輯模式設為 Emacs，並啟用與 Bash 相同的快捷鍵&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineOption&lt;/span> &lt;span class="n">-EditMode&lt;/span> &lt;span class="n">Emacs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 忽略提示音（錯誤音）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineOption&lt;/span> &lt;span class="n">-BellStyle&lt;/span> &lt;span class="n">None&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這樣一來，在 Windows 的 PowerShell 上也能完美使用類似 Emacs/Bash 的按鍵綁定，例如 &lt;code>Ctrl+A&lt;/code>（行首）、&lt;code>Ctrl+E&lt;/code>（行尾）、&lt;code>Ctrl+U&lt;/code>（刪除至行首）、&lt;code>Alt+B&lt;/code> / &lt;code>Alt+F&lt;/code>（單字移動）等。&lt;/p>
&lt;h2 id="32-預測智慧輸入-predictive-intellisense-與進階歷史紀錄搜尋">3.2. 預測智慧輸入 (Predictive IntelliSense) 與進階歷史紀錄搜尋
&lt;/h2>&lt;p>PSReadLine 的強大功能之一是基於輸入歷史紀錄或外部預測外掛的 &lt;strong>Predictive IntelliSense（預測智慧輸入）&lt;/strong>。當開始輸入時，它會以淺灰色（內聯）顯示來自歷史紀錄中最有可能的完整指令建議。如果接受建議，只需按下右方向鍵（或使用 &lt;code>Alt+F&lt;/code> 逐字元接受）即可。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 加到 $PROFILE：啟用預測功能（需要 PowerShell 7.1+ / PSReadLine 2.1+）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineOption&lt;/span> &lt;span class="n">-PredictionSource&lt;/span> &lt;span class="nb">History
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineOption&lt;/span> &lt;span class="n">-PredictionViewStyle&lt;/span> &lt;span class="n">InlineView&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 若想以清單格式顯示，請指定 ListView&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Set-PSReadLineOption -PredictionViewStyle ListView&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="33-覆寫上下鍵的行為類似-bash-的前綴相符搜尋">3.3. 覆寫上下鍵的行為（類似 Bash 的前綴相符搜尋）
&lt;/h2>&lt;p>PowerShell 預設的上下方向鍵只是單純的依序移動歷史紀錄。我們將其重新對應為「搜尋與目前輸入字串開頭相符的歷史紀錄」，就如同前面提到的 &lt;code>~/.inputrc&lt;/code> 一樣。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 加到 $PROFILE：註冊歷史紀錄前綴相符搜尋處理程序&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineKeyHandler&lt;/span> &lt;span class="n">-Key&lt;/span> &lt;span class="n">UpArrow&lt;/span> &lt;span class="n">-Function&lt;/span> &lt;span class="n">HistorySearchBackward&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PSReadLineKeyHandler&lt;/span> &lt;span class="n">-Key&lt;/span> &lt;span class="n">DownArrow&lt;/span> &lt;span class="n">-Function&lt;/span> &lt;span class="n">HistorySearchForward&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這樣一來，即使在 Windows 環境下，也能用與 Linux 完全相同的手指動作，直覺地建構、搜尋與執行指令。在跨平台間統一認知負荷（$M$），對 DevOps 工程師來說極為重要。&lt;/p>
&lt;hr>
&lt;h1 id="4-歷史紀錄搜尋的極致整合-fzf-fuzzy-finder">4. 歷史紀錄搜尋的極致：整合 fzf (Fuzzy Finder)
&lt;/h1>&lt;p>在終端機操作中，最頻繁執行的動作之一就是**「從歷史紀錄中找出過去執行過的複雜指令並重新執行」**。標準的 &lt;code>Ctrl+R&lt;/code>（反向搜尋）是完全比對，因此很難從「好像是 docker run 並且掛載了 volume&amp;hellip;」這種模糊的記憶中把指令找出來。&lt;/p>
&lt;p>用 Go 語言編寫的超高速通用模糊搜尋工具 &lt;strong>&lt;code>fzf&lt;/code>&lt;/strong>，優雅地解決了這個問題。&lt;/p>
&lt;h2 id="41-透過-fzf-進行模糊搜尋的管線">4.1. 透過 fzf 進行模糊搜尋的管線
&lt;/h2>&lt;p>將 &lt;code>fzf&lt;/code> 整合到指令歷史紀錄搜尋中時，將會透過以下管線進行處理。&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;使用者輸入 (Ctrl+R)&amp;#34;] --&amp;gt; B[&amp;#34;fzf 攔截按鍵&amp;#34;]
B --&amp;gt; C[&amp;#34;讀取 .bash_history 或 PSReadLine 歷史檔案&amp;#34;]
C --&amp;gt; D{&amp;#34;模糊比對引擎 (Go)&amp;#34;}
D --&amp;gt; E[&amp;#34;在終端機更新互動式選取 UI&amp;#34;]
E --&amp;gt; F[&amp;#34;使用者選取指令 (Enter)&amp;#34;]
F --&amp;gt; G[&amp;#34;將選取的指令傳回 Shell 緩衝區&amp;#34;]
G --&amp;gt; H[&amp;#34;執行或編輯指令&amp;#34;]
&lt;/pre>
&lt;p>當使用者輸入以空白分隔的多個關鍵字（例如：&lt;code>docker ubuntu bash&lt;/code>）時，fzf 的比對引擎會掃描整個歷史紀錄檔，瞬間列出包含這些關鍵字（不拘順序、距離可遠可近）的歷史紀錄。&lt;/p>
&lt;h2 id="42-在-bash-中整合-fzf">4.2. 在 Bash 中整合 fzf
&lt;/h2>&lt;p>在 Ubuntu/Debian 等 Linux 環境下，可以輕鬆地使用 apt 進行安裝。此外，執行安裝腳本後，Bash 的按鍵綁定會自動被覆寫。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安裝 fzf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --depth &lt;span class="m">1&lt;/span> https://github.com/junegunn/fzf.git ~/.fzf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">~/.fzf/install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這樣一來，按下 &lt;code>Ctrl+R&lt;/code> 後，fzf 的互動式 UI 就會在全螢幕（或 tmux 的窗格內）彈出，讓你能夠極為直覺地搜尋歷史紀錄。在搜尋 UI 上，可以透過 &lt;code>Ctrl+N&lt;/code>（下）/ &lt;code>Ctrl+P&lt;/code>（上）來選取項目。&lt;/p>
&lt;h2 id="43-在-powershell-中整合-psfzf">4.3. 在 PowerShell 中整合 PSFzf
&lt;/h2>&lt;p>在 Windows PowerShell 環境下，使用 &lt;code>PSFzf&lt;/code> 模組也能獲得完全相同的體驗。首先安裝 fzf 的執行檔（使用 Scoop 等工具很方便），接著導入模組。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 透過 Scoop 安裝 fzf 執行檔&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scoop&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">fzf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 安裝 PSFzf 模組&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Install-Module&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="n">PSFzf&lt;/span> &lt;span class="n">-Scope&lt;/span> &lt;span class="n">CurrentUser&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>然後，在 &lt;code>$PROFILE&lt;/code> 中新增設定並綁定按鍵。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 加到 $PROFILE 中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Module&lt;/span> &lt;span class="n">PSFzf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 將 Ctrl+R 對應到 fzf 的歷史紀錄搜尋&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-PsFzfOption&lt;/span> &lt;span class="n">-PSReadlineChordReverseHistorySearch&lt;/span> &lt;span class="s1">&amp;#39;Ctrl+r&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這下子，在 Windows 也能使用 &lt;code>Ctrl+R&lt;/code>，一瞬間對過去龐大的 PowerShell 歷史紀錄進行模糊搜尋了。&lt;/p>
&lt;hr>
&lt;h1 id="5-透過別名alias與包裝函式wrapper-function將按鍵次數最小化">5. 透過別名（Alias）與包裝函式（Wrapper Function）將按鍵次數最小化
&lt;/h1>&lt;p>除了快捷鍵和歷史紀錄搜尋外，最直接減少按鍵（$K$）本身的方法，就是定義別名（Alias）與包裝函式。&lt;/p>
&lt;h2 id="51-git-操作的極小化">5.1. Git 操作的極小化
&lt;/h2>&lt;p>我們每天會使用無數次的 Git。每次都要完整拼出 &lt;code>git status&lt;/code> 或 &lt;code>git commit&lt;/code>，在 KLM 模型中是極大的浪費。&lt;/p>
&lt;p>&lt;strong>Bash 的範例 (&lt;code>~/.bashrc&lt;/code>)&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">g&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git status -sb&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">ga&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git add&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gc&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git commit -m&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gco&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git checkout&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gp&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git push&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git log --oneline --graph --decorate --all&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>PowerShell 的範例 (&lt;code>$PROFILE&lt;/code>)&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-Alias&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="n">git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">gs&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">status&lt;/span> &lt;span class="n">-sb&lt;/span> &lt;span class="nv">$args&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">ga&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">add&lt;/span> &lt;span class="nv">$args&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">gc&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">commit&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="nv">$args&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">gco&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">checkout&lt;/span> &lt;span class="nv">$args&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">gl&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">git&lt;/span> &lt;span class="n">log&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-oneline&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-graph&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-decorate&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-all&lt;/span> &lt;span class="nv">$args&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>※ PowerShell 的 &lt;code>Set-Alias&lt;/code> 無法固定引數，因此對於伴隨選項的別名，最佳做法是像上面這樣將其定義為函式（function）。&lt;/p>
&lt;h2 id="52-目錄移動的最佳化z--zoxide">5.2. 目錄移動的最佳化（z / zoxide）
&lt;/h2>&lt;p>使用 &lt;code>cd&lt;/code> 指令移動到深層目錄非常麻煩。近年來，能學習使用者移動的歷史紀錄與頻率（Frecency: Frequency + Recency），只要輸入部分路徑就能跳到目標目錄的工具 &lt;strong>&lt;code>zoxide&lt;/code>&lt;/strong>（使用 Rust 編寫）正逐漸成為標準。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安裝 zoxide 後，使用 z 來代替 cd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">z proj &lt;span class="c1"># 一瞬間移動到 /home/user/workspace/projects/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>zoxide 支援 Bash、Zsh 及 PowerShell 等所有 shell，能夠在跨平台間實現同樣高速的目錄移動。&lt;/p>
&lt;hr>
&lt;h1 id="6-終端機多工器與窗格管理">6. 終端機多工器與窗格管理
&lt;/h1>&lt;p>如果在一個終端機視窗中啟動了一個處理程序（例如本地伺服器），為了進行其他工作，就必須重新開啟一個新的終端機視窗。切換視窗（&lt;code>Alt+Tab&lt;/code>）會伴隨著視線的移動，並帶來情境切換的成本（增加心智準備 $M$）。&lt;/p>
&lt;p>為了解決這個問題，可以使用&lt;strong>終端機多工器&lt;/strong>，它能將畫面分割為多個窗格，並在背景維持多個工作階段（Session）。&lt;/p>
&lt;h2 id="61-tmux-的架構與狀態轉換-linux--macos">6.1. tmux 的架構與狀態轉換 (Linux / macOS)
&lt;/h2>&lt;p>&lt;code>tmux&lt;/code> 是一個擁有伺服器－客戶端架構的強大多工器。為了避免與其他程式的快捷鍵衝突，tmux 的操作機制規定必須先按下 &lt;strong>前綴鍵（Prefix Key，預設為 Ctrl+B）&lt;/strong>。&lt;/p>
&lt;p>以下的 Mermaid 狀態轉換圖，表現了 tmux 的基本操作流程。&lt;/p>
&lt;pre class="mermaid">
stateDiagram-v2
[*] --&amp;gt; Normal[&amp;#34;一般模式 (Normal Mode)&amp;#34;]
Normal --&amp;gt; Prefix[&amp;#34;前綴模式 (Prefix Mode, Ctrl+B)&amp;#34;]
Prefix --&amp;gt; Command[&amp;#34;命令提示字元 (:)&amp;#34;]
Prefix --&amp;gt; SplitV[&amp;#34;垂直分割窗格 (%)&amp;#34;]
Prefix --&amp;gt; SplitH[&amp;#34;水平分割窗格 (\&amp;#34;)&amp;#34;]
Prefix --&amp;gt; Switch[&amp;#34;切換視窗 (n/p/0-9)&amp;#34;]
Prefix --&amp;gt; Detach[&amp;#34;卸載工作階段 (d)&amp;#34;]
Command --&amp;gt; Normal[&amp;#34;執行 tmux 指令&amp;#34;]
SplitV --&amp;gt; Normal[&amp;#34;返回一般模式&amp;#34;]
SplitH --&amp;gt; Normal[&amp;#34;返回一般模式&amp;#34;]
Switch --&amp;gt; Normal[&amp;#34;返回一般模式&amp;#34;]
Detach --&amp;gt; [*]
&lt;/pre>
&lt;p>常見的做法是編輯 &lt;code>~/.tmux.conf&lt;/code>，將前綴鍵變更為比較好按的 &lt;code>Ctrl+A&lt;/code>（類似 GNU Screen 的風格），並將窗格移動綁定為類似 Vim 的 &lt;code>hjkl&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># ~/.tmux.conf 範例
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 變更前綴鍵為 Ctrl-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set -g prefix C-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">unbind C-b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind C-a send-prefix
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 將窗格分割改為直覺的按鍵
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind | split-window -h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind - split-window -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 類似 Vim 的窗格移動
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind h select-pane -L
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind j select-pane -D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind k select-pane -U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind l select-pane -R
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="62-windows-terminal-的窗格管理">6.2. Windows Terminal 的窗格管理
&lt;/h2>&lt;p>在 Windows 環境下，最新的 &lt;strong>Windows Terminal&lt;/strong> 原生支援了窗格分割功能。雖然沒有像 tmux 那樣的工作階段持久化功能，但可以透過 GUI 基礎輕鬆管理窗格。開啟設定檔（&lt;code>settings.json&lt;/code>）並自訂動作（actions），就能實現完全靠鍵盤完成的操作。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Windows Terminal settings.json 的一部分
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="s2">&amp;#34;actions&amp;#34;&lt;/span>&lt;span class="err">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;action&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;splitPane&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;split&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="nt">&amp;#34;keys&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;alt+shift+d&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;action&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;moveFocus&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;direction&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;left&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="nt">&amp;#34;keys&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;alt+left&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;action&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;moveFocus&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;direction&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;right&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="nt">&amp;#34;keys&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;alt+right&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>如此一來，在 PowerShell 內只需按下 &lt;code>Alt+Shift+D&lt;/code> 就能分割畫面，並透過方向鍵與 &lt;code>Alt&lt;/code> 的組合在窗格之間無縫移動。&lt;/p>
&lt;hr>
&lt;h1 id="7-實用工作流程建構範例">7. 實用工作流程建構範例
&lt;/h1>&lt;p>將目前為止介紹的元素（Emacs 按鍵綁定、PSReadLine、fzf、別名、多工器）結合起來，可以戲劇性地加速日常任務。&lt;/p>
&lt;p>舉例來說，假設任務是：「處理故障時，檢查伺服器日誌，並同時使用 Git 調查相關程式碼的 commit 歷史紀錄」。&lt;/p>
&lt;ol>
&lt;li>開啟終端機，輸入 &lt;code>z prod&lt;/code> 瞬間移動到正式環境的操作目錄。&lt;/li>
&lt;li>按下 &lt;code>Ctrl+R&lt;/code>，在 &lt;code>fzf&lt;/code> 的彈出視窗輸入 &lt;code>ssh auth&lt;/code>，叫出並執行過去複雜的 SSH 登入指令。&lt;/li>
&lt;li>執行 &lt;code>Ctrl+B&lt;/code> &lt;code>|&lt;/code> (tmux 的窗格分割)，在右側窗格執行 &lt;code>gs&lt;/code> (git status) 等指令調查程式碼。&lt;/li>
&lt;li>若在左側窗格的日誌輸出中發現錯誤，按下 &lt;code>Ctrl+B&lt;/code> &lt;code>[&lt;/code> 進入複製模式，只靠鍵盤就把錯誤訊息 Yank（複製）下來。&lt;/li>
&lt;li>貼到編輯器以找出原因。&lt;/li>
&lt;/ol>
&lt;p>在這一連串的動作中，&lt;strong>完全不需要觸碰滑鼠&lt;/strong>。KLM 方程式中的 $H$ (Homing) 與 $P$ (Pointing) 完全被排除，終端機的操作將完美跟上你思考的速度。&lt;/p>
&lt;hr>
&lt;h1 id="總結">總結
&lt;/h1>&lt;p>本文針對決定開發者生產力的「終端機操作效率化」，從 KLM 理論到具體的 Bash/PowerShell 按鍵綁定，乃至整合 fzf 和 tmux 等，進行了極為詳細的解說。&lt;/p>
&lt;p>剛開始，刻意去按 &lt;code>Ctrl+A&lt;/code> 或 &lt;code>Ctrl+E&lt;/code> 可能會感到壓力。然而，只要有意識地持續使用幾週，這些快捷鍵肯定會成為你的&lt;strong>肌肉記憶（Muscle Memory）&lt;/strong>。一旦形成習慣，你就能在無意識中自由自在地操控終端機，這將成為你終身受用、飛躍性提升開發體驗（Developer Experience, DX）的重要財富。&lt;/p>
&lt;p>請務必從今天開始，打開 &lt;code>$PROFILE&lt;/code> 或 &lt;code>~/.bashrc&lt;/code>，著手打造最適合自己雙手的終極終端機環境。&lt;/p></description></item></channel></rss>