【FreeBSD】仮想コンソールでクリップボードを利用する(tmux)

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p6
tmux tmux 2.8

課題

仮想コンソールでコピペしたい。

対策

こちらの記事で、tmuxという仮想ターミナルをマルチウィンドウ化するソフトを紹介した。

tmuxには、コピーモードという機能が付いている。
これを使えば、キー操作だけで画面上に表示されている文字列をコピペできる。
おまけに、tmuxのコピーした文字列を格納するバッファ(以降、バッファ)は複数個用意されており、ちょっとしたクリップボード履歴管理機能として使えるので、とても便利だ。

ということで、この記事ではtmuxのコピーモードの使い方を紹介する。

もし、tmuxをインストールしていない方は、先程の記事を参考にインストールしておこう。

ここでは、下記について説明する。

  1. tmuxのコピーモード設定例
  2. 設定例のキーバインド一覧
  3. 実際の使い方
  4. コピーモードを開始する
  5. コピーする文字列を選択する
  6. コピーしてコピーモードを終了する
  7. コピーした文字列を貼り付ける
  8. Vimとの連携
  9. 常時クリップボードを使用する
  10. クリップボードを使用するためのキー操作を割り当てる

1. tmuxのコピーモード設定例

コピーモードはデフォルトでも使用できるが、各自使いやすいキーバインドに変えておこう。
ただし、以降では下記設定例を前提として操作の説明を行う。

# copy mode
setw -g mode-keys vi  
bind v  copy-mode  
bind -T copy-mode-vi v send -X begin-selection  
bind -T copy-mode-vi V send -X select-line  
bind -T copy-mode-vi y send -X copy-selection-and-cancel  
bind p paste-buffer  
bind C-p choose-buffer -F "#{buffer_sample}"  

上記例では、コピーモードでvimライクなキーバインドを使用するように設定している。
setw -g mode-keys viがそれにあたる。
emacs派の人は、viの他にemacsとも指定できるようなので、一度試してみると良いと思う。

2. 設定例のキーバインド一覧

上記設定例でのキーバインド一覧。(よく使いそうなもの抜粋)

キーバインドPrefixは、各自設定しているtmuxのPrefixキーに読み替えて欲しい。

モード 操作 キーバインド
Normal コピーモード開始 Prefix v or Prefix [
Copy カーソル移動(左,右,上,下) h, l, k, j
Copy カーソル移動(単語) b, B, e, E
Copy カーソル移動(行頭,行末) 0, $
Copy カーソル移動(行後方検索開始) f, t
Copy カーソル移動(行前方検索開始) F, T
Copy 文字列検索(前方検索,後方検索) ?, /
Copy 文字列検索繰り返し(順方向,逆方向) n, N
Copy 選択開始(通常選択) v or Space
Copy 選択開始(行選択) V
Copy 矩形選択/通常選択切替 Ctrl+v
Copy 選択箇所コピー&コピーモード終了 y or Enter
Copy コピーモード終了 q
Normal 直前にコピーした文字列を貼り付け Prefix p
Normal バッファ選択画面を開く Prefix Ctrl+p
Buffer カーソル移動(上,下) k, j
Buffer カーソル位置のバッファを貼り付け p
Buffer カーソル位置のバッファを削除 d
Buffer 複数のバッファを選択 t
Buffer 選択中のバッファを全て貼り付け P
Buffer 選択中のバッファを削除 D
Buffer バッファ選択画面を閉じる q

上表のモード列の記載の意味は、下記の通り。

記載 意味
Normal 通常のtmux操作が行える状態
Copy コピーモード中
Buffer バッファ選択画面表示中

他にどのような操作があるか気になる人は、キーバインド一覧(Prefix ?)で確認しよう。
キーバインド一覧で、-T copy-modeもしくは-T copy-mode-viのオプションがついているものが、コピーモード中の操作っぽい。

3. 実際の使い方

コピーモードを利用したコピペ操作は、基本的に下記手順になる。

  1. コピーモードを開始する      (Prefix v)
  2. コピーする文字列を選択する    (v + カーソル移動)
  3. コピーしてコピーモードを終了する  (y or Enter)
  4. コピーした文字列を貼り付ける    (Prefix p or Prefix Ctrl+P)

以降では、それぞれの操作について補足する。

1. コピーモードを開始する

コピーモードを開始するには、Prefix vを押す。

Paneの右上に黄色背景(色は設定で変わるかも)で[0/321]など、何か数字が出ていればコピーモードに入っている。

数字の意味を正確には調べてはいないが、どうやらtmuxが保持している画面バッファと、実際に画面に表示している箇所の位置関係を示すものっぽい。

2. コピーする文字列を選択する

コピーモードに入ったら、コピーしたい文字列を選択しよう。

カーソルはVimライクなキー操作(h,j,k,lなど)で移動できる。

カーソル位置をコピーしたい文字列の先頭か末尾に合わせたら、vを押して選択開始。

あとは、カーソルを移動してコピーする範囲を選択しよう。
選択中の範囲は文字色・背景色が反転する。

3. コピーしてコピーモードを終了する

コピーする範囲を選択したら、yまたはEnterを押してコピーしよう。

コピーと同時に、コピーモードも抜けているはずなので、例の右上の黄色背景の数字がなくなっていることを確認しよう。

もし、選択範囲をキャンセルしたい場合は、Escを押せばいい。

もし、何もせずにコピーモードを終了したい場合は、qを押せばいい。

4. コピーした文字列を貼り付ける

文字列をコピーしたら今度は貼り付けよう。

エディタやシェル上で貼り付けたい位置にカーソルを合わせたら、Prefix pを押そう。
これで直前にコピーした文字列が貼り付けられるはずだ。
(Vimの場合は、貼り付ける前に挿入モードにしておくことをお忘れなく)

もし、もっと前にコピーした文字列を貼り付けたい場合は、Prefix Ctrl+pを押そう。
すると、バッファ選択画面が表示される。
いわゆるクリップボード履歴の管理機能で、デフォルトだと50個のバッファが用意されているみたい。

この画面で、j,kで貼り付けたいバッファを選択し、pEnterを押せば選択したバッファを貼り付けられる。

バッファ選択画面でtを押せば、複数のバッファを選択することができる。
選択した全てのバッファを貼り付けるには、Pを押せばいい。

何もせずにバッファ選択画面を抜けるには、qを押せばいい。

4. Vimクリップボードの連携

yyddなどで無名レジスタを使ってヤンク/削除した文字列は、tmuxのバッファへ格納されない。
これでは他のソフトと共有できないため、ちょっと不便だ。

ここでは、Vimがシステムのクリップボード(tmuxのバッファ)を利用するための、2つの方法を紹介する。

1. 常時クリップボードを使用する

yyなどでヤンク操作した文字列を、常にtmuxのバッファへ格納したい場合は、~/.vimrc(Neovimなら~/.config/nvim/init.vim)に下記を追加するといい。

set clipboard=unnamedplus  

ただし上記設定の場合、ddxなどレジスタ指定なしで削除操作した文字列も、tmuxのバッファに格納されるようになる。
その結果、意味のない文字列が、どんどんtmuxのバッファに溜まっていくので注意。

2. クリップボードを使用するためのキー操作を割り当てる

削除した文字列も、tmuxのバッファへ格納される挙動が嫌だという人もいるかと思う。

そんな人は、下記のようにtmuxのバッファへ格納するための操作キーを、別に割り当ててみてはいかがだろうか。
(<Leader>??としている箇所は、各自好きなキーを割り当てて欲しい)

nnoremap <Leader>d  "+diw  
nnoremap <Leader>D  "+d$  
nnoremap <Leader>dd "+dd  
vnoremap <Leader>d  "+d  
nnoremap <Leader>y  "+yiw  
nnoremap <Leader>Y  "+y$  
nnoremap <Leader>yy "+yy  
vnoremap <Leader>y  "+y  
nnoremap <Leader>p  "+p  
nnoremap <Leader>P  "+P  

上記では、ヤンクと削除操作で処理した文字列を、"+レジスタに格納するようにしている。
"+レジスタはシステムのクリップボードを指しており、上記操作でヤンクや削除した文字列は、tmuxのバッファに格納される。

最後に

tmuxのコピーモードを利用すれば、仮想コンソールでの生活もだいぶ快適になると思う。

w3mで見ているサイトに載っているコマンドをコピペして、簡単に試すことができる。
調べたことをメモするのだって楽々だ。

コピペ万歳。

ネットの海に放流されている、ありあまる富を活用していこう。

参考

以上。