效率為王:終端管理工具 Tmux
簡介
Tmux 是一款非常實用的終端復用器,用來管理一個終端窗口中運行的多個終端會話。它通過會話,窗口,面板的形式高效且有序的管理你所有的工作終端。
此外,它還可以通過將終端會話置于后臺運行,在需要時按需接入,以及將會話共享給其他人,是遠程辦公和結對編程的利器。無論是前端還是后端開發工程師,運維人員,都值得將其加入個人的日常工具列表。
安裝
在 MacOs 下,安裝 tmux 非常簡單,使用 homebrew 便可以安裝最新的版本:
brew install tmux
對于 Linux,大部分發行版都有打包 tmux,可以通過包管理器安裝,比如在 Ubuntu 下,可以使用 apt 安裝。
apt install tmux
在 windows 下想使用 tmux 有兩種方法:
-
window10 加入了 linux 子系統的功能,用戶可以在 windows 下使用 Ubuntu linux。安裝 tmux 的方法和原生 Ubuntu 完全一樣;
-
對于 windows7 以及更加古老的版本,個人推薦使用 Cygwin,這是一個在 windows 下模擬 linux 的工具,提供了大部分 *nix 軟件的安裝,里面就包括了 tmux。
初次使用
初次使用 tmux,只需要在終端下面鍵入命令:
tmux
默認情況下會啟動一個新的會話(session)。這時候窗口顯示如下:
可以看到 Tmux 在默認終端上面啟動了一個新的界面。包括原來的 shell 窗口和下方的狀態欄。
狀態欄顯示了當前 tmux session 的基本信息。
-
[0] 代表當前 session 的名字;
-
0:bash 代表當天 session 的第一個窗口,名字為 bash;
-
其他部分為當前主機名,以及當前時間。
作為一款基于終端的工具,tmux 所有的操作都使用鍵盤快捷鍵來進行,熟悉了 tmux 的快捷鍵之后,我們可以把自己的雙手從鼠標完全解放出來,對提高工作生產力有極大的作用。
tmux 的快捷鍵使用 Prefix + key 的形式。如果使用過 Gnu screen,那么對這種模式應該很熟悉,不同的是,Gnu screen 默認的 prefix 是 ctrl + a
,而 tmux 的默認快捷鍵是 ctrl + b
,按鍵方法為同時按下 ctrl 鍵 和 b 鍵。這個組合是可以定制的,在本文中,我們用 prefix
來代表這個按鍵組合。
現在我們可以使用快捷鍵創建一個新的窗口,按下 prefix + c
(同時按下 Ctrl + b,放開,然后按下 c)。
效果如下圖所示:
此時整個窗口沒有太大的變化,只是下面的狀態欄多了一個 1:bash
,表示當前啟動了兩個窗口。
現在可以試著按下 prefix + n
,看 tmux 如何在不同的窗口間轉跳。
服務器和會話
tmux 本質上可以說是一個服務器,當 tmux 命令運行的時候,后臺運行了一個 tmux 服務,并啟動一個會話,會話和服務器之間通過 Unix socket 來通信。
默認情況下啟動的 tmux 會話通過數字命名,比如第一個會話為 0。可以通過:
tmux new -s session_name
來創建一個命名的 tmux 會話,比如tmux new -s test
。啟動會話之后,tmux 自動連接到此會話之上。我們可以脫離會話,這樣可以將會話里面運行的任務置于后臺,在需要的時候重新連接。
脫離會話的快捷鍵為 prefix + d
,脫離會話之后系統回到之前的終端。用這種方法,我們可以方便在在遠程主機上啟動一個長期運行的 tmux 會話,運行我們想長期運行的程序。我們可以用 tmux ls
查看當前所有創建的 session,比如:
tmux ls learn: 1 windows (created Sun Dec 17 21:03:20 2017) [80x24] test: 1 windows (created Sun Dec 17 20:59:44 2017) [80x24]
這里我創建了兩個 tmux 會話,名字分別為 test
和learn
。
重新連接 tmux 的命名為tmux attach
。在沒有任何參數的情況下默認連接最新創建的會話。可以添加參數-t $name
,連接名字為$name
的 tmux 會話。比如tmux a -t learn
。同時這里顯示了一個 tmux 的小技巧,很多 tmux 的命令可以縮寫,這里將 attach 縮寫成為了 a。
在 tmux session 里面,可以通過 prefix + s
選擇并快速切換 tmux 會話,如下圖所示。tmux 會彈出一個會話的選擇列表,可以通過方向鍵選擇我們想打開的會話。
如果在創建了會話之后想重命名當前會話,可以使用prefix + $
,在底部彈出的輸入框里面輸入想要的名字即可。這里也可以使用 tmux 的命令模式。按下prefix + :
,在輸入框里輸入:rename-session new-session
(支持 tab 補全),便可以重命名當前的會話。
注意當服務器重啟之后,tmux 的會話信息會丟失。要持久化保存 tmux 會話信息,在本文的 tmux 插件部分會介紹一款簡單易用的插件 tmux-resurrect
。
窗口
之前我們演示了如何創建新的窗口,并使用prefix + n
,表示選擇下一個窗口。
在不同窗口之間移動,除了 prefix + n
之外,還可以用數字鍵,選擇第 N 個窗口,注意 tmux 中窗口的序號是從 0 開始,因此prefix + 1
表示選擇第二個窗口。prefix + p
表示轉跳到前一個窗口。
我們還可以使用快捷鍵prefix + w
來彈出一個虛擬的窗口列表,然后使用方向鍵來選擇所需要打開的窗口。
使用prefix + ,
可以用來重命名當前的窗口,對應的命令模式為rename-window
。
鍵入 exit,會退出當前窗口,但是有的時候窗口可能會卡死,此時我們可以使用prefix + &
,在輸入確認之后,強制殺死當前窗口。
面板
窗口可以分割為更小的面板,配合大屏顯示器使用,非常有黑客的感覺。首先我們使用:
tmux new -s pane
創建一個新的 session,然后鍵入prefix + %
,然后鍵入prefix + "
,可以得到如下這樣一個被分割的窗口:
當前光標所在的面板被高亮了出來。 我們可以繼續鍵入prefix + %
和prefix + "
查看繼續分割面板的效果。要在不同的面板之間轉跳,使用快捷鍵prefix + o
。如果要想上下左右的移動到不同的面板,使用快捷鍵prefix + 方向鍵
。
在默認情況下,tmux 平均分割一個面板。我們可以通過prefix + ctrl + 方向鍵
來調整面板的大小。
有的時候我們可能需要將一個面板放大,占滿整個窗口。我們可以使用prefix +!
,將面板轉化為一個新的窗口;或者也可以使用prefix + z
,使當前面板最大化為窗口,并暫時隱藏其他的面板。
強制退出一個面板的快捷鍵為prefix + x
。
小結
會話 + 窗口 + 面板的組合是提升我們工作效率的一個強力組合。一個推薦的使用方法為對不同的項目建立不通的會話,使用窗口來分割一個項目里面的不同工作內容,然后使用面板來適用大屏開發。下面的一個截屏是我工作所建立的所有會話列表:
不同的項目被我放到了不同的會話里面,當我需要轉跳到某一個項目的時候,使用prefix + s
轉跳到對應會話,之前項目所配置好的環境立刻就恢復了。
tmux 配置
tmux 比 screen 更加流行的一個原因就是在默認配置的情況下它已經足夠好用了。當然,我們也可以通過配置文件對 tmux 進行個性化配置。它的默認配置文件為 ~/.tmux.conf
,如果需要使用其他的文件,可以使用 tmux -f
選項,讀入另外一個配置文件。
默認 prefix
我們可以通過配置文件更改 tmux 的默認 prefix。個人使用的 prefix 為ctrl-z
,習慣了 screen 的人可以配置為ctrl-a
。這里以ctrl-z
為例,用文本編輯器打開~/.tmux.conf
,在里面加入內容:
set -g prefix C-z unbind-key C-b
這里 -g
表示全局設置,應用于我們創建的所有會話。這是ctrl-b
可以被釋放出來組合,這里通過unbind-key C-b
實現。
要使這個設置生效,我們應該重新加載 .tmux.conf。鍵入prefix + :
打開命名模式,在輸入框內輸入source ~/.tmux.conf
。此時我們就可以使用新的 prefix 了。
快速重載配置文件
修改完配置文件之后再使用命令行模式重載實在太麻煩了,我們可以自定義一個快捷鍵,簡化這個操作。在~/.tmux.conf
里面加入:
bind-key r source-file ~/.tmux.conf\; display-message "Config reloaded"
我們最后一次使用prefix + :
+ source ~/.tmux.conf
的方式重新加載配置文件。之后就可以用prefix + r
的方式來做這件事了。在 .tmux.conf 中加入。
bind e new-window -n ".tmux.conf" "vim ~/.tmux.conf"
這個prefix + e
的組合可以讓你迅速的打開 .tmux.conf 并進行配置修改,配置完成之后使用 prefix + r
的方式重新加載,整個操作在幾秒內即可完成。
更改默認序號
由于 tmux 的窗口和面板默認序號都是從 0 開始,我們可以更改這個設置,使默認序號從 1 開始。
set -g base-index 1 setw -g pane-base-index 1
更改分割面板的快捷鍵
tmux 垂直和水平分割面板的快捷鍵分別為prefix + %
和prefix + "
。這兩個按鍵比較難記憶,我們可以將其更改為prefix + |
和prefix + -
。將以下配置加入 ~/.tmux.conf
。
bind-key | split-window -h bind-key - split-window
更改面板間移動的快捷鍵
大部分鍵盤操作工具,比如 vim,都使用jkhl
來進行上下左右的移動操作。我們可以將面板間移動的操作綁定到對應的按鍵。配置如下:
bind-key l select-pane -R bind-key h select-pane -L bind-key j select-pane -D bind-key k select-pane -U
面板大小調整
我們用類似移動鍵的方式來進行面板的大小調整。將快捷鍵重新定義為 JKHL。配置如下:
bind-key L resize-pane -R 5 bind-key H resize-pane -L 5 bind-key K resize-pane -U 5 bind-key J resize-pane -D 5
鼠標模式
鼠標模式有時候也可能非常有用,比如你可能想用鼠標來選中一個面板或者窗口,用鼠標調整面板大小,或者用鼠標滾輪來向上滾動瀏覽歷史。
開啟 / 關閉鼠標模式的配置為 set -g mouse on/off
,需要在命令模式下敲入這串字符。我們可以更進一步,通過綁定到快捷鍵prefix +m
來觸發鼠標模式的開關。配置如下:
bind m run 'old=$(tmux show -gv mouse);new=""; if [ "$old" = "on" ]; then new="off"; else new="on"; fi; tmux set -g mouse $new; tmux display "mouse: $new"'
注意這是一行配置,細心的讀者可能已經發現,這其實是一段shell
腳本,在鼠標模式關閉的情況下打開它,反之亦然。
狀態欄的配置
默認 tmux 的狀態欄是窗口下方的一段綠色長條,如下圖:
它分為三個部分:
-
最右邊的會話名字;
-
中間的窗口列表;
-
左邊的主機信息。
這些顯示的信息,以及字體前景色,背景色都是可以靈活配置的。開源的好處就是社區已經有許多成熟的解決方案,這里面最受歡迎的是 powerline。
powerline 用 Python 編寫,安裝使用 Python 的包管理工具pip
pip install powerline-status
此外我們還需要安裝 powerline 使用的字體,可以在 https://github.com/powerline/fonts 下載并安裝。
對 tmux 使用 powerline,只需將如下配置加入 .tmux.conf,prefix + r
重新加載即可:
source "{repository_root}/powerline/bindings/tmux/powerline.conf"
其中 repository_root 是 powerline 的安裝路徑。以下是作者安裝 powerline 之后狀態欄的一個截屏:
復制模式
tmux 初學者經常遇到的一個問題就是發現無法使用滾動鍵向上滾動查看終端的歷史。要做到這一點,必須進入 tmux 的復制模式。
按下prefix + [
,tmux 就進入了復制模式,再按回車鍵退出。默認情況下 tmux 保存 1000 行終端歷史。我們可以通過。
set -g history-limit 10000
調整歷史記錄大小。
tmux 復制模式可以使用兩種鍵盤模式,Vi 和 Emacs,默認為 Emacs,我們通過:
set -g mode-keys vi
更改為 Vi 的鍵盤模式。在 Vi 模式下,可以通過 jkhl 來上下左右移動光標。
要復制文本,我們先進入復制模式,將光標移動到指定位置,按下空格鍵,然后移動光標來選擇文本,被選擇的文本會高亮顯示,最后按回車鍵,表示選擇完畢。
此時敲入命令tmux list-buffer
,我們可以看到 tmux 緩存區保存的文本,使用tmux paste-buffer
或者快捷鍵prefix + ]
可以粘貼緩存區里面的內容。
更加高級的是 tmux 維護一個緩沖區的棧,每復制一次,tmux 在這個棧頂部創建了一個新的緩沖區。現在我們可以多復制幾次文本,然后鍵入命令tmux list-buffers
,這時可以看到一個緩沖列表。
再敲入命令tmux choose-buffer
,tmux 會創建一個選擇框,我們可以選擇需要粘貼的文本,然后回車,對應文本就插入到了光標位置。
vim 用戶可以重新配置這些命令和快捷鍵,讓使用起來更加熟悉。
bind-key -Tcopy-mode-vi 'v' send -X begin-selection bind-key -Tcopy-mode-vi 'y' send -X copy-selection unbind p bind p paste-buffer bind b choose-buffer
現在在復制模式下可以使用 v 和 y 來選擇文本,使用prefix + p
粘貼文本,使用prefix + b
來選擇緩沖(將 prefix 設置成為 ctrl + b 的用戶可自行選擇其他快捷鍵)。
其他配置
為了使 tmux 更好的工作,作者在這里還貼出一些其他的 tmux 基本配置。
set -g default-terminal "screen-256color" # 顏色支持 setw -q -g utf8 on # utf8 支持 set -q -g status-utf8 on # tmux < 2.2 setw -g automatic-rename on # 自動重命名窗口 set -g renumber-windows on # 關閉窗口的時候重新計算窗口 index set -g display-time 4000 # tmux 消息提示時間為 4 秒
session 共享和結對編程
目前很多企業都在推行結對編程,兩個人同一工作臺前開發軟件。當開發人員在同一個辦公室的情況下,實施結對編程比較簡單,但是如果開發人員處于異地的狀態,實施結對編程就必須有屏幕共享的軟件。
而 tmux 基于終端的會話共享可以在即使網絡狀況不佳的情況下提供良好的結對編程體驗。
我們先來看一下最基本的會話共享機制。
假設有主機 Foo,程序員 A ssh 連接到了這臺主機,并使用 tmux 開始了會話 pairing。
tmux new -s pairing
A 想把這個會話共享給開發人員 B,那么他只需要讓 B 登錄同一臺主機的同一個用戶,B 就可以用命令。
tmux attach -t pairing
attach 到同一個會話。此時 A 和 B 看到的就是同一會話的統一窗口,兩人的操作也會完全同步到各自的屏幕上。
這種方法一個不那么完美的地方就是 A 和 B 看到的屏幕永遠是完全一致的,有的時候我們可能需要讓 A 和 B 能夠同時做不同的事情,同步窗口的結果但不必保持窗口顯示的同步。要做到這一點,只需要 B 使用命令:
tmux new -s test -t pairing
創建一個新的會話并將其加入到 pairing 會話即可。這樣 A 和 B 看到的窗口結果是一樣,但是兩人都可以獨立輸入而不會互相打擾。
如果想在不共享服務器的登錄權限的情況下共享 tmux 會話,可以嘗試使用 tmate。它是一款 tmux 的 fork,可以在無需登錄主機的情況下只讀的共享你的 tmux 會話。詳細使用讀者可以自行參考相關網站。
插件管理
tmux 官方支持一系列的插件,可以在 https://github.com/tmux-plugins 找到。注意大部分插件都需要 tmux 1.9 + 版本。
tpm
首先需要提及的是插件管理工具 tpm,它可以用來方便的安裝和刪除插件。安裝 tpm 的方法為
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
在 ~/.tmux.conf
中加入這些配置:
#tmux 插件列表 set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' #將這一行插入 .tmux.conf 最底部 run '~/.tmux/plugins/tpm/tpm'
然后使用prefix + r
重新加載 tmux 配置,就可以使用 tmp 了。
當在 .tmux.conf 里面加入了新的插件時,我們可以使用prefix + I
安裝插件,使用prefix + U
更新插件。刪除插件的快捷鍵為prefix + alt + u
。
會話保持:tmux-resurrect
tmux-resurrect 是一款輕量級的會話保持插件。它可以用來在服務器重啟之后重新加載之前保存的 tmux 會話。
安裝 tmux-resurrect,首先將 set -g @plugin 'tmux-plugins/tmux-resurrect'
加入到 .tmux.conf 中,然后按prefix + I
安裝。
保存 tmux 會話的方法為prefix + C-s
。保存成功之后會出現如下提示
此時我們如果重啟機器,然后打開一個新的 tmux 會話,那么可以使用快捷鍵prefix + C-r
恢復保存的會話信息。
tmuxinator 是另外一款 tmux 的會話保持工具,它通過編輯和讀取配置文件的形式進行會話的保持。這里留給讀者自行參考。
結束語
到此為止,本篇關于 tmux 的介紹就結束了。正如文章開頭所說,tmux 可以大幅度的提高工作效率,希望讀者都能喜愛上這一款優秀的終端管理工具。

責任編輯:售電衡衡
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網
-
新基建助推 數據中心建設將迎爆發期
2020-06-16數據中心,能源互聯網,電力新基建 -
泛在電力物聯網建設下看電網企業數據變現之路
2019-11-12泛在電力物聯網 -
泛在電力物聯網建設典型實踐案例
2019-10-15泛在電力物聯網案例
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長期助力儲能行業發展
-
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網 -
5G新基建助力智能電網發展
2020-06-125G,智能電網,配電網 -
從智能電網到智能城市