Vimとシステムクリップボードとのやり取りについて
ネット上の記事を見ていると、.vimrcに下記設定を加えることで実現している記事を多く見かけます。
set clipboard=unnamed,autoselect
便利な設定ですが、気をつけなければならないポイントがあるので、デフォルトのVimとどちらを使うかよく理解した上で設定すると良いでしょう。
まずはプレーンなVimの挙動を確認しよう
なにはともあれ初期状態のVimがどのようにシステムクリップボードとやり取りするか確認する必要があるでしょう。すでに.vimrcに手を入れている方は、下記コマンドで.vimrcを読み込まない状態のVimを起動しましょう。
$ vim -u NONE -N
デフォルトのVimではクリップボードとのやり取りできないの?
まずはこの状態で下記作業を行ってみましょう。うまく行きませんね。
他のソフトでコピーしてVimでプット(失敗)
キーストローク | 状態 |
---|---|
<C-c> | 他のソフトで選択した文字列をクリップボードにコピー |
p | Vimでプットしても先程クリップボードにコピーされた文字列は挿入されない |
Vimでヤンクして他のソフトでペースト(失敗)
キーストローク | 状態 |
---|---|
y | Vimで選択した文字列をヤンク |
<C-v> | 他のソフトでペーストしても先程ヤンクした文字列は挿入されない |
デフォルトのVimでもできるよ!
手数が多くなってしまいますが、Vimのレジスタの仕組みを理解すると実現できます。
- 他のソフトで
<C-c>
して文字をクリップボードに入れます - Vimで
:reg
コマンドを実行してみましょう - レジスタ一覧が表示されますが、その中に
"*
があり、そこに先程の他のソフトでコピーした文字列が入っているはずです
この"*
レジスタはシステムクリップボードレジスタと呼ばれます。クリップボードにコピーされた文字列はここに入るので、このレジスタを明示的に指定してヤンク・プットすれば、他のソフトとやり取りができます。
他のソフトでコピーしてVimでプット(成功)
キーストローク | 状態 |
---|---|
<C-c> | 他のソフトで選択した文字列をクリップボードにコピー |
"*p | Vimで"* を明示的にプットすることでプットできる |
Vimでヤンクして他のソフトでペースト(成功)
キーストローク | 状態 |
---|---|
"*y | Vimで選択した文字列を"* レジスタに明示的にヤンク |
<C-v> | 他のソフトでペーストすることでプットできる |
クリップボードと簡単にやり取りできるようにする
上述のように、プレーンなVimでシステムクリップボードを扱う場合少し手数がかかります。これを簡単に行えるように設定しましょう。
引き続きプレーンなVimで下記コマンドを入力してください。
:set clipboard=unnamed,autoselect
この設定をすることでクリップボードとのやり取りが素直に出来るようになるはずです!*1
他ソフトとのコピペが簡単!
本設定によりシステムクリップボードレジスタを意識せずヤンク・プットができるようになります。
他のソフトでコピーしてVimでプット(成功)
キーストローク | 状態 |
---|---|
<C-c> | 他のソフトで選択した文字列をクリップボードにコピー |
p | Vimでプットすると先程クリップボードにコピーされた文字列が挿入される |
Vimでヤンクして他のソフトでペースト(成功)
キーストローク | 状態 |
---|---|
y | Vimで選択した文字列をヤンク |
<C-v> | 他のソフトでペーストすると先程ヤンクした文字列が挿入される |
プットビジュアルモードにおける挙動
先程の:set clipboard=unnamed,autoselect
はシステムクリップボードとのやり取りを簡単に行えるようにしてくれますが、逆にプットビジュアルモード(ヤンクした文字列で選択した文字列を上書きするモード)での操作が複雑になってしまいます。*2
ノーマル、カスタマイズ両方とも操作方法と結果を見てみましょう。
ノーマルのVim
キーストローク | バッファの内容 |
---|---|
yiw | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
3j | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
ve | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
p | Tomato I love potato. Tomato is red. Potato chips is made from dried potatoes. |
直前にヤンクした文字列で選択した文字列を上書きすることができていますね。
カスタマイズしたVim
ノーマルVimと同じキー操作を行った場合うまくいかないので、その結果を先に示し、その後うまくいく方法を示します。
ノーマルのVimと同じキー操作を行った場合(失敗)
キーストローク | バッファの内容 |
---|---|
yiw | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
3j | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
ve | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
p | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
最後のプット時に上書きが失敗しています。これは困りました。
うまくいく方法
キーストローク | バッファの内容 |
---|---|
yiw | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
3j | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
ve | Tomato I love potato. Potato is red. Potato chips is made from dried potatoes. |
"0p | Tomato I love potato. Tomato is red. Potato chips is made from dried potatoes. |
今度はうまくいきました。"0
と呼ばれるヤンクレジスタを利用することでイメージ通りに選択範囲の上書きができました。
ヤンクレジスタはその名の通りヤンク専用のレジスタで、ヤンク以外のレジスタ操作(削除コマンドなど)には反応しないので、コントロールしやすいレジスタのうちのひとつです。
まとめ
まとめると下記のようになるかと思います。他のソフトとの連携をあまりせず、Vim内でワークフローが完結する方はデフォルトを、他のソフトとクリップボードを介してテキストをやり取りすることが多い方はカスタマイズしたVimを使うと良いかもしれません。
Vimの状態 | システムクリップボード連携 | プットビジュアルモード |
---|---|---|
デフォルト | 複雑 | 簡単 |
カスタム | 簡単 | 複雑 |
カスタマイズを永続化させるには、.vimrcに
set clipboard=unnamed,autoselect
と記載してあげれば良いでしょう。
本ブログでのVimに関する記事について
- Vimの環境
- 表記方法
- 記事の見解
などはこちらにまとまっていますのでご参照ください。