[轉載] Tmux 速成教程:技巧和調整

原文: http://blog.jobbole.com/87584/git

決定從 screen 轉向 tmux 了, 很是喜歡 tmux 的窗格功能.github

 

簡介

有些開發者常常要使用終端控制檯工做,致使最終打開了過多的標籤頁。若是你也是他們當中的一員,或者你正在實踐結對編程,那麼我推薦你讀一讀這篇文章。從上個月開始,我開始大量使用 Tmux 而且發現 Tmux 很是實用,因此我想應該寫一篇文章,與諸位分享一些有關使用 Tmux 的建議和專業方案。本文將先介紹 Tmux 是什麼,而後講解如何使用 Tmux,才能使其同 Vim 結合起來,打造出更高效、更優雅的終端工具。shell

本文將會包含如下內容:編程

  • Tmux 的基礎
  • Tmux 中最棒的功能
    • 窗口(Window)
    • 窗格(Pane)
    • 會話(Session)
    • 快速在文本間移動光標或複製文本
    • 很是輕巧的結對編程功能
  • 調整 Tmux 以加強其同 Vim 的集成度
    • 調整背景的配色方案
    • 調整光標的形狀
    • 調整粘貼時的文本縮進
  • 其餘可以提高 Tmux 體驗的工具或技巧
    • 用 Tmuxinator 自動建立會話
    • 改變 Tmux 狀態欄的顏色

請注意,在撰寫本文的過程當中,我安裝瞭如下這一組軟件,並在測試時使用了這些版本:vim

  • Tmux 1.9a
  • Vim 7.4
  • iTerm 2.1
  • Mac OS (Mavericks and Yosemite)

讓咱們開始吧!windows

基礎知識

什麼是Tmux?

Tmux 是一個工具,用於在一個終端窗口中運行多個終端會話。不只如此,你還能夠經過 Tmux 使終端會話運行於後臺或是按需接入、斷開會話,這個功能很是實用。稍後,咱們將會看到如何充分地利用這個功能。ruby

如圖所示,這就一個是 Tmux 的會話:bash

從圖中咱們能夠看出:服務器

  • 左側:Vim
  • 右側:系統 Shell
  • 左下方:Tmux 會話的名字(「pomodoro-app」)
  • 下方的中部:當前會話中的 Tmux 窗口(「app log」、「editor」和 「shell」)
  • 右下方:當前的日期

如何安裝 Tmux?

在 Mac OS 中安裝:

  • 安裝 Homebrew
    1
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

有關安裝 homebrew 的詳細的信息能夠參考這裏session

  • 安裝 Tmux
    1
    $ brew install tmux

在 Ubuntu 中安裝:

在終端輸入以下命令:

1
sudo apt-get install tmux

Tmux 的快捷鍵前綴(Prefix)

爲了使自身的快捷鍵和其餘軟件的快捷鍵互不干擾,Tmux 提供了一個快捷鍵前綴。當想要使用快捷鍵時,須要先按下快捷鍵前綴,而後再按下快捷鍵。Tmux 所使用的快捷鍵前綴默認是組合鍵 Ctrl-b(同時按下 Ctrl 鍵和 b 鍵)。例如,假如你想經過快捷鍵列出當前 Tmux 中的會話(對應的快捷鍵是 s),那麼你只須要作如下幾步:

  • 按下組合鍵 Ctrl-b (Tmux 快捷鍵前綴)
  • 放開組合鍵 Ctrl-b
  • 按下 s 鍵

這裏有一些小建議:

首先我建議對調 Ctrl 鍵和 Caps-Lock 鍵的功能。

經過按下 Caps-Lock 鍵來代替 Ctrl 鍵將會很是實用。由於在編碼過程當中,你須要頻繁地按下Ctrl 鍵,而因爲 Caps-Lock 與手指在鍵盤的起始位置處於同一直線,因此按下 Caps-Lock 鍵會更加容易、便捷。

其次,我建議將 Tmux 的快捷鍵前綴變爲 Ctrl - a。用 Caps-Lock 鍵替代了 Ctrl 鍵以後,因爲 Caps-Lock 鍵與 a 鍵離得更近,因此按下 Ctrl - a 就將會比按下 Ctrl - b 更容易、更便捷。

若要將快捷鍵前綴變動爲 Ctrl-a ,請將如下配置加入到 Tmux 的配置文件 ~/.tmux.conf 中:

1
2
unbind C-b
set -g prefix C-a

Tmux 的配置文件

每當開啓一個新的會話時,Tmux 都會先讀取 ~/.tmux.conf 這個文件。該文件中存放的就是對 Tmux 的配置。

小提示:若是你但願新的配置項可以當即生效,那麼你能夠將下面這一行配置加入到文件~/.tmux.conf 中。

1
2
# bind a reload key
bind R source - file ~/.tmux.conf ; display-message "Config reloaded.."

這樣配置了以後,每當向 ~/.tmux.conf 文件中添加了新的配置,只須要按下 Ctrl-b r 就能夠從新加載配置並使新的配置生效,從而免去了開啓一個新的會話。

Tmux 中最棒的功能

提示:下面這截圖也許與你使用 Tmux 時看到的界面略有不一樣。這是由於我修改了 Tmux 的狀態欄配置,若是你也想修改爲和截圖中同樣的效果,那麼能夠參照「美化 Tmux 的狀態欄」這一節中的步驟。

窗格

我認爲沿豎直方向分割屏幕是個不錯的主意,這樣我就能夠在一邊使用 Vim,而在另外一邊查看代碼運行結果,若是須要的話,有時我還會再打開一個控制檯。下面我就要講解如何利用 Tmux 實現這一切。

從圖中能夠看出:

  • 左側:Vim(左上方是一個 Ruby 的類文件,左下方是針對這類編寫的測試文件)
  • 右側:一個 Bash 的會話

要建立一個豎直放置的窗格很容易,待開啓了一個 Tmux 會話以後,只需再按下 Ctrl-b % ,一個豎直窗格就出現了。另外,若要把屏幕沿水平方向分割,則只須要按下 Ctrl-b "。在 Tmux 的窗格間移動光標也很簡單,只須要先按下 Tmux 的快捷鍵前綴,而後再按下對應的方向鍵就可讓光標進入到目標窗格了。

窗口

在Tmux中,窗口是個窗格容器,你能夠將多個窗格放置在窗口中,並根據你的實際須要在窗口中排列多個窗格,也是徹底取決於你的須要。例如,我常常是這樣作,先開啓一個叫做「server」的窗口用於運行應用程序的服務器(在這個窗口中能夠看到服務器的日誌),而後開啓另外一個叫做「editor」的窗口用於編寫代碼。在這個窗口中有兩個窗格,一個用於 Vim,一個用於運行測試代碼。最後再開啓一個叫做「shell」的窗口用於經過 Bash shell 運行命令。Tmux 的窗口功能很是實用,由於在一個窗口中能夠建立出多個窗格,這樣在一個窗口中就能同時查看全部窗格內容,經過這種方法能夠高效地利用有限的屏幕空間。

在 Tmux 的會話中,現有的窗口將會列在屏幕下方。下圖所示的就是在默認狀況下 Tmux 列出現有窗口的方式。這裏一共有三個窗口,分別是「server」、「editor」和「shell」。

若要建立一個窗口,只須要按下Ctrl-b c;若要切換窗口,只須要先按下Ctrl-b,而後再按下想切換的窗口所對應的數字,該數字會緊挨着窗口的名字顯示。

會話

一個 Tmux 會話中能夠包含多個窗口。會話功能很是簡單易用,例如能夠爲一個特定的項目建立一個專用的 Tmux 會話。若要建立一個新的會話,只須要在終端運行以下的命令:

1
tmux new -s <name-of-my-session>

假設我還須要開發另外一個項目,因而我就會爲此再新建一個會話。雖然進入了新的會話,可是原來的會話並無消失。因此我能夠在稍後回到以前的會話繼續工做。若要建立一個新的會話,只須要按下Ctrl-b : ,而後輸入以下的命令:

1
new -s <name-of-my-new-session>

除非顯式地關閉會話,不然 Tmux 的會話在重啓計算機以前都不會消失。只要尚未重啓計算機,你均可以自由地從一個項目的會話跳轉到另外一個。

在 Tmux 的會話間切換

若要獲取現有會話的列表,能夠按下Ctrl-b s。下圖所示的就是會話的列表:

列表中的每一個會話都有一個 ID,該 ID 是從 0 開始的。按下對應的 ID 就能夠進入會話。若是你已經建立了一個或多個會話,可是尚未運行 Tmux,那麼能夠輸入以下命令以接入已開啓的會話。

1
tmux attach

在文本間快速移動光標,複製文本

在 iTerm2 中,要想快速地複製內容就不得不鍵盤和鼠標一塊兒用,這一點我一直很不喜歡。我想必定會有不須要使用鼠標且更快捷的複製方法。幸運的是,Tmux就提供了只用鍵盤就能夠完成複製的功能,這源於 Tmux 是從命令行啓動的,而在命令行界面是沒法使用鼠標的。

在文本間移動光標

在 Tmux 中可使用與 Vim 極爲類似的方式在文本間移動光標。正如你熟知的那樣,用 k 鍵能夠將光標移動到上一行,用 w 鍵能夠向後移動一個單詞等等。並且還能夠經過把 Tmux 設爲 vi 模式,使其與 Vim 的操做更加接近。爲此,須要將如下配置加入到文件 ~/.tmux.conf 中。

1
2
# Use vim keybindings in copy mode
setw -g mode-keys vi

將複製下來的文本發送到系統的剪貼板中

在默認狀況下,當從 Tmux 中複製文本時,複製下來的文本只能粘貼到同一個 Tmux 會話中。若要使複製下來的文本能夠粘貼到任何位置,就須要讓 Tmux 將文本複製到系統的剪貼板。爲此,咱們須要這樣作:

安裝 retach-to-user-namespace。用 brew 安裝的話將會很是簡單,只須要運行下面這條命令:

1
$ brew install reattach-to-user-namespace

在配置文件 ~/.tmux.conf 中加入如下內容:

1
2
# invoke reattach-to-user-namespace every time a new window/pane opens
set -option -g default- command "reattach-to-user-namespace -l bash"

Select and copy text

既然已經設置成了 vi 模式,也安裝了 rettach-to-user-namespace,下面就讓咱們來看看如何從 Tmux 的會話中複製文本吧。假設要複製的是 IP 地址,因而咱們先運行了 ifconfig 命令。接下來就請跟隨如下的步驟:

首先按下 Ctrl-b [ 進入複製模式,而後能夠看到一小段高亮的文本出如今了屏幕的右上角 (「[0/0]」)(以下圖所示)。

接下來就能夠像在 Vim 中同樣用 jkl 和 h 等鍵在文本間移動光標了。

把光標移動到想複製的文本上後再按下空格鍵就能夠開始選擇文本了(這和在 Vim 中複製文本的步驟如出一轍)。

選擇完要複製的文本後再按下回車鍵。

這樣 IP 地址就複製下來並能夠粘貼到任何地方了。

讓複製文本的操做更像 Vim

你還能夠設置 Tmux 使用 v 鍵選擇文本,用 y 鍵複製文本。爲此只須要將下面的配置項加入到配置文件 ~/.tmux.conf 中。

1
2
3
4
# start selecting text typing 'v' key (once you are in copy mode)
bind-key -t vi -copy v begin-selection
# copy selected text to the system's clipboard
bind-key -t vi -copy y copy-pipe "reattach-to-user-namespace pbcopy"

高效的結對編程

你能夠將 Tmux 會話的地址分享給他人,這樣他們就能夠經過 SSH 接入這個會話了。因爲會話是創建在 SSH 之上的,因此不會產生額外的開銷。經過使用高速的互聯網,對於那些鏈接到遠程會話上的用戶而言,他們會以爲這個會話就是運行在本地的。

在Tmux 中使用 Tmate

Tmate 是一個 Tmux 的管理工具,使用它不但可以輕鬆地建立 Tmux 會話並且還可以經過互聯網把該會話共享給其餘人。若要使用 Tmate 共享 Tmux 會話,請按照如下步驟操做:

  • 安裝 Homebrew
    1
    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安裝 Tmate
    1
    2
    $ brew update             &&brew tap nviennot /tmate &&
    brew install mate
  • 使用 Tmate 開啓一個新的會話
    1
    $ tmate
  • 從 Tmux 的會話中複製由 Tmate 產生的 SSH URL。以下圖所示,請注意屏幕下方的信息「[tmate] Remote session: ssh …」:

  • 利用剛剛複製下來的 URL 就能夠邀請其餘人經過 SSH 訪問你的會話了。

瞭解瞭如何利用 Tmux 的結對編程功能以後,還能夠再利用您所喜好的運營商提供的語音服務進一步增強會話交互性。

調整 Tmux 以加強其同 Vim 的集成度

調整背景的配色方案

當我第一次經過 Tmux 打開 Vim 時,我發現 Vim 的顏色沒有正確顯示。正以下圖所示,只有有字符的地方纔有背景色。

這個問題是由於經過 Tmux 運行 Vim 須要配置一個特殊的終端參數(term parameter)。請將下面這行配置添加以你的 ~/.vim 文件中。

1
2
3
if exists( '$TMUX' )
   set term= screen -256color
endif

在更新了配置文件 ~/.vimrc 之後,顏色應該就能夠正確顯示了。

調整光標的形狀

在默認狀況下,當經過 Tmux 運行 Vim 時,不管當前 Vim 是處於插入模式、可視模式仍是其餘模式,光標的形狀都是同樣的。這樣就很難判斷當前的 Vim 模式是什麼。若要避免這個問題,就須要讓 Tmux 通知 iTerm 更新光標的形狀。爲此,須要將如下配置加入到文件 ~/.vimrc 中。

1
2
3
4
5
6
7
8
9
if exists( '$ITERM_PROFILE' )
   if exists( '$TMUX' )
     let &amp;t_SI = "<Esc>[3 q"
     let &amp;t_EI = "<Esc>[0 q"
   else
     let &amp;t_SI = "<Esc>]50;CursorShape=1x7"
     let &amp;t_EI = "<Esc>]50;CursorShape=0x7"
   endif
end

在這裏我要感謝 Andy Fowler,是他最早分享了調整光標的形狀這個技巧

調整粘貼時的文本縮進

在 Vim 中粘貼文本時可能會遇到這樣的問題,有時文本的縮進會發生變化,特別是在粘貼大量的文本時,這個問題會更加明顯。雖然能夠經過在粘貼前執行 :set nopaste 來解決這個問題,可是這裏還有一種更好的解決方法。就是把下面這段配置加入到配置文件 ~/.vimrc 中,這樣 Vim 就會自動地阻止粘貼文本時的自動縮進。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
" for tmux to automatically set paste and nopaste mode at the time pasting (as
" happens in VIM UI)
 
function ! WrapForTmux(s)
   if !exists( '$TMUX' )
     return a:s
   endif
 
   let tmux_start = "<Esc>Ptmux;"
   let tmux_end = "<Esc>"
 
   return tmux_start . substitute(a:s, "<Esc>" , "<Esc><Esc>" , 'g' ) . tmux_end
endfunction
 
let &amp;t_SI .= WrapForTmux( "<Esc>[?2004h" )
let &amp;t_EI .= WrapForTmux( "<Esc>[?2004l" )
 
function ! XTermPasteBegin()
   set pastetoggle=<Esc>[201~
   set paste
   return ""
endfunction
 
inoremap <special> < expr > <Esc>[200~ XTermPasteBegin()

在這裏我要感謝 Marcin Kulik,是他最早分享了這個技巧

其餘可以提高 Tmux 體驗的工具或技巧

Tmuxinator (爲項目自動建立會話)

假設你正在開發應用程序 A。在開發過程當中,常常要建立 Tmux 會話,會話中包含「server」、「editor」(用於編寫代碼)和「shell」(用於運行系統命令)這 3 個窗口。不只如此,在一天之中的某個特定的時間你還須要臨時進入到應用程序 B 的開發工做中。因而你又不得不建立另外一個會話,雖然有略微的不一樣(好比目錄和某些命令),可是會話中仍是要包含應用程序 A 中的那 3 個窗口。可是有了 Tmuxinator,你就能夠爲每一個Tmux 會話聲明一個配置,而後用 1 條命令就能建立出這個會話了。這功能太棒了,不是嗎。

Tmuxinator 是一個 Ruby 的 gem 包,可用於建立 Tmux 的會話。它的工做方式是先在配置文件中定義會話中的細節,而後用 1 條命令建立出這些會話。下面就讓咱們看看如何安裝 Tmuxinator 以及如何添加配置來爲指定項目開啓一個會話。能夠經過運行以下命令安裝 Tmuxinator 的 gem 包。

1
$ gem install tmuxinator

安裝好了 Tmuxinator 之後,就能夠在系統 Shell 中運行 tmuxinator 或 mux 命令了。下面就讓咱們爲上述的應用程序(有 3 個窗口,分別是「servers」, 「editor」 和 「shell」)來建立一個配置文件吧。下面這條命令的做用是爲這個項目建立並打開一個配置文件。

1
$ tmuxinator new project_a

按下回車鍵後,就會自動打開文件 ~/.tmuxinator/project_a.yml。爲了實現項目 A 所需的配置,你須要把 project_a.yml 的內容更新爲:

1
2
3
4
5
6
7
8
9
10
11
12
13
name: project_a
root: <the-folder-of-project-A>
 
windows:
   - server: < command -to-start-application-server>
 
   - editor:
     layout: even-horizontal
     panes:
       - vim
       - < command -to-launch-tests-guard>
 
   - shell: ''

一旦將上面的配置添加到了項目 A 的 Yaml 文件中,只須要運行下面這條命令就能夠啓動 Tmux 的會話了。

1
$ tmuxinator start project_a

固然若是願意的話,你也可使用 Tmuxinator 命令的別名:

1
$ mux start project_a

大功告成了。如今,每當想進入項目 A 的編碼工做時,就只須要運行 Tmuxinator 命令。

能夠到這裏查看Tmuxinator的官方文檔。

美化 Tmux 的狀態欄

默認狀況下,Tmux的狀態欄看起來是下圖這個樣子(圖中綠底部分):

咱們能夠根據須要改變狀態欄的外觀。對我來講,我喜歡下圖這種清爽的外觀。

爲了達到上圖的效果,我將以下的配置加入到了配置文件 ~/.tmux.conf 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 狀態欄
   # 顏色
   set -g status- bg black
   set -g status- fg white
 
   # 對齊方式
   set -option -g status-justify centre
 
   # 左下角
   set -option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
   set -option -g status-left-length 20
 
   # 窗口列表
   setw -g automatic-rename on
   set -window-option -g window-status- format '#[dim]#I:#[default]#W#[fg=grey,dim]'
   set -window-option -g window-status-current- format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
 
   # 右下角
   set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'
```

總結

在這篇文章中咱們先介紹了 Tmux 的基本功能,而後介紹了 Tmux 中最棒的幾個功能。這以後介紹了一些配置以及幾個可以提高 Tmux 體驗的工具。至此,諸位對 Tmux 的印象如何呢?大家是否也發現了什麼其餘有用的功能或配置?若是有的話歡迎留言告訴咱們。

感謝您閱讀本文!

相關文章
相關標籤/搜索