首頁 > 軟體

Tmux 速成教學:技巧和調整

2020-06-16 17:58:14

簡介

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

本文將會包含以下內容:

  • Tmux 的基礎
  • Tmux 中最棒的功能
    • 視窗(Window)
    • 窗格(Pane)
    • 對談(Session)
    • 快速在文字間移動游標或複製文字
    • 非常輕巧的結對程式設計功能
  • 調整 Tmux 以增強其同 Vim 的整合度
    • 調整背景的配色方案
    • 調整游標的形狀
    • 調整貼上時的文字縮排
  • 其他能夠提升 Tmux 體驗的工具或技巧
    • 用 Tmuxinator 自動建立對談
    • 改變 Tmux 狀態列的顏色

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

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

讓我們開始吧!

 

基礎知識

 

什麼是Tmux?

Tmux 是一個工具,用於在一個終端視窗中執行多個終端對談。不僅如此,你還可以通過 Tmux 使終端對談執行於後台或是按需接入、斷開對談,這個功能非常實用。稍後,我們將會看到如何充分地利用這個功能。

如圖所示,這就一個是 Tmux 的對談:

從圖中我們可以看出:

  • 左側: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 的詳細的資訊可以參考這裡

安裝 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. unbind C-b
  2. set-g prefix C-a

 

Tmux 的組態檔

每當開啟一個新的對談時,Tmux 都會先讀取 ~/.tmux.conf 這個檔案。該檔案中存放的就是對 Tmux 的設定。

小提示:如果你希望新的設定項能夠立即生效,那麼你可以將下面這一行設定加入到檔案~/.tmux.conf 中。

  1. # bind a reload key
  2. 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. # Use vim keybindings in copy mode
  2. setw -g mode-keys vi

 

將複製下來的文字傳送到系統的剪貼簿中

在預設情況下,當從 Tmux 中複製文字時,複製下來的文字只能貼上到同一個 Tmux 對談中。若要使複製下來的文字可以貼上到任何位置,就需要讓 Tmux 將文字複製到系統的剪貼簿。為此,我們需要這樣做:

安裝 retach-to-user-namespace。用 brew 安裝的話將會非常簡單,只需要執行下面這條命令:

  1. $ brew install reattach-to-user-namespace

在組態檔 ~/.tmux.conf 中加入以下內容:

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

 

選擇並複製文字

既然已經設定成了 vi 模式,也安裝了 rettach-to-user-namespace,下面就讓我們來看看如何從 Tmux 的對談中複製文字吧。假設要複製的是 IP 地址,於是我們先執行了 ifconfig 命令。接下來就請跟隨以下的步驟:

首先按下 Ctrl-b [ 進入複製模式,然後可以看到一小段高亮的文字出現在了螢幕的右上角 (“[0/0]”)(如下圖所示)。

接下來就可以像在 Vim 中一樣用 jkl 和 h 等鍵在文字間移動游標了。

把游標移動到想複製的文字上後再按下空格鍵就可以開始選擇文字了(這和在 Vim 中複製文字的步驟一模一樣)。

選擇完要複製的文字後再按下確認鍵。

這樣 IP 地址就複製下來並可以貼上到任何地方了。

 

讓複製文字的操作更像 Vim

你還可以設定 Tmux 使用 v 鍵選擇文字,用 y 鍵複製文字。為此只需要將下面的設定項加入到組態檔 ~/.tmux.conf 中。

  1. # start selecting text typing 'v' key (once you are in copy mode)
  2. bind-key -t vi-copy v begin-selection
  3. # copy selected text to the system's clipboard
  4. 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. $ brew update             &&
  2. brew tap nviennot/tmate &&
  3. brew install tmate

使用 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. if exists('$TMUX')
  2. set term=screen-256color
  3. endif

在更新了組態檔 ~/.vimrc 以後,顏色應該就可以正確顯示了。

 

調整游標的形狀

在預設情況下,當通過 Tmux 執行 Vim 時,無論當前 Vim 是處於插入模式、可視模式還是其他模式,游標的形狀都是一樣的。這樣就很難判斷當前的 Vim 模式是什麼。若要避免這個問題,就需要讓 Tmux 通知 iTerm 更新游標的形狀。為此,需要將以下設定加入到檔案 ~/.vimrc 中。

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

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

 

調整貼上時的文字縮排

在 Vim 中貼上文字時可能會遇到這樣的問題,有時文字的縮排會發生變化,特別是在貼上大量的文字時,這個問題會更加明顯。雖然可以通過在貼上前執行 :set nopaste 來解決這個問題,但是這裡還有一種更好的解決方法。就是把下面這段設定加入到組態檔 ~/.vimrc 中,這樣 Vim 就會自動地阻止貼上文字時的自動縮排。

  1. " for tmux to automatically set paste and nopaste mode at the time pasting (as
  2. " happens in VIM UI)
  3. function!WrapForTmux(s)
  4. if!exists('$TMUX')
  5. return a:s
  6. endif
  7. let tmux_start ="<Esc>Ptmux;"
  8. let tmux_end ="<Esc>"
  9. return tmux_start . substitute(a:s,"<Esc>","<Esc><Esc>",'g'). tmux_end
  10. endfunction
  11. let&t_SI .=WrapForTmux("<Esc>[?2004h")
  12. let&t_EI .=WrapForTmux("<Esc>[?2004l")
  13. function!XTermPasteBegin()
  14. set pastetoggle=<Esc>[201~
  15. set paste
  16. return""
  17. endfunction
  18. 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. name: project_a
  2. root:<the-folder-of-project-A>
  3. windows:
  4. - server:<command-to-start-application-server>
  5. - editor:
  6. layout: even-horizontal
  7. panes:
  8. - vim
  9. -<command-to-launch-tests-guard>
  10. - shell:''

一旦將上面的設定新增到了專案 A 的 Yaml 檔案中,只需要執行下面這條命令就可以啟動 Tmux 的對談了。

  1. $ tmuxinator start project_a

當然如果願意的話,你也可以使用 Tmuxinator 命令的別名:

  1. $ tmuxinator start project_a

大功告成了。現在,每當想進入專案 A 的編碼工作時,就只需要執行 Tmuxinator 命令。

可以到這裡檢視Tmuxinator的官方文件。

 

美化 Tmux 的狀態列

預設情況下,Tmux的狀態列看起來是下圖這個樣子(圖中綠底部分):

我們可以根據需要改變狀態列的外觀。對我來說,我喜歡下圖這種清爽的外觀。

為了達到上圖的效果,我將如下的設定加入到了組態檔 ~/.tmux.conf 中。

  1. # Status bar
  2. # colors
  3. set-g status-bg black
  4. set-g status-fg white
  5. # alignment
  6. set-option -g status-justify centre
  7. # spot at left
  8. set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
  9. set-option -g status-left-length 20
  10. # window list
  11. setw -g automatic-rename on
  12. set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
  13. set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
  14. # spot at right
  15. set-g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'

 

總結

在這篇文章中我們先介紹了 Tmux 的基本功能,然後介紹了 Tmux 中最棒的幾個功能。這之後介紹了一些設定以及幾個能夠提升 Tmux 體驗的工具。至此,諸位對 Tmux 的印象如何呢?你們是否也發現了什麼其他有用的功能或設定?如果有的話歡迎留言告訴我們。

感謝您閱讀本文!

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-06/119128.htm


IT145.com E-mail:sddin#qq.com