tmux的使用方法和個性化配置


介紹

tmux是一個優秀的終端復用軟件,即使非正常掉線,也能保證當前的任務運行,這一點對於遠程SSH訪問特別有用,網絡不好的情況下仍然能保證工作現場不丟失!此外,tmux完全使用鍵盤控制窗口,實現窗口的切換功能。

簡單地說,tmux對於我主要有兩個功能(這應該也是tmux的主要功能):

  1. split窗口。可以在一個terminal下打開多個終端,也可以對當前屏幕進行各種split,即可以 同時打開多個顯示范圍更小的終端。
  2. 在使用SSH的環境下,避免網絡不穩定,導致工作現場的丟失。想象以下場景, 你在執行一條命令的過程中,由於網絡不穩定,SSH連接斷開了。這個時候,你就不知道之前 的那條命令是否執行成功。如果此時你打開了很多文件,進入了較深層次的目錄,由於網絡 不穩定,SSH連接斷開。重新連接以后,你又不得不重新打開那些文件,進入那個深層次的 目錄。如果使用了tmux,重新連接以后,就可以直接回到原來的工作環境,不但提高了工作 效率,還降低了風險,增加了安全性。

安裝

sudo apt-get install tmux

安裝完成后輸入命令tmux即可打開軟件,界面十分簡單,類似一個下方帶有狀態欄的終端控制台;不出意外,這時候你會跟我第一次一樣,覺得tmux沒什么牛逼的。

會話,窗口,面板

根據tmux的定義,在開啟了tmux服務器后,會首先創建一個會話,而這個會話則會首先創建一個窗口,其中僅包含一個面板;也就是說,這里看到的所謂終端控制台應該稱作tmux的一個面板,雖然其使用方法與終端控制台完全相同。

tmux使用C/S模型構建,主要包括以下單元模塊:

  • server服務器。輸入tmux命令時就開啟了一個服務器。
  • session會話。一個服務器可以包含多個會話
  • window窗口。一個會話可以包含多個窗口。
  • pane面板。一個窗口可以包含多個面板。

初體驗

我們先來看一張效果圖,再來學習tmux的配置和使用我一般都是這么用,因為我的筆記本只有13寸:-)

 

常用按鍵

這里需要說明一點的是,tmux的任何指令,都包含一個前綴,也就是說,你按了前綴(一組按鍵,默認是Ctrl+b)以后,系統才知道你接下來的指令是發送給tmux的。

    C-b ? 顯示快捷鍵幫助
    C-b C-o 調換窗口位置,類似與vim 里的C-w
    C-b 空格鍵 采用下一個內置布局
    C-b ! 把當前窗口變為新窗口
    C-b " 模向分隔窗口
    C-b % 縱向分隔窗口
    C-b q 顯示分隔窗口的編號
    C-b o 跳到下一個分隔窗口
    C-b 上下鍵 上一個及下一個分隔窗口
    C-b ALT-方向鍵 調整分隔窗口大小
    C-b c 創建新窗口
    C-b 0~9 選擇幾號窗口
    C-b c 創建新窗口
    C-b n 選擇下一個窗口
    C-b l 切換到最后使用的窗口
    C-b p 選擇前一個窗口
    C-b w 以菜單方式顯示及選擇窗口
    C-b t 顯示時鍾
    C-b ; 切換到最后一個使用的面板
    C-b x 關閉面板
    C-b & 關閉窗口
    C-b s 以菜單方式顯示和選擇會話
    C-b d 退出tumx,並保存當前會話,這時,tmux仍在后台運行,可以通過tmux attach進入 到指定的會話

配置

我們先來看一下幾個配置,這些配置才是我離不開tmux的原因:-)。tmux的配置文件是~/.tmux.conf,這個文件可能不存在,你可以自己新建。下面開始配置,首先,有沒有覺得tmux的前綴按起來太不方便了,ctrl與b鍵隔得太遠,很多人把它映射成C+a,也就是在配置文件(~/.tmux.conf)中加入下面這條語句:

#設置前綴為Ctrl + a
set -g prefix C-a

與此同時,取消默認的前綴按鍵:

#解除Ctrl+b 與前綴的對應關系
unbind C-b

配置完以后,重啟tmux起效,或者先按C+b,然后輸入:,進入命令行模式,在命令行模式下輸入:

source-file ~/.tmux.conf

你也可以跟我一樣,在配置文件中加入下面這句話,以后改了只需要按前綴+r了。

#將r 設置為加載配置文件,並顯示"reloaded!"信息
bind r source-file ~/.tmux.conf \; display "Reloaded!"

關於前綴,很多人都喜歡改成Ctrl+a,不過我個人更喜歡Ctrl+x,如果你是vim用戶,你一定懂的。還有就是面板的切換很不方便,需要先按前綴,再按方向鍵,還記得vim里面怎么切換各個面板的嗎?tmux也可以,因為它支持映射。把前綴映射改成Ctrl+x,再加入如下幾條語句,現在切換窗口就和vim一摸一樣了,頓時覺得親切了很多。

#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key h select-pane -L
#right
bind-key l select-pane -R

上面的最后一條語句會更改C-x l的功能,我挺喜歡這個功能的,因為我們很時候都是在兩個窗口或這兩個面板中切換,所以我又加入如下語句

#select last window
bind-key C-l select-window -l

現在我的l鍵可不能隨便按了,Ctrl+x l是切換面板,Ctrl+x Ctrl+l切換窗口,Ctrl+l清屏。

復制模式copy-mode

    前綴 [ 進入復制模式
    按 space 開始復制,移動光標選擇復制區域
    按 Enter 復制並退出copy-mode。
    將光標移動到指定位置,按 PREIFX ] 粘貼

如果把tmux比作vim的話,那么我們大部分時間都是處於編輯模式,我們復制的時候可不可以像vim一樣移動呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。

#copy-mode 將快捷鍵設置為vi 模式
setw -g mode-keys vi

會話

    C-x s 以菜單的方式查看並選擇會話
    C-x :new-session 新建一個會話
    C-x d 退出並保存會話
    終端運行 tmux attach 返回會話

命名會話

tmux new -s session
tmux new -s session -d #在后台建立會話
tmux ls #列出會話
tmux attach -t session #進入某個會話

使當前pane 最大化

從我用vim開始,就相信這世界上有些人比你自己還了解你自己想要什么,所以喬老爺子才能做出讓世人尖叫的產品,所以我經常瀏覽高手的.vimrc文件,我用了tmux不到3天就發現,它怎么不能最大化當前pane?就像vim里的ZommWinPlugin.vim插件一樣,你按下某鍵,當前窗口就最大化了,獲得最大可視界面。當目前為止,就還沒有發現我有需求而別人沒有的,同樣,已有前人找到的解決辦法,方法如下:

# zoom pane <-> window
#http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
bind ^z run "tmux-zoom"
##

滾屏

滾屏要進入copy-mode,即前綴+[,然后就可以用上下鍵來滾動屏幕,配置了vi快捷鍵模式,就可以像操作vi一樣來滾動屏幕,非常的方便。退出直接按‘q’鍵即可。
其他配置

下面是從別人那里摘錄過來的配置,反正我是用不着,留着以后參考吧,或許屏幕前的你有需要呢。

#
# author   : Xu Xiaodong <xxdlhy@gmail.com>
# modified : 2012 Jul 22
#

#-- base settings --#
set -g default-terminal "screen-256color"
set -g display-time 3000
set -g escape-time 0
set -g history-limit 65535
set -g base-index 1
set -g pane-base-index 1

#-- bindkeys --#
# prefix key (Ctrl+a)
set -g prefix ^a
unbind ^b
bind a send-prefix

# split window
unbind '"'
# vertical split (prefix -)
bind - splitw -v
unbind %
bind | splitw -h # horizontal split (prefix |)

# select pane
bind k selectp -U # above (prefix k)
bind j selectp -D # below (prefix j)
bind h selectp -L # left (prefix h)
bind l selectp -R # right (prefix l)

# resize pane
bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
bind -r ^h resizep -L 10 # to the left (prefix Ctrl+h)
bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)

# swap pane
# swap with the previous pane (prefix Ctrl+u)
bind ^u swapp -U
# swap with the next pane (prefix Ctrl+d)
bind ^d swapp -D

# misc
# select the last pane (prefix e)
bind e lastp
# select the last window (prefix Ctrl+e)
bind ^e last
# kill pane (prefix q)
bind q killp
# kill window (prefix Ctrl+q)
bind ^q killw

# copy mode
# enter copy mode (prefix Escape)
bind Escape copy-mode
# paste buffer (prefix Ctrl+p)
bind ^p pasteb
# select (v)
bind -t vi-copy v begin-selection
# copy (y)
bind -t vi-copy y copy-selection

# zoom pane <-> window
#http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh
bind ^z run "tmux-zoom"

# app
# htop (prefix !)
bind ! splitw htop
# man (prefix m)
bind m command-prompt "splitw 'exec man %%'"
# perl func (prefix @)
bind @ command-prompt "splitw 'exec perldoc -t -f %%'"
# perl var (prefix *)
bind * command-prompt "splitw 'exec perldoc -t -v %%'"
# perl doc (prefix %)
bind % command-prompt "splitw 'exec perldoc -t %%'"
# ruby doc (prefix /)
bind / command-prompt "splitw 'exec ri %%'"

# reload config (prefix r)
bind r source ~/.tmux.conf \; display "Configuration reloaded!"

#-- statusbar --#
set -g status-utf8 on
set -g status-interval 1
set -g status-keys vi

setw -g mode-keys vi
setw -g automatic-rename off

#-- colorscheme --#
#https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf

# modes
setw -g clock-mode-colour colour223
setw -g mode-attr bold
setw -g mode-fg colour223
setw -g mode-bg colour235

# panes
set -g pane-border-bg colour234
set -g pane-border-fg colour234
set -g pane-active-border-bg colour232
set -g pane-active-border-fg colour232

# statusbar
set -g status-justify centre
set -g status-bg colour235
set -g status-fg colour248
set -g status-attr dim
#[default]» #[fg=colour187]#S #[default]• #[fg=colour187]w#I.p#P#[default]"
set -g status-left "
set -g status-left-attr bright
set -g status-left-length 20
#[fg=colour174]#(/home/xiaodong/bin/uptime) #[default]• #[fg=colour174]#(cut -d ' ' -f 1-3 /proc/loadavg)"
set -g status-right "
set -g status-right-attr bright
set -g status-right-length 80

setw -g window-status-current-fg colour223
setw -g window-status-current-bg colour237
setw -g window-status-current-attr bold
setw -g window-status-current-format "#I:#W#F"

#setw -g window-status-alert-attr bold
#setw -g window-status-alert-fg colour255
#setw -g window-status-alert-bg colour160

# messages
set -g message-attr bold
set -g message-fg colour223
set -g message-bg colour235

set -g visual-activity on
快速啟動tmux

如果覺得每次都要打開tmux,然后在打開幾個窗口和面板很麻煩,那么下面這個腳本你一定會喜歡。參考這里

#!/bin/sh
#
# name     : tmuxen, tmux environment made easy
# author   : Xu Xiaodong xxdlhy@gmail.com
# license  : GPL
# created  : 2012 Jul 01
# modified : 2012 Jul 02
#

cmd=$(which tmux) # tmux path
session=codefun   # session name

if [ -z $cmd ]; then
  echo "You need to install tmux."
  exit 1
fi

$cmd has -t $session

if [ $? != 0 ]; then
  $cmd new -d -n vim -s $session "vim"
  $cmd splitw -v -p 20 -t $session "pry"
  $cmd neww -n mutt -t $session "mutt"
  $cmd neww -n irssi -t $session "irssi"
  $cmd neww -n cmus -t $session "cmus"
  $cmd neww -n zsh -t $session "zsh"
  $cmd splitw -h -p 50 -t $session "zsh"
  $cmd selectw -t $session:5
fi

$cmd att -t $session

exit 0

如果還有其他需要,可以去這里看看,當然了,最全的參考文檔,就是man tmux。happy tmux!


免責聲明!

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



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