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 時,是這樣的:
使用 tmux 時,是這樣的:
安裝
Ubuntu / Debian 及其衍生版只需執行以下命令即可:
sudo apt-get install tmux
CentOS 上安裝執行:
sudo yum -y install tmux
如果是 Mac,則執行:
brew install tmux
開啓你的第一個 Session
對於你的的第一個 Session,你只需要簡單的啓動 tmux 即可:
tmux
這將創建一個新的 tmux Session,底部帶有一個綠色的狀態欄:
狀態欄是 tmux 的重要組成部分。除了當前打開的窗口(在左側)之外,它還顯示一些系統信息,例如日期和時間(在右側),此外狀態欄也可以自定義。
分割 Pane
現在,我們已經創建了第一個 Session,接着通過分屏我們可以瞭解 Pane。當創建新 Session 時,默認情況下,tmux 將自動爲我們創建一個 Window 和 一個內部 Pane,現在我們進行分屏操作。
tmux 中的所有命令均由 前綴鍵+命令鍵
觸發。默認情況下,tmux 使用 C-b
作爲前綴鍵,C-
表示“按住Ctrl鍵”,C-b
表示同時按下 Ctrl
和 b
鍵。
將一個 Pane 分割成左右兩個 Pane 的快捷鍵是 C-b %
,這裏前綴鍵爲 C-b
,命令鍵爲 %
,這意味着你需要同時按住 Ctrl
和 b
,然後鬆開這兩個鍵,最後輸入 %
鍵,這樣就可以將一個 Pane 垂直分割爲兩個 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 是哪個了。
要切換到上一個 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
-
使用
C-b :
進入 tmux 末行模式,設置 Copy 模式使用按鍵模式爲 vi 模式::setw -g mode-keys vi
-
使用
C-b [
進入 Copy 模式 -
按
Spacebar
開始選中,移動光標選擇選中區域 -
按
Enter
複製選中區域內容並退出 Copy 模式 -
將光標移動到指定位置,使用
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/