<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Fzf on kenji.blog</title><link>http://kenji.blog/en/tags/fzf/</link><description>Recent content in Fzf on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/en/tags/fzf/index.xml" rel="self" type="application/rss+xml"/><item><title>Terminal (PowerShell/Bash) Efficiency Shortcuts for Developers</title><link>http://kenji.blog/en/p/terminal-efficiency-powershell-bash-shortcuts/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/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 Terminal (PowerShell/Bash) Efficiency Shortcuts for Developers" />&lt;h1 id="introduction-overwhelming-productivity-improvement-brought-by-terminal-efficiency">Introduction: Overwhelming Productivity Improvement Brought by Terminal Efficiency
&lt;/h1>&lt;p>In modern software development, the terminal (Command Line Interface) is the most critical tool acting as the developer&amp;rsquo;s &amp;ldquo;hands and feet&amp;rdquo;. Managing cloud infrastructure, building containers, version control with Git, executing various scripts, etc. — it is no exaggeration to say that developers spend most of their day in the terminal.&lt;/p>
&lt;p>However, while many developers are proficient in basic terminal commands (&lt;code>cd&lt;/code>, &lt;code>ls&lt;/code>, &lt;code>git&lt;/code>, &lt;code>docker&lt;/code>, etc.), they often overlook the aspect of &lt;strong>&amp;ldquo;optimizing the terminal input itself&amp;rdquo;&lt;/strong>. Reaching for the mouse, moving the cursor, and repeatedly hitting the arrow keys to fix command typos&amp;hellip; the accumulation of these small losses results in an enormous waste of time and cognitive load over the long term.&lt;/p>
&lt;p>In this article, under the philosophy of &amp;ldquo;never taking your hands off the keyboard&amp;rdquo;, we will explain in great detail and technically about shortcuts, keybinding configurations, optimization of history search, and the utilization of terminal multiplexers to maximize terminal operation efficiency in Bash and PowerShell environments.&lt;/p>
&lt;hr>
&lt;h1 id="1-theoretical-background-keystroke-level-model-klm-and-time-cost-formulation">1. Theoretical Background: Keystroke-Level Model (KLM) and Time Cost Formulation
&lt;/h1>&lt;p>To quantitatively understand the benefits of efficiency, let&amp;rsquo;s introduce the &lt;strong>Keystroke-Level Model (KLM)&lt;/strong>, a type of &lt;strong>GOMS model&lt;/strong> used in the field of HCI (Human-Computer Interaction).&lt;/p>
&lt;p>KLM is a model used to predict the time it takes for a skilled user to complete a specific error-free task. The task execution time $T_{execute}$ is formulated by the following mathematical equation:&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>Here, each variable has the following meaning:&lt;/p>
&lt;ul>
&lt;li>$K$ : Keystroking. The action of pressing a key on the keyboard once.&lt;/li>
&lt;li>$P$ : Pointing. The action of pointing to a target with a pointing device such as a mouse.&lt;/li>
&lt;li>$H$ : Homing. The action of moving the hand from the keyboard to the mouse, or vice versa.&lt;/li>
&lt;li>$M$ : Mental preparation. The cognitive thinking time to plan and prepare for the next physical action.&lt;/li>
&lt;li>$R$ : System Response. The time the user has to wait.&lt;/li>
&lt;/ul>
&lt;p>The average required time ($t$) for each action is generally estimated as follows:&lt;/p>
&lt;ul>
&lt;li>$t_{k} \approx 0.2$ seconds (for skilled typists)&lt;/li>
&lt;li>$t_{p} \approx 1.1$ seconds&lt;/li>
&lt;li>$t_{h} \approx 0.4$ seconds&lt;/li>
&lt;li>$t_{m} \approx 1.35$ seconds&lt;/li>
&lt;/ul>
&lt;p>When trying to modify part of a command using the arrow keys or a mouse during terminal operations, Homing ($H$) and Pointing ($P$) occur, resulting in a penalty of about 1.5 to 2.0 seconds per modification. On the other hand, if you master the appropriate terminal shortcuts, you can reduce $H$ and $P$ to &lt;strong>zero&lt;/strong> and achieve your goal with only Keystroking ($K$).&lt;/p>
$$ 500 \text{ times/day} \times 2 \text{ seconds} = 1000 \text{ seconds/day} \approx 16.6 \text{ minutes/day} $$&lt;p>
Converting this annually (240 business days), it equates to saving an enormous amount of time, &lt;strong>about 66 hours (about 8 business days)&lt;/strong>. Furthermore, the reduction in Mental preparation ($M$) provides an immeasurable benefit: &lt;strong>&amp;ldquo;maintaining an uninterrupted flow state&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h1 id="2-the-depths-of-bash-readline-and-emacs-keybindings">2. The Depths of Bash Readline and Emacs Keybindings
&lt;/h1>&lt;p>Bash, the standard shell for Linux and macOS, internally uses a library called &lt;strong>GNU Readline&lt;/strong> to process command line inputs. The default configuration of this Readline is set to &lt;strong>Emacs keybindings&lt;/strong>, and mastering this is the first step to terminal efficiency.&lt;/p>
&lt;h2 id="21-movement-shortcuts">2.1. Movement Shortcuts
&lt;/h2>&lt;p>Moving the cursor one character at a time with the arrow keys is the height of inefficiency. Let&amp;rsquo;s engrave the following shortcuts into your &amp;ldquo;muscle memory&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + A&lt;/code>&lt;/strong> : Move to the Start of line. Used very frequently.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + E&lt;/code>&lt;/strong> : Move to the End of line.&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + B&lt;/code>&lt;/strong> (Meta+B) : Move one word backward (Backward word). Moves quickly word by word using slashes or spaces as delimiters.&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + F&lt;/code>&lt;/strong> (Meta+F) : Move one word forward (Forward word).&lt;/li>
&lt;/ul>
&lt;pre class="mermaid">
flowchart LR
Start[&amp;#34;Start of Line (Ctrl+A)&amp;#34;] --- Cursor[&amp;#34;Current Cursor Position&amp;#34;]
Cursor --- End[&amp;#34;End of Line (Ctrl+E)&amp;#34;]
Cursor --&amp;gt; BackwardWord[&amp;#34;Backward Word (Alt+B)&amp;#34;]
Cursor --&amp;gt; ForwardWord[&amp;#34;Forward Word (Alt+F)&amp;#34;]
&lt;/pre>
&lt;h2 id="22-editing-shortcuts-kill-and-yank">2.2. Editing Shortcuts (Kill and Yank)
&lt;/h2>&lt;p>In Emacs terminology, cutting text is called &amp;ldquo;Kill&amp;rdquo;, and pasting text is called &amp;ldquo;Yank&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + U&lt;/code>&lt;/strong> : Kill (delete) from the cursor position to the start of the line. Instantly clears the line when you mistype a password or want to rewrite a command from the beginning.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + K&lt;/code>&lt;/strong> : Kill from the cursor position to the end of the line.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + W&lt;/code>&lt;/strong> : Kill one word backward from the cursor position. Very useful when deleting and rewriting a single argument.&lt;/li>
&lt;li>&lt;strong>&lt;code>Alt + D&lt;/code>&lt;/strong> (Meta+D) : Kill one word forward from the cursor position.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + Y&lt;/code>&lt;/strong> : Yank (paste) the last killed content. Advanced usages are possible, such as moving to another directory after deleting a command with &lt;code>Ctrl+U&lt;/code>, and then reviving it with &lt;code>Ctrl+Y&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + _&lt;/code>&lt;/strong> (or &lt;code>Ctrl + x, Ctrl + u&lt;/code>) : Undo. You can restore if you accidentally delete something.&lt;/li>
&lt;/ul>
&lt;h2 id="23-other-important-shortcuts">2.3. Other Important Shortcuts
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>&lt;code>Ctrl + L&lt;/code>&lt;/strong> : Clear the screen (equivalent to the &lt;code>clear&lt;/code> command).&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + C&lt;/code>&lt;/strong> : Cancel the current command input, or interrupt a running process.&lt;/li>
&lt;li>&lt;strong>&lt;code>Ctrl + D&lt;/code>&lt;/strong> : Send EOF (End Of File). If no characters are inputted, it exits the shell (&lt;code>exit&lt;/code>).&lt;/li>
&lt;/ul>
&lt;h2 id="24-customizing-readline-via-inputrc">2.4. Customizing Readline via ~/.inputrc
&lt;/h2>&lt;p>These keybindings can be further optimized by editing the &lt;code>~/.inputrc&lt;/code> file in your home directory. For example, adding the following configuration allows you to search only histories that prefix-match the currently typed string using the up/down keys.&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"># Example ~/.inputrc configuration&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>With this, if you type &lt;code>docker &lt;/code> and press the up arrow key, you can quickly traverse only the past command histories starting with &lt;code>docker&lt;/code>.&lt;/p>
&lt;hr>
&lt;h1 id="3-powershell-and-psreadline-bash-like-operations-in-windows-environments">3. PowerShell and PSReadLine: Bash-like Operations in Windows Environments
&lt;/h1>&lt;p>PowerShell, the standard shell in Windows, only had a poor input environment equivalent to Command Prompt (cmd.exe) in its early versions. However, with the introduction of the &lt;strong>PSReadLine&lt;/strong> module, it gained advanced command line editing features that rival or even exceed Bash (Readline).&lt;/p>
&lt;h2 id="31-enabling-psreadline-and-emacs-mode">3.1. Enabling PSReadLine and Emacs Mode
&lt;/h2>&lt;p>PSReadLine is built into PowerShell 5.1 and later (as well as PowerShell Core) by default. For Windows users to raise their terminal productivity to Linux levels, it is imperative to change the PSReadLine edit mode from the default Windows (cmd-like) mode to &lt;strong>Emacs mode&lt;/strong>.&lt;/p>
&lt;p>Edit your PowerShell profile (&lt;code>$PROFILE&lt;/code>) to load the settings automatically.&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"># Open $PROFILE in VS Code&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>Add the following settings to &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"># Import the PSReadLine module (if explicitly needed)&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"># Set edit mode to Emacs and enable the same shortcuts as 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"># Ignore the bell sound (error sound)&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>Now, Emacs/Bash style keybindings like &lt;code>Ctrl+A&lt;/code> (start of line), &lt;code>Ctrl+E&lt;/code> (end of line), &lt;code>Ctrl+U&lt;/code> (delete to start of line), and &lt;code>Alt+B&lt;/code> / &lt;code>Alt+F&lt;/code> (word movement) will work perfectly on Windows PowerShell as well.&lt;/p>
&lt;h2 id="32-predictive-intellisense-and-advanced-history-search">3.2. Predictive IntelliSense and Advanced History Search
&lt;/h2>&lt;p>One of the powerful features of PSReadLine is &lt;strong>Predictive IntelliSense&lt;/strong>, based on input history or external predictive plugins. As you type, the most likely entire command from your past history is suggested in a faint gray (inline). To accept the suggestion, simply press the right arrow key (or &lt;code>Alt+F&lt;/code> for word-by-word).&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"># Add to $PROFILE: Enable predictive features (Requires 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"># Specify ListView if you want to display it as a list&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-overriding-updown-key-behavior-bash-like-prefix-search">3.3. Overriding Up/Down Key Behavior (Bash-like Prefix Search)
&lt;/h2>&lt;p>The default up/down arrow keys in PowerShell merely navigate sequentially through history. Let&amp;rsquo;s remap this to a &amp;ldquo;search history that prefix-matches the currently typed string&amp;rdquo; function, similar to the &lt;code>~/.inputrc&lt;/code> mentioned earlier.&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"># Add to $PROFILE: Register history prefix search handlers&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>Thanks to this, even in a Windows environment, you can intuitively construct, search, and execute commands with the exact same finger movements as in a Linux environment. Standardizing cognitive load ($M$) across platforms is extremely important for DevOps engineers.&lt;/p>
&lt;hr>
&lt;h1 id="4-the-pinnacle-of-history-search-fzf-fuzzy-finder-integration">4. The Pinnacle of History Search: fzf (Fuzzy Finder) Integration
&lt;/h1>&lt;p>One of the most frequent actions in terminal operations is &lt;strong>&amp;ldquo;finding a complex command executed in the past from history and re-executing it&amp;rdquo;&lt;/strong>. Because the standard &lt;code>Ctrl+R&lt;/code> (reverse search) is an exact match search, it&amp;rsquo;s difficult to pull out a command from a vague memory like &amp;ldquo;I&amp;rsquo;m sure it was a docker run with a volume mount&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>The tool that elegantly solves this problem is &lt;strong>&lt;code>fzf&lt;/code>&lt;/strong>, an ultra-fast general-purpose fuzzy finder written in Go.&lt;/p>
&lt;h2 id="41-fuzzy-search-pipeline-with-fzf">4.1. Fuzzy Search Pipeline with fzf
&lt;/h2>&lt;p>When &lt;code>fzf&lt;/code> is integrated into command history search, processing is done in a pipeline like the following.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;User Input (Ctrl+R)&amp;#34;] --&amp;gt; B[&amp;#34;fzf Intercepts Keystroke&amp;#34;]
B --&amp;gt; C[&amp;#34;Read .bash_history or PSReadLine History File&amp;#34;]
C --&amp;gt; D{&amp;#34;Fuzzy Match Engine (Go)&amp;#34;}
D --&amp;gt; E[&amp;#34;Update Interactive Selection UI in Terminal&amp;#34;]
E --&amp;gt; F[&amp;#34;User Selects Command (Enter)&amp;#34;]
F --&amp;gt; G[&amp;#34;Return Selected Command to Shell Buffer&amp;#34;]
G --&amp;gt; H[&amp;#34;Execute or Edit Command&amp;#34;]
&lt;/pre>
&lt;p>When a user inputs multiple space-separated keywords (e.g., &lt;code>docker ubuntu bash&lt;/code>), fzf&amp;rsquo;s matching engine scans the entire history file and instantly lists the histories containing those keywords in any order or at distant positions.&lt;/p>
&lt;h2 id="42-fzf-integration-in-bash">4.2. fzf Integration in Bash
&lt;/h2>&lt;p>In Linux environments like Ubuntu/Debian, it can be easily installed using apt. Furthermore, executing the install script automatically overwrites Bash&amp;rsquo;s keybindings.&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"># Installing 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>With this, pressing &lt;code>Ctrl+R&lt;/code> makes fzf&amp;rsquo;s interactive UI pop up full screen (or inside a tmux pane), allowing you to search history extremely intuitively. On the search UI, you can select items with &lt;code>Ctrl+N&lt;/code> (down) / &lt;code>Ctrl+P&lt;/code> (up).&lt;/p>
&lt;h2 id="43-psfzf-integration-in-powershell">4.3. PSFzf Integration in PowerShell
&lt;/h2>&lt;p>Even in a Windows PowerShell environment, you can achieve the exact same experience by using the &lt;code>PSFzf&lt;/code> module. First, install the fzf binary (Scoop is convenient) and introduce the module.&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"># Install fzf binary via Scoop&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"># Install PSFzf module&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>Then, add the configuration to &lt;code>$PROFILE&lt;/code> to bind the key.&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"># Add to $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"># Map Ctrl+R to fzf history search&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>Now, even on Windows, you can instantly perform fuzzy searches from massive past PowerShell histories using &lt;code>Ctrl+R&lt;/code>.&lt;/p>
&lt;hr>
&lt;h1 id="5-minimizing-keystrokes-via-aliases-and-wrapper-functions">5. Minimizing Keystrokes via Aliases and Wrapper Functions
&lt;/h1>&lt;p>In addition to shortcuts and history search, the most direct way to reduce Keystroking ($K$) itself is by defining Aliases and Wrapper functions.&lt;/p>
&lt;h2 id="51-minimizing-git-operations">5.1. Minimizing Git Operations
&lt;/h2>&lt;p>Git is used countless times every day. Typing the full spellings of &lt;code>git status&lt;/code> or &lt;code>git commit&lt;/code> every time is a huge waste in the KLM model.&lt;/p>
&lt;p>&lt;strong>Bash Example (&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 Example (&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;ul>
&lt;li>Since PowerShell&amp;rsquo;s &lt;code>Set-Alias&lt;/code> cannot fix arguments, the best practice is to define aliases with options as functions as shown above.&lt;/li>
&lt;/ul>
&lt;h2 id="52-optimizing-directory-navigation-z--zoxide">5.2. Optimizing Directory Navigation (z / zoxide)
&lt;/h2>&lt;p>Navigating to deeply nested directories with the &lt;code>cd&lt;/code> command is cumbersome. In recent years, &lt;strong>&lt;code>zoxide&lt;/code>&lt;/strong> (written in Rust), a tool that learns a user&amp;rsquo;s navigation history and Frecency (Frequency + Recency) and allows jumping to a target directory just by typing part of the path, is becoming the standard.&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"># After installing zoxide, use z instead of cd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">z proj &lt;span class="c1"># Instantly jump to /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 supports all of Bash, Zsh, and PowerShell, realizing the same high-speed directory navigation cross-platform.&lt;/p>
&lt;hr>
&lt;h1 id="6-terminal-multiplexers-and-pane-management">6. Terminal Multiplexers and Pane Management
&lt;/h1>&lt;p>If you launch one process (like a local server) in a single terminal window, you have to open a new terminal window to do other work. Switching windows (&lt;code>Alt+Tab&lt;/code>) involves eye movement and incurs a context switch cost (an increase in Mental preparation $M$).&lt;/p>
&lt;p>The solution to this is a &lt;strong>terminal multiplexer&lt;/strong>, which can divide the screen into multiple panes and maintain multiple sessions in the background.&lt;/p>
&lt;h2 id="61-tmux-architecture-and-state-transitions-linux--macos">6.1. tmux Architecture and State Transitions (Linux / macOS)
&lt;/h2>&lt;p>&lt;code>tmux&lt;/code> is a powerful multiplexer with a server-client architecture. To prevent shortcut conflicts with other programs, tmux operations always require pressing a &lt;strong>prefix key (default is Ctrl+B)&lt;/strong> first.&lt;/p>
&lt;p>The following Mermaid state transition diagram shows the basic operation flow of 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;Command Prompt (:)&amp;#34;]
Prefix --&amp;gt; SplitV[&amp;#34;Split Pane Vertically (%)&amp;#34;]
Prefix --&amp;gt; SplitH[&amp;#34;Split Pane Horizontally (\&amp;#34;)&amp;#34;]
Prefix --&amp;gt; Switch[&amp;#34;Switch Window (n/p/0-9)&amp;#34;]
Prefix --&amp;gt; Detach[&amp;#34;Detach Session (d)&amp;#34;]
Command --&amp;gt; Normal[&amp;#34;Execute tmux Command&amp;#34;]
SplitV --&amp;gt; Normal[&amp;#34;Return to Normal Mode&amp;#34;]
SplitH --&amp;gt; Normal[&amp;#34;Return to Normal Mode&amp;#34;]
Switch --&amp;gt; Normal[&amp;#34;Return to Normal Mode&amp;#34;]
Detach --&amp;gt; [*]
&lt;/pre>
&lt;p>By editing &lt;code>~/.tmux.conf&lt;/code>, it is standard practice to change the prefix key to an easier-to-press &lt;code>Ctrl+A&lt;/code> (like GNU Screen), or bind pane movements to Vim-like &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"># Example ~/.tmux.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Change prefix to 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"># Intuitive keys for pane splitting
&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-like pane movement
&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-pane-management-in-windows-terminal">6.2. Pane Management in Windows Terminal
&lt;/h2>&lt;p>In a Windows environment, the latest &lt;strong>Windows Terminal&lt;/strong> natively supports pane splitting features. Although it doesn&amp;rsquo;t have session persistence like tmux, you can easily manage panes via a GUI base. By opening settings (&lt;code>settings.json&lt;/code>) and customizing actions, you can complete operations with just the keyboard.&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">// Part of 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>With this, simply pressing &lt;code>Alt+Shift+D&lt;/code> within PowerShell splits the screen, and you can seamlessly move between panes using combinations of the arrow keys and &lt;code>Alt&lt;/code>.&lt;/p>
&lt;hr>
&lt;h1 id="7-practical-workflow-construction-example">7. Practical Workflow Construction Example
&lt;/h1>&lt;p>By combining the elements introduced so far (Emacs keybindings, PSReadLine, fzf, aliases, multiplexers), daily tasks are dramatically accelerated.&lt;/p>
&lt;p>For example, imagine a task: &amp;ldquo;During a failure response, check the server logs, and simultaneously investigate the commit history of the relevant code with Git.&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>Open the terminal and type &lt;code>z prod&lt;/code> to instantly jump to the operations directory for the production environment.&lt;/li>
&lt;li>Press &lt;code>Ctrl+R&lt;/code> and type &lt;code>ssh auth&lt;/code> in the &lt;code>fzf&lt;/code> pop-up to recall and execute a complex past SSH login command.&lt;/li>
&lt;li>Perform &lt;code>Ctrl+B&lt;/code> &lt;code>|&lt;/code> (tmux pane split) and execute &lt;code>gs&lt;/code> (git status) etc. in the right pane to investigate the code.&lt;/li>
&lt;li>If you find an error in the log output in the left pane, enter copy mode with &lt;code>Ctrl+B&lt;/code> &lt;code>[&lt;/code> and yank the error message using just the keyboard.&lt;/li>
&lt;li>Paste it into your editor to identify the cause.&lt;/li>
&lt;/ol>
&lt;p>In this entire series of actions, &lt;strong>you never touch the mouse even once&lt;/strong>. The Homing ($H$) and Pointing ($P$) in the KLM equation are completely eliminated, and your terminal operations will perfectly follow the speed of your thoughts.&lt;/p>
&lt;hr>
&lt;h1 id="conclusion">Conclusion
&lt;/h1>&lt;p>In this article, we explained the &amp;ldquo;efficiency of terminal operations&amp;rdquo; that determines a developer&amp;rsquo;s productivity in extreme detail, ranging from KLM theory to concrete Bash/PowerShell keybindings, and the integration of fzf and tmux.&lt;/p>
&lt;p>At first, you might feel stressed consciously trying to type &lt;code>Ctrl+A&lt;/code> or &lt;code>Ctrl+E&lt;/code>. However, by consciously continuing to use them for a few weeks, these shortcuts will surely settle into your &lt;strong>muscle memory&lt;/strong>. Once they settle, you will be able to freely control the terminal unconsciously, making it an asset that will dramatically improve your Developer Experience (DX) for a lifetime.&lt;/p>
&lt;p>Starting today, open &lt;code>$PROFILE&lt;/code> or &lt;code>~/.bashrc&lt;/code> and begin building the ultimate terminal environment that fits your hands best.&lt;/p></description></item></channel></rss>