快速重拾 Tmux

AaronLin發表於2023-04-13

Tmux 是一個 Linux (Mac OS也支援)下的終端複用器,相較於 Screen 更為強大,但快捷鍵和操作邏輯也更復雜,一段時間不用,就很容易忘記相關的命令和快捷鍵。本文旨在透過一個簡單的場景,快速重拾 Tmux

Tmux 通常用來保持會話(session),如果我們透過 ssh 連線伺服器處理打包等的耗時操作,那麼網路波動可能會導致連線斷開,使得操作失敗,使用 Tmux 會話會被保持,任務依然會繼續,我們可以隨時恢復會話

Tmux 另一個常用的功能是分屏,快速地建立 WindowPane,方便地在不同的任務間穿梭

修改配置

vim ~/.tmux.conf
# 將預設修飾鍵(prefix) ctrl + b 修改:ctrl + a
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# 啟用滑鼠模式
set-option -g -q mouse on

# 修改分屏快捷鍵
# 左右分屏
bind h split-window -h
# 上下分屏
bind v split-window -v

# 可以取消預設的分屏快捷鍵對映
# unbind '"'
# unbind %

# 將 tmux 的複製模式鍵繫結設定為 vi 模式
setw -g mode-keys vi

重新載入 Tmux 配置檔案

tmux source-file ~/.tmux.conf

命令 & 快捷鍵

命令

這些命令大多是用於 tmux Session 的增刪改查,一些命令進入 tmux 後將無法使用

# 建立新的 session
tmux new -s <session-name>
# 刪除 seesion
tmux kill-session -t 0
# 重新命名 seesion
tmux rename-session -t 0 <new-name>
# 檢視 所有 session
tmux ls

# 進入最近使用的 session
tmux attach
# 進入編號為 1 的 session 
tmux attach -t 1

可以定義一些 alias 簡化輸入

# 新增到 shell 初始化指令碼中
# Bash Shell 是 ~/.bashrc
# Zsh Shell  是 ~/.zshrc

alias tnew='tmux new -s'
alias tatt='tmux attach'
alias tkill='tmux kill-session -t'
alias tkillall='tmux kill-session -a'
alias tname='tmux rename-session -t'
alias tls='tmux ls'

快捷鍵

在使用下面的快捷鍵之前,都需要先按 tmux 的修飾鍵(prefix),修改後的修飾鍵為:Ctrl + a;具體做法是:先按住 Ctrl 再按一下 a,這時可以鬆開 Ctrl 和 a,這時 prefix 已經生效了,我們可以加上下面的任意按鍵以實現對應的功能

tmux 有 SessionWindowPane 這三個比較重要的概念

會話 Seesion

  • d:分離會話(detach)
  • $:修改當前 Session 名稱
  • s:顯示 Session 列表(session)

視窗 Window

  • c:建立一個新的 Window (create)
  • p:切換到上一個 Window(previous)
  • n:切換到下一個 Window(next)
  • w:顯示 Window 列表(window)
  • ,:修改當前 Window 的名稱
  • 數字鍵:切換到對應編號的 Window,比如 prfix + 0 就是切換到編號為 0 的 Window

窗格 Pane

  • %:建立一個 Pane(水平排布),使用前面的配置後,可以使用 h(horizontal)
  • ":建立一個 Pane(垂直排布),使用前面的配置後,可以使用 v(vertical)
  • 空格:Pane 的垂直排布和水平排布之間相互轉換
  • x:移除當前 Pane,會出現提示是否需要 kill-pane,輸入 y 確認,也可以使用 ctrl + d(無需按 prefix)直接終止 pane
  • z:全屏當前 Pane
  • ;:將遊標移動到上次使用的 Pane
  • o:將遊標移動到下一個 Pane(順時針)
  • Ctrl + o:旋轉當前視窗的pane,下一個 Pane 會代替上一 Pane 的位置,遊標會保持在原 Pane
  • Alt + 方向鍵:以 5 個單元格為單位移動邊緣以調整當前皮膚大小

複製文字

  • [:進入複製模式,因為我們配置了 setw -g mode-keys vi 所以我們可以直接用 vim 的快捷鍵跳轉單詞或者行

我們可以透過 空格鍵 開始選中,這時移動遊標可以擴大選取,按 回車 完成文字複製

  • ]:貼上複製的文字

進入複製模式後,可以透過 q 退出複製模式

場景

tmux 就像 vim 一樣,如果不經常使用,就很容易忘記快捷鍵,可以透過一個場景把這些零碎的知識串起來,同時場景也方便重複練習和舉一反三

我們可以在 tmux 裡,編譯執行一個 c 的 hello world,prefix 預設為 Ctrl + b,配置裡我們修改為 Ctrl + a

  1. 使用 tmux 建立新的 Session,並指定名稱為:run-c
# 使用 alias 的話可以用 tnew run-c
tmux new -s run-c
  1. 我們可以使用 prefix + , 將 Windows 名稱修改為 hello-world

  2. 使用 vim 編輯 hello.c

vim hello.c

i 進入 vim 的編輯模式,輸入:

#include<stdio.h>

int main(){
    printf("hello world\n");
}

ESC 退出編輯模式,鍵入 :w 儲存輸入

  1. 使用 prefix + % (修改了配置則可以使用 prefix + h)在右側新增一個新的 Pane 用於編譯

  2. 新增的 Pane 將螢幕一分為二,但是編譯不需要這麼大,我們可以透過 prefix + Alt + 右方向鍵 縮小 Pane 寬度,按完 prefix 後,可以多次按 Alt + 右方向鍵 持續縮小 Pane 寬度

  3. 在右側 Pane 我們可以使用 gcc hello.c 編譯 hello.c

  4. 使用 ./a.out 執行 hello world 程式

  5. 使用 prefix + ;,將遊標切換回左側 Pane,如果覺想暫時收起右側的 Pane,可以用 prefix + z,最大化或取消最大化當前 Pane

  6. 我們可以繼續編輯檔案,輸入 i 進入 vim 編輯模式,將 world,修改為 tmux,按ESC 退出編輯模式,鍵入 :w 儲存輸入

  7. 使用 prefix + ;,將遊標切換回右側 Pane,完成編譯和執行

gcc hello.c
./a.out
  1. 使用 prefix + x,關閉右側 Pane,按 y 確認關閉

  2. 使用 prefix + d(tmux detach),將當前會話與視窗分離,回到我們自己的 Shell

  3. 使用 tmux attach(修改了配置則可以使用 tatt),回到我們剛出 detach 的 Session

參考資料

tmux: some considerations, some best practices
How to Boost 10X Productivity with Tmux
Tmux 使用教程 - 阮一峰
手把手教你使用終端複用神器 tmux
Tmux + Vim 工作流! 同時操作多個專案, 追求極致的絲滑流暢!
「TMUX」十分鐘掌握 tmux -- 高效的終端複用工具 : )
十分鐘掌握 TMUX
Y分鐘速成X,其中 X=tmux
Tmux的快捷鍵,包括調整視窗大小