kick the base

Houdiniと、CG技術と、日々のこと。

Vim: クリップボードとプットビジュアルモード

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のレジスタの仕組みを理解すると実現できます。

  1. 他のソフトで<C-c>して文字をクリップボードに入れます
  2. Vimで:regコマンドを実行してみましょう
  3. レジスタ一覧が表示されますが、その中に"*があり、そこに先程の他のソフトでコピーした文字列が入っているはずです

この"*レジスタはシステムクリップボードレジスタと呼ばれます。クリップボードにコピーされた文字列はここに入るので、このレジスタを明示的に指定してヤンク・プットすれば、他のソフトとやり取りができます。

他のソフトでコピーして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の環境
  • 表記方法
  • 記事の見解

などはこちらにまとまっていますのでご参照ください。

*1:この設定でうまくいかない場合はVimのclipboardオプションが無効になっている可能性があります。このオプションをオンにする方法は本記事と直接的な関係がないので割愛させていただきます。

*2:詳しく調べたい方は:h put-Visual-modeでヘルプを参照してください