提升工作效率的工具 tmux 簡介與使用指南

tmux logo

tmux 是一個終端複用器(terminal multiplexer),它使你能夠輕鬆地在多個終端程序之間來回切換,同時你還可以脫離它們(它們將在後臺繼續運行),然後在另一個終端窗口重新連接它們。

tmux 提升工作效率的兩個主要功能:

  • 窗口分割。在一個終端窗口中,可以隨意進行水平或垂直分割,讓你在一個窗口中運行多個獨立的終端實例,這樣你就無需打開多個終端窗口了。通過簡單的組合鍵,你可以輕鬆在多個獨立運行的終端實例間進行切換。

  • 基於會話的訪問控制。在使用 SSH 工作的情況下,tmux 能避免工作現場丟失。假設在你執行某條命令的過程中,因爲某些不可抗的因素(如網絡問題)導致連接斷開,這時你可能很難確定剛纔的命令是否執行成功;又或者當你處一個較深層次的目錄位置時,若 SSH 連接斷開,你不得不重新進入到之前的工作目錄。如果使用了 tmux,就可以在 SSH 重新連接後,連接到 tmux 之前的 session,這樣就可以回到原來的工作環境。

tmux 工作原理

本文將爲您提供有關 tmux 的簡要介紹,然後是安裝和使用指南。

tmux 使用 C/S 模型構建,主要包含以下幾個概念:

  • Server:服務器,若當前沒有 Server 進程,則執行 tmux 命令時會啓動一個 Server
  • Session:會話,一個 Server 可以包含多個 Session
  • Window:窗口,一個 Session 可以包含多個 Window
  • Pane:窗格,一個 Window 可以包含多個 Pane

當 tmux 啓動時,它將創建一個具有單個 Window 的新 Session,這個 Window 中默認只包含一個 Pane,並將其顯示在屏幕上。屏幕底部的狀態欄顯示了當前會話的信息,並用於輸入交互式命令。

注:這裏包括以下所說的屏幕指的是當前仿真終端窗口的屏幕區域,因爲在執行 tmux 命令前首先需要打開一個終端模擬器。

Session 是“在 tmux 管理下的僞終端”的單個集合。每個會話都有一個或多個鏈接到它的 Window。Window 佔據整個屏幕,並且可以分成多個矩形 Pane,每個 Pane 都是獨立的僞終端。任意數量的 tmux 實例可以連接到同一個 Session,並且同一 Session 中可以存在任意數量的 Window。一旦所有的 Session 都被殺死,tmux 就會退出。

每個 Session 都是持久的,並且可以在意外斷開連接(例如 ssh 連接超時)或故意斷開連接(使用 C-b d 組合鍵)時倖免。可以使用以下方法重新連接 tmux:

$ tmux attach

在 tmux 中,Session 由 Client 顯示在屏幕上,所有的 Session 均有單個 Server 管理。Server 和每個 Client 都是獨立的進程,它們通過 /tmp 中的 socket 進行通信。

不使用 tmux 時,是這樣的:

without tmux

使用 tmux 時,是這樣的:

use tmux

安裝

Ubuntu / Debian 及其衍生版只需執行以下命令即可:

sudo apt-get install tmux

CentOS 上安裝執行:

sudo yum -y install tmux

如果是 Mac,則執行:

brew install tmux

開啓你的第一個 Session

對於你的的第一個 Session,你只需要簡單的啓動 tmux 即可:

tmux

這將創建一個新的 tmux Session,底部帶有一個綠色的狀態欄:

first tmux session

狀態欄是 tmux 的重要組成部分。除了當前打開的窗口(在左側)之外,它還顯示一些系統信息,例如日期和時間(在右側),此外狀態欄也可以自定義。

分割 Pane

現在,我們已經創建了第一個 Session,接着通過分屏我們可以瞭解 Pane。當創建新 Session 時,默認情況下,tmux 將自動爲我們創建一個 Window 和 一個內部 Pane,現在我們進行分屏操作。

tmux 中的所有命令均由 前綴鍵+命令鍵 觸發。默認情況下,tmux 使用 C-b 作爲前綴鍵,C- 表示“按住Ctrl鍵”,C-b 表示同時按下 Ctrlb 鍵。

將一個 Pane 分割成左右兩個 Pane 的快捷鍵是 C-b %,這裏前綴鍵爲 C-b,命令鍵爲 %,這意味着你需要同時按住 Ctrlb,然後鬆開這兩個鍵,最後輸入 % 鍵,這樣就可以將一個 Pane 垂直分割爲兩個 Pane 了。

split pane

想要水平分割成上下兩個 Pane 則使用 C-b "

在 Pane 間切換

假如我們在新的右側的 Pane 中了,現在想回到左側的 Pane 可以使用 C-b Left,其中 Left 爲左方向鍵。根據 Pane 的排布,你可以輸入不同的方向鍵去到你想去的 Pane 中,每次輸入方向鍵前,都需要輸入前綴鍵 C-b

關閉 Pane

關閉 Pane 輸入 exit 然後回車或直接使用快捷鍵 C-d 就可以了。

創建 Window

tmux 中創建一個新的 Window 可以類比於創建一個新的虛擬桌面。創建一個新的 Window 很簡單,只需輸入 C-b c 就可以了。通過底部狀態欄的星號,你就可以知道當前你所在的 Window 是哪個了。

create window

要切換到上一個 Window (根據狀態欄中的順序),請使用 C-b p,要切換到下一個 Window,請使用 C-b n。如果創建了許多窗口,則使用 C-b <number> 會更加高效,其中 <number> 是指定要切換到的 Window 的前面的數字。

Session 管理

如果你已完成或未完成你想要進行的工作,你都可以使用 C-b d 斷開 detach 你當前的 Session,這樣將會斷開你的連接,但是這個 Session 仍會保留在後臺中以供重新連接到該 Session 繼續之前的工作。

假設你已經 detach 了你的 Session,當你想要重新連接 attach 之前 Session 時,你需要先確定是哪個 Session,通過以下命令可以查看當前所有的 Session:

tmux ls

這將爲你展示所有正在運行的會話的列表,在我們的示例中,該列表應類似於:

0: 2 windows (created Sun Nov 10 22:30:50 2019) [80x12]

要連接到該會話,需要再次啓動 tmux,但這一次告訴它要 attach 到哪個 Session:

tmux attach -t 0

注:-t 0 是告訴 tmux attach 到哪個會話的參數,“0” 是 tmux ls 輸出的第一部分。

如果你希望爲 Session 指定一個更有意義的名稱(而不是以 0 開頭的數字),則可以使用:

tmux new -s database

這將創建一個名爲 “database” 的新 Session。

你還可以重命名現有會話:

tmux rename-session -t 0 database

下次連接到該會話時,只需使用 tmux attach -t database,如果一次使用多個 Session,這對於我們區分不同的 Session 很有幫助。

當你想關閉 Session 時:

tmux kill-session -t session-name

複製模式 Copy Mode

  1. 使用 C-b : 進入 tmux 末行模式,設置 Copy 模式使用按鍵模式爲 vi 模式:

    :setw -g mode-keys vi
    
  2. 使用 C-b [ 進入 Copy 模式

  3. Spacebar 開始選中,移動光標選擇選中區域

  4. Enter 複製選中區域內容並退出 Copy 模式

  5. 將光標移動到指定位置,使用 C-b ] 粘貼

tmux 常用按鍵

Session

  • 創建一個新 Session

    $ tmux
    $ tmux new
    $ tmux new-session
    
    :new
    
  • 創建一個名爲 “mysession” 的新 Session

    $ tmux new -s mysession
    
    :new -s mysession
    
  • 關閉或刪除名爲 “mysession” 的 Session

    $ tmux kill-sess -t mysession
    $ tmux kill-session -t mysession
    
  • 關閉或刪除當前會話以外的所有 Session

    $ tmux kill-session -a
    
  • 關閉或刪除名爲 “mysession” 會話以外的所有 Session

    $ tmux kill-session -a -t mysession
    
  • 重命名 Session

    C-b $

  • Detach Session

    C-b d

  • Detach others on the Session

    通過 detach 其它 client 來最大化窗口

    :attach -d
    
  • 查看所有 Session

    $ tmux ls
    $ tmux list-sessions
    

    C-b s

  • Attach 到最近的 Session

    $ tmux a
    $ tmux at
    $ tmux attach
    $ tmux attach-session
    
  • Attach 到名爲 “mysession” 的 Session

    $ tmux a -t mysession
    $ tmux at -t mysession
    $ tmux attach -t mysession
    $ tmux attach-session -t mysession
    
  • 切換到上一個 Session

    C-b (

  • 切換到下一個 Session

    C-b )

Window

  • 創建一個名爲 “mysession” 的新 Session 並指定創建 Window 的名稱爲 “mywindow”

    $ tmux new -s mysession -n mywindow
    
  • 創建 Window

    C-b c

  • 重命名當前 Window

    C-b ,

  • 關閉當前 Window

    C-b &

  • 切換到上一個 Window

    C-b p

  • 切換到下一個 Window

    C-b n

  • 根據數字切換 Window

    C-b 0~9

  • 重新排序窗口,交換編號爲 2 和 1 的窗口

    :swap-window -s 2 -t 1
    
  • 將當前窗口向左移動一個位置

    :swap-window -t -1
    

Pane

  • 切換到上一次活動的 Pane

    C-b ;

  • 垂直分割 Pane

    C-b %

  • 水平分割 Pane

    C-b "

  • 向左移動當前 Pane

    C-b {

  • 向右移動當前 Pane

    C-b }

  • 切換到箭頭方向的 Pane

    C-b UP
    C-b DOWN
    C-b LEFT
    C-b RIGHT

  • 切換到同步 Pane(將命令發送到所有 Pane)

    :setw synchronize-panes
    
  • 在 Pane 佈局之間切換

    C-b Spacebar

  • 切換到下一個 Pane

    C-b o

  • 展示 Pane 編號

    C-b q

  • 按編號切換 Pane

    C-b q 0~9

  • 縮放當前 Pane

    C-b z

  • 將 Pane 轉換成 Window

    C-b !

  • 調整當前 Pane 的高度(按住第二個鍵是可選的)

    C-b-UP
    C-b C-UP
    C-b-DOWN
    C-b C-DOWN

  • 調整當前 Pane 的寬度(按住第二個鍵是可選的)

    C-b-LEFT
    C-b C-LEFT
    C-b-RIGHT
    C-b C-RIGHT

  • 關閉當前 Pane

    C-b x

Copy Mode

  • 設置 Copy 模式下使用 vi 命令

    :setw -g mode-keys vi
    
  • 進入 Copy 模式

    C-b [

  • 進入 Copy 模式並向上滾動一頁

    C-b PgUp

  • 退出 Copy 模式

    q

  • 轉到第一行

    g

  • 轉到最後一行

    G

  • 向上滾動

    UP

  • 向下滾動

    DOWN

  • 向左移動光標

    h

  • 向下移動光標

    j

  • 向上移動光標

    k

  • 向右移動光標

    l

  • 一次將光標向前移動一個單詞

    w

  • 一次將光標向後移動一個單詞

    b

  • 向前搜索

    /

  • 向後搜索

    ?

  • 搜索結果中,跳到下一個關鍵字出現位置

    n

  • 搜索結果中,跳到上一個關鍵字出現位置

    N

  • 開始選中內容

    Spacebar

  • 清空選中內容

    Esc

  • 複製選中內容

    Enter

  • 粘貼 buffer_0 的內容

    C-b ]

  • 展示 buffer_0 的內容

    :show-buffer
    
  • 將 Pane 中的所有可見內容複製到緩衝區

    :capture-pane
    
  • 顯示所有緩衝區

    :list-buffers
    
  • 顯示所有緩衝區並粘貼所選

    :choose-buffer
    
  • 將緩衝區內容保存到 buf.txt

    :save-buffer buf.txt
    
  • 刪除 buffer_1

    :delete-buffer -b 1
    

Misc

  • 進入命令模式

    C-b :

  • 爲所有 Session 設置 OPTION

    :set -g OPTION
    
  • 爲所有 Window 設置 OPTION

    :setw -g OPTION
    

Help

  • 展示快捷鍵幫助

    C-b ?

  • 顯示當前時間

    C-b t

References

https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/

https://tmuxcheatsheet.com/

https://github.com/tmux/tmux/blob/master/.github/README.md

http://man.openbsd.org/OpenBSD-current/man1/tmux.1

發佈了255 篇原創文章 · 獲贊 71 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章