Linux下終端利器tmux(轉)


“君子生非異也,善假於物也” 。–語出《荀子·勸學》

如果記得沒錯的話,《荀子·勸學》我們這一代高中的時候應該都讀過這篇文章。原意大概是君子的資質與一般人沒有什么區別,君子之所以高於一般人,是因為他能善於利用外物。對於技術人來說,好工具的選擇和使用往往可以省去很多不必要的麻煩,好的開源工具很多,看你如何去使用。對於終端復用工具這里推薦使用tmux,當然此類工具比較好的還有screen,不過相對screen 這里我更傾向於推薦tmux[強悍的分屏等]。

如果僅僅只是多標簽的功能,那么putty結合一些工具也可以做到,或者干脆使用xshell,當然tmux此類工具不僅僅是那么簡單。另外一個選擇使用tmux/screen工具的原因是,有時我們會經常需要SSH或者telent遠程登錄到Linux服務器,有一些任務需要長時間運行,比如系統備份、數據傳輸等。通常情況下我們都是開一個遠程終端窗口,因為執行時間比較長,一般需要等待它執行完畢,在此過程中不能關閉窗口或者網絡原因斷開連接,斷開之后就Game Over了。這個功能就有點類似nohupsetsid命令的實現了,而tmux/screen則集nohup/setsid和多標簽於一身。廢話少說,我們接下來看如何安裝使用它。

安裝

安裝的話這里就不過說明了,不同的Linux發行版相應的包管理機制不同,安裝tmux包即可。

使用技巧

幾個名詞

tmux主要包括以下幾個模塊:

session 會話:一個服務器可以包含多個會話
window 窗口:一個會話可以包含多個窗口
pane 面板:一個窗口可以包含多個面板[強悍的分屏]

 

小試牛刀

列出了tmux的幾個基本模塊之后,就要來點實實在在的干貨了,和screen默認激活控制台的Ctrl+a不同,tmux默認的是Ctrl+b,使用快捷鍵之后就可以執行一些相應的指令了。當然如果你不習慣使用Ctrl+b,也可以在~/.tmux文件中加入以下內容把快捷鍵變為Ctrl+a

# Set prefix key to Ctrl-a unbind-key C-b set-option -g prefix C-a 

以下所有的操作都是激活控制台之后,即鍵入Ctrl+b前提下才可以使用的命令【這里假設快捷鍵沒改,改了的話則用Ctrl+b】。

基本操作

? 列出所有快捷鍵;按q返回
d 脫離當前會話,可暫時返回Shell界面,輸入tmux attach能夠重新進入之前會話
s 選擇並切換會話;在同時開啟了多個會話時使用
D 選擇要脫離的會話;在同時開啟了多個會話時使用
: 進入命令行模式;此時可輸入支持的命令,例如kill-server所有tmux會話
[ 復制模式,光標移動到復制內容位置,空格鍵開始,方向鍵選擇復制,回車確認,q/Esc退出
] 進入粘貼模式,粘貼之前復制的內容,按q/Esc退出
~ 列出提示信息緩存;其中包含了之前tmux返回的各種提示信息
t 顯示當前的時間
Ctrl+z 掛起當前會話

 

窗口操作:

c 創建新窗口
& 關閉當前窗口
數字鍵 切換到指定窗口
p 切換至上一窗口
n 切換至下一窗口
l 前后窗口間互相切換
w 通過窗口列表切換窗口
, 重命名當前窗口,便於識別
. 修改當前窗口編號,相當於重新排序
f 在所有窗口中查找關鍵詞,便於窗口多了切換

 

面板操作:

將當前面板上下分屏
% 將當前面板左右分屏
x 關閉當前分屏
! 將當前面板置於新窗口,即新建一個窗口,其中僅包含當前面板
Ctrl+方向鍵 以1個單元格為單位移動邊緣以調整當前面板大小
Alt+方向鍵 以5個單元格為單位移動邊緣以調整當前面板大小
空格鍵 可以在默認面板布局中切換,試試就知道了
q 顯示面板編號
o 選擇當前窗口中下一個面板
方向鍵 移動光標選擇對應面板
{ 向前置換當前面板
} 向后置換當前面板
Alt+o 逆時針旋轉當前窗口的面板
Ctrl+o 順時針旋轉當前窗口的面板
z tmux 1.8新特性,最大化當前所在面板

 

.tmux.conf基本配置

軟件到手了,自己怎么舒服就怎么用。定制主要還是在於.tmux.conf配置文件的配置,以下列出我的配置文件:

# Set prefix key to Ctrl-a unbind-key C-b set-option -g prefix C-a bind-key C-a last-window # 方便切換,個人習慣 bind-key a send-prefix # shell下的Ctrl+a切換到行首在此配置下失效,此處設置之后Ctrl+a再按a即可切換至shell行首  # reload settings # 重新讀取加載配置文件 bind R source-file ~/.tmux.conf \; display-message "Config reloaded..."  # Ctrl-Left/Right cycles thru windows (no prefix) # 不使用prefix鍵,使用Ctrl和左右方向鍵方便切換窗口 bind-key -n "C-Left" select-window -t :- bind-key -n "C-Right" select-window -t :+  # displays bind-key * list-clients  set -g default-terminal "screen-256color" # use 256 colors set -g display-time 5000 # status line messages display set -g status-utf8 on # enable utf-8 set -g history-limit 100000 # scrollback buffer n lines setw -g mode-keys vi # use vi mode  # start window indexing at one instead of zero 使窗口從1開始,默認從0開始 set -g base-index 1  # key bindings for horizontal and vertical panes unbind % bind | split-window -h # 使用|豎屏,方便分屏 unbind '"' bind - split-window -v # 使用-橫屏,方便分屏  # window title string (uses statusbar variables) set -g set-titles-string '#T'  # status bar with load and time set -g status-bg blue set -g status-fg '#bbbbbb' set -g status-left-fg green set -g status-left-bg blue set -g status-right-fg green set -g status-right-bg blue set -g status-left-length 90 set -g status-right-length 90 set -g status-left '[#(whoami)]' set -g status-right '[#(date +" %m-%d %H:%M ")]' set -g status-justify "centre" set -g window-status-format '#I #W' set -g window-status-current-format ' #I #W ' setw -g window-status-current-bg blue setw -g window-status-current-fg green  # pane border colors set -g pane-active-border-fg '#55ff55' set -g pane-border-fg '#555555' 

開啟批量執行

如果已經修改prefix鍵位Ctrl+a,則Ctrl+a[默認Ctrl+b]后輸入:set synchronize-panes ,輸入:set sync [TAB]鍵可自動補齊

 

取消批量執行模式重復之前操作即可

腳本化啟動

把以下腳本內容加入到~/.bashrc,即可每次登錄進入到tmux

tmux_init() {  tmux new-session -s "kumu" -d -n "local" # 開啟一個會話  tmux new-window -n "other" # 開啟一個窗口  tmux split-window -h # 開啟一個豎屏  tmux split-window -v "top" # 開啟一個橫屏,並執行top命令  tmux -2 attach-session -d # tmux -2強制啟用256color,連接已開啟的tmux }  # 判斷是否已有開啟的tmux會話,沒有則開啟 if which tmux 2>&1 >/dev/null; then  test -z "$TMUX" && (tmux attach || tmux_init) fi 

效果如下:

 

從 screen 切換到 tmux 十分平滑,tmux 的按鍵設置與 screen 大都相同,只是其默認按鍵前綴為 Ctrl-b。為了延續在 screen 中的使用習慣,我將其更改為 Ctrl-a。將下列內容加到 $HOME/.tmux.conf 中即可:

set -g prefix ^a  
unbind ^b  
bind a send-prefix

按鍵綁定

我還在 .tmux.conf 中定義了以下按鍵綁定:

  • 水平或垂直分割窗口

    unbind '"'  
    bind - splitw -v # 分割成上下兩個窗口  
    unbind %  
    bind | splitw -h # 分割成左右兩個窗口
    
  • 選擇分割的窗格

    bind k selectp -U # 選擇上窗格  
    bind j selectp -D # 選擇下窗格  
    bind h selectp -L # 選擇左窗格  
    bind l selectp -R # 選擇右窗格
    
  • 重新調整窗格的大小

    bind ^k resizep -U 10 # 跟選擇窗格的設置相同,只是多加 Ctrl(Ctrl-k)  
    bind ^j resizep -D 10 # 同上  
    bind ^h resizep -L 10 # ...  
    bind ^l resizep -R 10 # ...
    
  • 交換兩個窗格

    bind ^u swapp -U # 與上窗格交換 Ctrl-u  
    bind ^d swapp -D # 與下窗格交換 Ctrl-d
    
  • 執行命令,比如看 Manpage、查 Perl 函數

    bind m command-prompt "splitw -h 'exec man %%'"  
    bind @ command-prompt "splitw -h 'exec perldoc -f %%'"
    

定制狀態行

狀態行左邊默認就很好了,我對右邊定制了一下,顯示 uptime 和 loadavg:

set -g status-right "#[fg=green]#(uptime.pl)#[default] •
#[fg=green]#(cut -d ' ' -f 1-3 /proc/loadavg)#[default]"

下面兩行設置狀態行的背景和前景色:

set -g status-bg black  
set -g status-fg yellow

默認啟動應用

當 tmux 啟動時,可以默認啟動一些應用:

new -s work mutt # 新建名為 work 的會話,並啟動 mutt  
neww rtorrent # 啟動 rtorrent  
neww vim # 啟動 vim  
neww zsh  
selectw -t 3 # 默認選擇標號為 3 的窗口

復制與粘貼操作

  1. 按 C-a [ 進入復制模式,如果有設置 setw -g mode-keys vi 的話,可按 vi 的按鍵模式操作。移動至待復制的文本處,按一下空格,結合 vi 移動命令開始選擇,選好后按回車確認。

  2. 按 C-a ] 粘貼已復制的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM