確認環境
| 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+ カーソル移動) - コピーしてコピーモードを終了する (
yorEnter) - コピーした文字列を貼り付ける (
Prefix porPrefix 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で見ているサイトに載っているコマンドをコピペして、簡単に試すことができる。
調べたことをメモするのだって楽々だ。
コピペ万歳。
ネットの海に放流されている、ありあまる富を活用していこう。
参考
以上。