天天看點

Tmux說明及配置

作者:超越永無止境技有所長

Tmux是一款優秀的終端複用軟體,它比Screen更加強大,至于如何強大,網上有大量的文章讨論了這點,本文不再重複。tmux之是以受人們喜愛,主要得益于以下三處功能:

  • 絲滑分屏(split),雖然iTem2也提供了橫向和豎向分屏功能,但這種分屏功能非常拙劣,完全等同于螢幕新開一個視窗,新開的pane不會自動進入到目前目錄,也沒有記住目前登入狀态。這意味着如果我ssh進入到遠端伺服器時,iTem2新開的pane中,我依然要重新走一遍ssh登入的老路(omg)。tmux就不會這樣,tmux視窗中,新開的pane,預設進入到之前的路徑,如果是ssh連接配接,登入狀态也依舊保持着,如此一來,我就可以随意的增删pane,這種靈活性,好處不言而喻。
  • 保護現場(attach),即使指令行的工作隻進行到一半,關閉終端後還可以重新進入到操作現場,繼續工作。對于ssh遠端連接配接而言,即使網絡不穩定也沒有關系,掉線後重新連接配接,可以直奔現場,之前運作中的任務,依舊在跑,就好像從來沒有離開過一樣;特别是在遠端伺服器上運作耗時的任務,tmux可以幫你一直保持住會話。如此一來,你就可以随時随地放心地進行移動辦公,隻要你附近的計算機裝有tmux(沒有你也可以花幾分鐘裝一個),你就能繼續剛才的工作。
  • 會話共享(适用于結對程式設計或遠端教學),将 tmux 會話的位址分享給他人,這樣他們就可以通過 SSH 接入該會話。如果你要給同僚示範遠端伺服器的操作,他不必直勾勾地盯着你的螢幕,借助tmux,他完全可以進入到你的會話,然後靜靜地看着他桌面上你風騷的鍵盤走位,隻要他願意,甚至還可以錄個屏。

以上,隻是主要功能,更多功能還在後頭,接下來我将詳細地介紹tmux的使用技巧。

Tmux 配置

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

  1. 視窗切換,每個視窗裡還可以分割面闆
  2. 配置友善,可以使用腳本
  3. 類似 vim 的雙層操作邏輯
  4. 複制粘貼緩沖區

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

(adsbygoogle = window.adsbygoogle || []).push({});

在終端中輸入 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就可以打開一個新的 sessiontmux new -s session_name 建立一個叫做 session_name 的 tmux sessiontmux attach -t session_name 重新開啟叫做 session_name 的 tmux sessiontmux switch -t session_name 轉換到叫做 session_name 的 tmux sessiontmux list-sessions / tmux ls 列出現有的所有 sessiontmux detach 離開目前開啟的 sessiontmux kill-server 關閉所有 session
  • window 視窗:session 中可以有不同的 window(但是同時隻能看到一個 window)tmux new-window 建立一個新的 windowtmux list-windowstmux select-window -t :0-9 根據索引轉到該 windowtmux rename-window 重命名目前 window
  • pane 面闆:window 中可以有不同的 pane(可以把 window 分成不同的部分)tmux split-window 将 window 垂直劃分為兩個 panetmux split-window -h 将 window 水準劃分為兩個 panetmux swap-pane -[UDLR] 在指定的方向交換 panetmux 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 3000set -g history-limit 10000set -g base-index 1set -g pane-base-index 1set -s escape-time 0set -g mouse on #-- bindkeys --## split windows like vim. - Note: vim's definition of a horizontal/vertical split is reversed from tmux'sunbind sbind s split-window -vbind S split-window -v -l 40bind v split-window -hbind V split-window -h -l 120 # navigate panes with hjklbind h select-pane -Lbind j select-pane -Dbind k select-pane -Ubind l select-pane -R # key bindings for horizontal and vertical panesunbind %bind | split-window -h # 使用|豎屏,友善分屏unbind '"'bind - split-window -v # 使用-橫屏,友善分屏 # swap panesbind ^u swapp -Ubind ^d swapp -Dbind q killpbind ^e last unbind rbind r source-file ~/.tmux.conf \; display "Configuration Reloaded!" #-- statusbar --#set -g status-justify centreset -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 brightset -g status-left-length 120set -g status-right-length 120set -g status-utf8 onset -g status-interval 1set -g visual-activity onsetw -g monitor-activity onsetw -g automatic-rename off # default statusbar colorsset -g status-bg colour235 #base02set -g status-fg colour136 #yellowset -g status-attr default # default window title colorssetw -g window-status-fg colour244setw -g window-status-bg default#setw -g window-status-attr dim # active window title colorssetw -g window-status-current-fg colour166 #orangesetw -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 borderset -g pane-active-border-fg '#55ff55'set -g pane-border-fg '#555555' # message textset -g message-bg colour235 #base02set -g message-fg colour166 #orange # pane number displayset -g display-panes-active-colour colour33 #blueset -g display-panes-colour colour166 #orange # clocksetw -g clock-mode-colour colour64 #green # 修改進入指令模式按鍵# remap prefix to Control + a# set -g prefix C-a# unbind C-b# bind C-a send-prefix           

版本2

# --------------------------------------------------- Tmux Config ----------------------------------------------------------- # --------------------------------------------------- prefix -----------------------------------------------------------# 修改指令字首set -g prefix C-f #unbind C-f # C-b 即 Ctrl+b 鍵,unbind 意味着解除綁定bind C-f send-prefix # 綁定 Ctrl+f 為新的指令字首 # 從tmux v1.6版起,支援設定第二個指令字首# set-option -g prefix2 ` # 設定一個不常用的`鍵作為指令字首,按鍵更快些 # 添加載在配置檔案指令為: rbind r source-file ~/.tmux.conf \; display-message "Config reloaded.."  # --------------------------------------------------- 更改新增面闆鍵 -----------------------------------------------------------unbind '"'bind - splitw -v -c '#{pane_current_path}' # 垂直方向新增面闆,預設進入目前目錄unbind %bind =  splitw -h -c '#{pane_current_path}' # 水準方向新增面闆,預設進入目前目錄 # --------------------------------------------------- 開啟滑鼠支援 -----------------------------------------------------------# v2.1及以上的版本set-option -g mouse on   # --------------------------------------------------- vim 風格 -----------------------------------------------------------# 綁定hjkl鍵為面闆切換的上下左右鍵 bind -r k select-pane -U # 綁定k為↑bind -r j select-pane -D # 綁定j為↓bind -r h select-pane -L # 綁定h為←bind -r l select-pane -R # 綁定l為→ # 面闆調整大小# 綁定Ctrl+hjkl鍵為面闆上下左右調整邊緣的快捷指令 bind -r ^k resizep -U 10 # 綁定Ctrl+k為往↑調整面闆邊緣10個單元格bind -r ^j resizep -D 10 # 綁定Ctrl+j為往↓調整面闆邊緣10個單元格bind -r ^h resizep -L 10 # 綁定Ctrl+h為往←調整面闆邊緣10個單元格bind -r ^l resizep -R 10 # 綁定Ctrl+l為往→調整面闆邊緣10個單元格 # 複制模式更改為 vi 風格# 進入複制模式 快捷鍵:prefix + [ setw -g mode-keys vi # 開啟vi風格後,支援vi的C-d、C-u、hjkl等快捷鍵 # --------------------------------------------------- 複制粘貼 ----------------------------------------------------------- # 複制模式向 vi 靠攏 #舊版本:#bind -t vi-copy v begin-selection  # 綁定v鍵為開始選擇文本#bind -t vi-copy y copy-selection # 綁定y鍵為複制選中文本 # 新版本:bind -T copy-mode-vi v send -X begin-selection # 開始複制bind -T copy-mode-vi y send -X copy-selection # 複制剪切闆bind p pasteb # 綁定p鍵為粘貼文本(p鍵預設用于進入上一個視窗,不建議覆寫)    # --------------------------------------------------- 其他 ----------------------------------------------------------- #設定視窗面闆起始序号set -g base-index 1 # 設定視窗的起始下标為1set -g pane-base-index 1 # 設定面闆的起始下标為1set -s focus-events onset-window-option -g automatic-rename onset-window-option -g monitor-activity on  # --------------------------------------------------- 狀态欄 ----------------------------------------------------------- set -wg window-status-format " #I #W " # 狀态欄視窗名稱格式set -wg window-status-current-format " #I:#W#F " # 狀态欄目前視窗名稱格式(#I:序号,#w:視窗名稱,#F:間隔符)set -wg window-status-separator "" # 狀态欄視窗名稱之間的間隔set -g message-style "bg=#202529, fg=#91A8BA" # 指定消息通知的前景、後景色  # 自定義狀态欄set -g status-interval 1 # 狀态欄重新整理時間set -g status-justify left # 狀态欄清單左對齊setw -g monitor-activity on # 非目前視窗有内容更新時在狀态欄通知  # --------------------------------------------------- linux ----------------------------------------------------------- # set -g status-left "Zorn #W" # 狀态欄左側内容# set -g status-fg yellow # 設定狀态欄前景黃色# set -g status-style "bg=black, fg=yellow" # 狀态欄前景背景色 # set -g status-right 'zorn@machine #{continuum_status}' # 狀态欄右側内容# set -g status-left-length 300 # 狀态欄左邊長度300# set -g status-right-length 500 # 狀态欄左邊長度500 # set -wg window-status-current-style "bg=black" # 狀态欄目前視窗名稱的樣式# set -wg window-status-current-style "bg=red" # 狀态欄目前視窗名稱的樣式# set -wg window-status-last-style "fg=red" # 狀态欄最後一個視窗名稱的樣式  set -g status-left " #W" # 狀态欄左側内容   # --------------------------------------------------- mac ----------------------------------------------------------- # rainbar# set-option -g status-utf8 onset -g status-right '#(rainbarf)' # Gnome Terminal# set -g status-right '#(rainbarf --rgb)'  # Status bar# powerlineset -g status-bg blackset-option -g status onset-option -g status-interval 1set-option -g status-justify "centre"set-option -g status-left-length 60set-option -g status-right-length 90set-option -g status-left "#(~/.config/tmux/tmux-powerline/powerline.sh left)"set-window-option -g window-status-current-format '#[fg=Magenta,bold] #I #W:#F'  # --------------------------------------------------- fzf_panes ---------------------------------------------------- set-hook -g pane-focus-in "run -b 'bash ~/.config/tmux/fzf_panes.tmux update_mru_pane_ids'"bind-key -n M-n run -b 'bash ~/.config/tmux/fzf_panes.tmux new_window'  # --------------------------------------------------- one colors ---------------------------------------------------  # Add truecolor supportset-option -ga terminal-overrides ",xterm-256color:Tc"# Default terminal is 256 colorsset -g default-terminal "screen-256color"  # --------------------------------------------------- End -----------------------------------------------------------           

繼續閱讀