命令列工具中的瑞士軍刀 - tmux

colawarrior發表於2018-02-23

Tmux 簡單來說就是終端裡的『視窗管理器』,如果我使用終端登入到遠端主機並執行前臺程式,那麼這個視窗等於就被佔用了,想要看一下 CPU 的使用率,就得再連線一次。但是如果在遠端主機上執行 tmux,那麼就可以開啟多個控制檯(類似於視窗),相當高效。

Hello World

前面提到的視窗管理只是 tmux 功能的一小部分,另一個很有用的功能就是,連線到遠端主機之後,一旦斷開,那麼當前賬戶登入的任務就被取消了,但是使用 tmux 可以在斷開之後繼續工作,下次登入可以檢視。其他的功能還有:

  1. 視窗切換,每個視窗裡還可以分割皮膚
  2. 配置方便,可以使用指令碼
  3. 類似 vim 的雙層操作邏輯
  4. 複製貼上緩衝區

安裝的話也很簡單,在 mac 下直接 brew install tmux(前提需要安裝 homebrew),ubuntu 下則直接 sudo apt-get install tmux

在終端中輸入 tmux 就可以開啟一個新的 tmux session,tmux 的所有操作必須先使用一個字首鍵(預設是 ctrl + b)進入命令模式,或者說進入控制檯,就像 vim 中的 esc。

基本操作

資訊查詢

  • tmux list-keys 列出所有可以的快捷鍵和其執行的 tmux 命令
  • tmux list-commands 列出所有的 tmux 命令及其引數
  • tmux info 流出所有的 session, window, pane, 執行的程式號,等。

視窗控制

先來看看在 tmux 之外如何進行控制

  • session 會話:session是一個特定的終端組合。輸入tmux就可以開啟一個新的session
    • tmux new -s session_name 建立一個叫做 session_name 的 tmux session
    • tmux attach -t session_name 重新開啟叫做 session_name 的 tmux session
    • tmux switch -t session_name 轉換到叫做 session_name 的 tmux session
    • tmux list-sessions / tmux ls 列出現有的所有 session
    • tmux detach 離開當前開啟的 session
    • tmux kill-server 關閉所有 session
  • window 視窗:session 中可以有不同的 window(但是同時只能看到一個 window)
    • tmux new-window 建立一個新的 window
    • tmux list-windows
    • tmux select-window -t :0-9 根據索引轉到該 window
    • tmux rename-window 重新命名當前 window
  • pane 皮膚:window 中可以有不同的 pane(可以把 window 分成不同的部分)
    • tmux split-window 將 window 垂直劃分為兩個 pane
    • tmux split-window -h 將 window 水平劃分為兩個 pane
    • tmux swap-pane -[UDLR] 在指定的方向交換 pane
    • tmux select-pane -[UDLR] 在指定的方向選擇下一個 pane

更常用的是在 tmux 中直接通過預設字首 ctrl + b 之後輸入對應命令來操作,具體如下(這裡只列出輸入預設字首之後需要輸入的操作):

基本操作

  • ? 列出所有快捷鍵;按q返回
  • d 脫離當前會話,可暫時返回Shell介面
  • s 選擇並切換會話;在同時開啟了多個會話時使用
  • D 選擇要脫離的會話;在同時開啟了多個會話時使用
  • : 進入命令列模式;此時可輸入支援的命令,例如 kill-server 關閉所有tmux會話
  • [ 複製模式,游標移動到複製內容位置,空格鍵開始,方向鍵選擇複製,回車確認,q/Esc退出
  • ] 進入貼上模式,貼上之前複製的內容,按q/Esc退出
  • ~ 列出提示資訊快取;其中包含了之前tmux返回的各種提示資訊
  • t 顯示當前的時間
  • ctrl + z 掛起當前會話

視窗操作

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

皮膚操作

  • " 將當前皮膚上下分屏(我自己改成了 |
  • % 將當前皮膚左右分屏(我自己改成了 -
  • x 關閉當前分屏
  • ! 將當前皮膚置於新視窗,即新建一個視窗,其中僅包含當前皮膚
  • ctrl+方向鍵 以1個單元格為單位移動邊緣以調整當前皮膚大小
  • alt+方向鍵 以5個單元格為單位移動邊緣以調整當前皮膚大小
  • q 顯示皮膚編號
  • o 選擇當前視窗中下一個皮膚
  • 方向鍵 移動游標選擇對應皮膚
  • { 向前置換當前皮膚
  • } 向後置換當前皮膚
  • alt+o 逆時針旋轉當前視窗的皮膚
  • ctrl+o 順時針旋轉當前視窗的皮膚
  • z 最大化當前所在皮膚
  • page up 向上滾動螢幕,q 退出
  • page down 向下滾動螢幕,q 退出

因為 iTerm2 的支援,很多切換的操作可以直接用滑鼠進行,非常方便。具體大家可以自己嘗試一下。

配置

我們可以先進行一些簡單的配置,修改 ~/.tmux.conf 即可,讓整個使用更方便。

#-- base --#
set -g default-terminal "screen-256color"
set -g display-time 3000
set -g history-limit 10000
set -g base-index 1
set -g pane-base-index 1
set -s escape-time 0
set -g mouse on

#-- bindkeys --## split windows like vim.  - Note: vim's definition of a horizontal/vertical split is reversed from tmux's
unbind s
bind s split-window -v
bind S split-window -v -l 40
bind v split-window -h
bind V split-window -h -l 120

# navigate panes with hjkl
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# key bindings for horizontal and vertical panes
unbind %
bind | split-window -h      # 使用|豎屏,方便分屏
unbind '"'
bind - split-window -v      # 使用-橫屏,方便分屏

# swap panes
bind ^u swapp -U
bind ^d swapp -D
bind q killp
bind ^e last
unbind r
bind r source-file ~/.tmux.conf \; display "Configuration Reloaded!"

#-- statusbar --#
set -g status-justify centre
set -g status-left "#[fg=red]s#S:w#I.p#P#[default]"
set -g status-right '[#(whoami)#(date +" %m-%d %H:%M ")]'
set -g status-left-attr bright
set -g status-left-length 120
set -g status-right-length 120
set -g status-utf8 on
set -g status-interval 1
set -g visual-activity on
setw -g monitor-activity on
setw -g automatic-rename off

# default statusbar colors
set -g status-bg colour235 #base02
set -g status-fg colour136 #yellow
set -g status-attr default

# default window title colors
setw -g window-status-fg colour244
setw -g window-status-bg default
#setw -g window-status-attr dim

# active window title colors
setw -g window-status-current-fg colour166 #orange
setw -g window-status-current-bg default
#setw -g window-status-current-attr bright

# window title string (uses statusbar variables)
set -g set-titles-string '#T'
set -g status-justify "centre"
set -g window-status-format '#I #W'
set -g window-status-current-format ' #I #W '

# pane border
set -g pane-active-border-fg '#55ff55'
set -g pane-border-fg '#555555'

# message text
set -g message-bg colour235 #base02
set -g message-fg colour166 #orange

# pane number display
set -g display-panes-active-colour colour33 #blue
set -g display-panes-colour colour166 #orange

# clock
setw -g clock-mode-colour colour64 #green

# 修改進入命令模式按鍵
# remap prefix to Control + a
# set -g prefix C-a
# unbind C-b
# bind C-a send-prefix
複製程式碼

參考連結


相關文章