在日常工作過程中,你使用復制和粘貼的次數遠超你的想象。使用 tmux,可以直達你需要終端輸出緩沖區(qū)屏幕回滾的地方來查看緩沖區(qū)里那些已經不在屏幕范圍的內容。你還可能需要復制一段文字然后把它復制到一個文件或另一個程序里。本章將會介紹如何管理 tmux 會話里的文本。你會學習到如何使用鍵盤操作 tmux 的輸出緩沖區(qū),如何使用多重粘貼緩沖區(qū),以及如何使用系統剪貼板。
在終端里使用程序時,程序的輸出常由于內容過多而不停滾動以致超出了屏幕范圍。使用 tmux,可以通過鍵盤來向前翻動輸出緩沖區(qū),這樣就可以看到錯過的內容。這個功能在運行測試或是審閱日志文件時尤其有用。
按下 PREFIX [
鍵會進入復制模式,然后就可以使用光標移動鍵在屏幕里移動光標。默認地,光標移動鍵是箭頭鍵。在第 2 章,我們在配置文件里使用了 Vim 模式的移動鍵,這樣就可以在窗口之間移動以及重繪面板大小時不用把手移出鍵盤的主操作區(qū)。tmux 里有一個使用 vi 模式操作緩沖區(qū)的功能。要開啟這個功能,請把下面這行代碼添加到你的 .tmux.conf
文件里:
setw -g mode-keys vi
這個配置可以使用 h
,j
,k
和 l
鍵在緩沖區(qū)里移動。要離開復制模式,只需按下 ENTER
鍵(回車鍵,譯者注)。但是一次移動一個字符顯然是不怎么高效的。那么既然我們開啟了 vi 模式,我們也可以使用其它 vi 的快捷鍵在緩沖區(qū)里移動。
例如,可以使用 w
鍵跳到下一個單詞,使用 b
鍵回跳一個單詞。也可以使用 f
鍵,后面跟隨任意字符來跳到當前行的指定字符,使用 F
鍵回跳。
當緩沖區(qū)里輸出了多個頁面時,在滾屏之間使用光標移動并不是很高效。取代單詞之間移動或是字符之間移動的一種方式,就是在緩沖區(qū)里一頁一頁的滾動,或者是跳轉到緩沖區(qū)的頂部或底部。
可以使用 Ctrl b
向上翻滾一屏或是使用 Ctrl f
向下翻滾一屏,使用 g
鍵跳轉到緩沖區(qū)歷史的最頂部,也可以使用 G
鍵跳轉到緩沖區(qū)歷史的最底部。
如果知道要查找什么內容的話我們就不必一頁頁的在數百行內容之間瀏覽。在復制模式里按下 ?
鍵,可以向上查找短語或關鍵詞。只需按下 ?
鍵,輸入要查詢的短句,然后按下 ENTER
鍵就會跳轉到第一個匹配的短句。然后按下 n
鍵跳轉到下一個匹配,或者按 N
移動到上一個匹配。
要向下查找,你需要按下 /
鍵而不是 ?
鍵。按下 n
鍵會跳轉到下一個匹配而按下 N
鍵會跳轉到上一個匹配。
學習以這種方式在緩沖區(qū)之間移動會極大地加快你的速度。輸入想要移動到的單詞而不是使用箭頭來移動會更快,尤其是在查找日志文件的輸出時會更明顯。
這只是一些使用緩沖區(qū)的基本知識。下面我們來學習如何復制一個面板的文本然后把它粘貼到另一個面板中。畢竟,這是 tmux 的復制模式。
在輸出緩存區(qū)里移動和查找內容只是程序的一半(意為部分功能,譯者注)。我們還會經常需要復制一些文本。tmux 的復制模式提供了這個機會,它能讓我們選擇并復制文本到一個粘貼緩存區(qū),這樣就可以把它復制到任何地方。
要復制文本,需要先進入復制模式然后把光標移動到要選擇的文本的開始處。然后按下 SPACE
鍵(空格鍵,譯者注)然后移動光標到文本的尾部。當我們按下 ENTER
鍵后,這段被選擇的文本就會被復制到一個粘貼緩存區(qū)中。
要粘貼剛才捕捉的內容,則切換到粘貼模式然后按下 PREFIX ]
鍵。
下面我們來學習一些特定的方式來從主輸出緩沖區(qū)里復制和粘貼文本。
tmux 有一個非常方便的快捷鍵可以把整個面板的可視內容全部復制到一個粘貼緩存區(qū)里。只需要按下 PREFIX :
鍵進入命令模式然后輸入
capture-pane
接下來就可以使用 PREFIX ]
鍵把內容復制到當前焦點會話里。
顯示粘貼緩存區(qū)的內容,只需要在命令模式里使用 show-buffer
命令,或者是在終端會話里使用如下命令:
$ tmux show-buffer
使用 save-buffer
命令可以把緩存區(qū)保存到一個文件里,而且這是實時的保存。事實上,可以捕捉當前緩存區(qū)并保存到一個文本文件,就像這樣:
$ tmux capture-pane && tmux save-buffer buffer.txt
或者在命令模式里使用 capture-pane; save-buffer buffer.txt
命令。當然,如果你想的話,可以把這個操作定義為一個快捷鍵。
tmux 保留了一個粘貼緩存區(qū)的??臻g,也就是說可以多次復制文本而無需替換緩沖區(qū)里已有的內容。這比操作系統提供的傳統剪貼板要便捷得多。
每次我們復制一些新的文本時, tmux 就會創(chuàng)建一個新的粘貼緩存區(qū),把新的緩存放在棧的最頂端。
為了更清楚的描述,下面我們來創(chuàng)建一個新的 tmux 會話然后打開一個文本編輯器例如 Vim 或 Nano。在編輯器里,輸入以下句子,每句話占用一行空間:
First sentence is first.
Next sentence is next.
Last sentence is last.
現在復制一些文本到粘貼緩存區(qū)里。按下 PREFIX [
鍵進入復制模式。移動到第一個句子的開始處,按下 SPACE
鍵開始選擇文本,移動到第一句話的末端,然后按下 ENTER
鍵選擇整句話。然后對第 2 句話和第 3 句話重復剛才的操作。
每次我們復制文本時,tmux 都創(chuàng)建一個新的緩存區(qū)??梢酝ㄟ^ list-buffers
命令查看這些緩存區(qū)。如下:
0: 22 bytes: "Last sentence is last."
1: 22 bytes: "Next sentence is next."
2: 24 bytes: "First sentence is first."
按下 PREFIX ]
鍵會總是粘貼第 0 個緩存內容,輸入 choose-buffer
命令來選擇一個特定的緩存區(qū)然后把它的內容粘貼到焦點面板中。
把當前窗口分為兩半,然后在第 2 個面板中打開 Nano 程序,然后進入命令模式輸入以下命令:
choose-buffer
你會看到一個列表顯示如圖12(選擇一個文本緩存并插入)所示。你可以選擇列表中的任意一個,按下 ENTER
,文本就會被插入到指定的面板。
圖12 - 選擇一個文本緩存并插入
這種方式來管理多重文本非常棒,當你在使用一個字符界面的環(huán)境卻無法進入剪貼板時尤其有用。
這些緩存會在 tmux 會話的運行過程中被共享,因此我們可以把粘貼緩存中的內容從一個會話復制到另外一個里。
如果你習慣使用 Vim 而且用復制和粘貼命令比較頻繁,你可以在你的配置文件里重新定義這兩個命令的快捷鍵。例如,可以把 ESCAPE
鍵(ESC 鍵,譯者注)定義為進入復制模式,使用 y
鍵(yank,復制,譯者注)把文本復制到緩存區(qū),使用 v
鍵進入視圖模式(Visual mode,譯者注)選擇文本,然后使用 p
鍵(paste,譯者注)粘貼文本,配置如下:
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
如果你經常在窗口和面板之間大量使用復制和粘貼操作的話,這樣的配置會極大程度地提高你的工作效率,而且這些快捷鍵都是你非常熟悉的 Vim 快捷鍵。
使用 xclip
實用工具可以集成 Linux 系統上的剪貼板,這樣你就可以在不同程序之間更加便捷地進行復制和粘貼操作。
首先你需要安裝 xclip
工具。在 Ubuntu 系統上,使用如下命令:
$ sudo apt-get install xclip
然后通過 xclip
來使用 tmux 的 save-buffer
和 set-buffer
命令。
要把當前緩存區(qū)的內容復制到系統剪貼板,我們在 .tmux.conf
文件里添加如下命令:
bind C-c run " tmux save-buffer - | xclip -i -sel clipboard"
這個配置定義了 PREFIX CTRL-c
快捷鍵來捕獲當前緩存區(qū)的內容然后通過管道輸出到 xclip
程序里??梢园严旅孢@個命令也添加到配置文件里,這樣就可以使用 PREFIX CTRL-v
快捷鍵把系統剪貼板的內容復制到 tmux 會話中來:
bind C-v run " tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"
這個命令會把 xclip
的內容輸出到一個新的 tmux 緩存區(qū)里然后把它粘貼到當前的 tmux 窗口或面板。
如果你是一個 Mac 用戶,你會比較熟悉 OS X 的命令行剪貼板工具 pbcopy
和 pbpaste
。這些簡單的工具使得你在使用剪貼板時更加方便。pbcopy
命令把文本復制到系統剪貼板,pbpaste
命令把內容粘貼出來。例如,你可以一起使用 pbcopy
和 cat
命令,這樣就可以很方便地把 .tmux.conf
文件的配置復制到剪貼板,然后可以把它粘貼到電子郵件或是 Web 上,就像這樣:
$ cat ~/.tmux.conf | pbcopy
這樣操作文本確實很方便,但是 tmux 并沒有權限訪問這些工具,在 tmux 會話里并不能直接使用它們。可以使用一個由 Chris Johnsen 編寫的包裝程序(wrapper program)來突破這個限制。Github 鏈接
要使用這個包裝腳本,首先克隆這個項目到本地然后編譯它。代碼如下:
$ git clone https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard.git
$ cd tmux-MacOSX-pasteboard/
$ make reattach-to-user-namespace
然后,把文件移動到 PATH
路徑下的某個位置,例如 /usr/local/bin
,代碼如下:
$ sudo mv reattach-to-user-namespace /usr/local/bin
最后,配置 tmux 來使用這個包裝程序,把下面這行命令添加到 .tmux.conf
文件中:
set -g default-command "reattach-to-user-namespace -l /bin/bash"
這個配置會讓 tmux 的新窗口能夠通過包裝腳本加載 Bash shell。如果你使用的是其它 shell,你需要在配置里修改它的指定路徑或命令。
重新加載配置文件之后,就可以使用 pbcopy
命令了。這樣還會有個額外的好處,就是可以把當前 tmux 緩存區(qū)的內容添加到系統剪貼板里了,命令如下:
$ tmux show-buffer | pbcopy
或者可以粘貼剪貼板里的內容,像這樣:
$ tmux set-buffer pbpaste; tmux paste-buffer
這就意味著我們可以創(chuàng)建鍵盤快捷鍵來做這個操作,就像我們在 4.3 章節(jié)里所做的那樣。但是很不幸,我們使用的包裝程序無法和 tmux 的 run
命令一起使用。好在有解決方案,可以在 pbpaste
和 pbcopy
命令前添加包裝程序的前綴。所以,為了支持復制功能,我們在配置文件里要這樣定義一個快捷鍵:
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
同樣,要支持從系統剪貼板粘貼內容,需要把下面這個超級長的命令添加到配置文件里,要注意,這個命令必須都在同一行里:
bind C-v run "tmux set-buffer $(reattach-to-user-namespace pbpaste); tmux paste-buffer"
這樣就用一個簡單的辦法解決了一個比較復雜的技術問題。
要想在緩存區(qū)和剪貼板之間來移動文本,你可以在一個沒有剪貼板的環(huán)境中創(chuàng)建一個,比如當你登錄了服務器的控制臺或是一個沒有圖形界面的終端。能夠在一個很長的控制臺的輸出歷史之間來回滾動會幫我們做很多事情。僅僅這個功能,就值得你在服務器上安裝 tmux。
現在我們對 tmux 里如何移動,切換窗口或面板有了比較詳細的了解,可以在日常中使用 tmux 工作了。對很多開發(fā)人員來說,結對編程也是日常工作的一部分。接下來我們會學習如何使用 tmux 和其他開發(fā)人員合作。
快捷鍵 | 描述 |
---|---|
PREFIX [ |
進入復制模式 |
PREFIX ] |
粘貼當前緩存區(qū)的內容 |
PREFIX = |
列出所有粘貼緩存區(qū)并粘貼選中的緩存內容 |
命令 | 描述 |
---|---|
h, j, k, 和 l |
移動光標,分別表示向左,向下,向上和向右 |
w |
以一個單詞為單位向前移動光標 |
b |
以一個單詞為單位向后移動光標 |
f 后跟隨任意字符 |
移動光標到指定字符的下一個匹配位置 |
F 后跟隨任意字符 |
移動光標到指定字符的前一個匹配位置 |
CTRL -b |
向上翻滾一個屏幕的位置 |
CTRL - f |
向下翻滾一個屏幕的位置 |
g |
跳轉到緩存區(qū)的頂部 |
G |
跳轉到緩存區(qū)的底部 |
? |
在緩存區(qū)內向后查找 |
/ |
在緩存區(qū)內向前查找 |
命令 | 描述 |
---|---|
show-buffer |
顯示當前緩存區(qū)內容 |
capture-pane |
捕捉指定面板的可視內容并復制到一個新的緩存區(qū) |
list-buffers |
列出所有的粘貼緩存區(qū) |
choose-buffer |
顯示粘貼緩存區(qū)并粘貼選擇的緩存區(qū)內的內容 |
save-buffer [filename] |
保存緩存區(qū)的內容到指定文件里 |
更多建議: