確認環境
PC | Thinkpad X1 Carbon 2nd Gen |
OS | FreeBSD 12.0-RELEASE-p6 |
tmux | tmux 2.8 |
課題
仮想コンソールでコピペしたい。
対策
こちらの記事で、tmux
という仮想ターミナルをマルチウィンドウ化するソフトを紹介した。
tmux
には、コピーモードという機能が付いている。
これを使えば、キー操作だけで画面上に表示されている文字列をコピペできる。
おまけに、tmux
のコピーした文字列を格納するバッファ(以降、バッファ)は複数個用意されており、ちょっとしたクリップボード履歴管理機能として使えるので、とても便利だ。
ということで、この記事ではtmux
のコピーモードの使い方を紹介する。
もし、tmux
をインストールしていない方は、先程の記事を参考にインストールしておこう。
ここでは、下記について説明する。
- tmuxのコピーモード設定例
- 設定例のキーバインド一覧
- 実際の使い方
- コピーモードを開始する
- コピーする文字列を選択する
- コピーしてコピーモードを終了する
- コピーした文字列を貼り付ける
Vim
との連携- 常時クリップボードを使用する
- クリップボードを使用するためのキー操作を割り当てる
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. 実際の使い方
コピーモードを利用したコピペ操作は、基本的に下記手順になる。
- コピーモードを開始する (
Prefix v
) - コピーする文字列を選択する (
v
+ カーソル移動) - コピーしてコピーモードを終了する (
y
orEnter
) - コピーした文字列を貼り付ける (
Prefix p
orPrefix 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
で貼り付けたいバッファを選択し、p
かEnter
を押せば選択したバッファを貼り付けられる。
バッファ選択画面でt
を押せば、複数のバッファを選択することができる。
選択した全てのバッファを貼り付けるには、P
を押せばいい。
何もせずにバッファ選択画面を抜けるには、q
を押せばいい。
4. Vimとクリップボードの連携
yy
やdd
などで無名レジスタを使ってヤンク/削除した文字列は、tmux
のバッファへ格納されない。
これでは他のソフトと共有できないため、ちょっと不便だ。
ここでは、Vim
がシステムのクリップボード(tmux
のバッファ)を利用するための、2つの方法を紹介する。
1. 常時クリップボードを使用する
yy
などでヤンク操作した文字列を、常にtmux
のバッファへ格納したい場合は、~/.vimrc
(Neovim
なら~/.config/nvim/init.vim
)に下記を追加するといい。
set clipboard=unnamedplus
ただし上記設定の場合、dd
やx
などレジスタ指定なしで削除操作した文字列も、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
で見ているサイトに載っているコマンドをコピペして、簡単に試すことができる。
調べたことをメモするのだって楽々だ。
コピペ万歳。
ネットの海に放流されている、ありあまる富を活用していこう。
参考
以上。