Vimでコピーする(yy / yw / 矩形選択)
コピーのたびにビジュアルモードで範囲を選択していましたが、単純な「N文字」や「N行」のコピーなら、選択操作を挟まずに一発で済ませられることに気づいていませんでした。
目次(11項目)
| キー | これだけ覚える |
|---|---|
| yl / {数字}yl | カーソル位置から数文字だけコピー |
| yy / Y | カーソル行をコピー |
| {数字}yy | カーソル行から数行分をコピー |
| Ctrl-v | 矩形(列単位)で範囲選択してコピー |
文字単位のコピー
yl " カーソル位置の1文字をコピー
5yl " カーソル位置から5文字をコピー
ylは「ヤンク」+「右へ1文字移動」のオペレータ+モーションなので、数字を前置きすれば範囲を広げられます。1〜数文字だけをサッとコピーしたいときに、ビジュアルモードより速いです。
行単位のコピー(1行コピー・複数行コピー)
yy " カーソル行をコピー
Y " yyと同じ
3yy " カーソル行から3行分をコピー
Yはyyの別名で、どちらを使っても同じ結果になります。複数行コピーしたいときは、行数を数えて{数字}yyとするか、範囲を目で見ながら選びたいならビジュアルモードのほうが安心感があります。数字前置きはコピーしてすぐ同じ内容を複製したいときにも便利です。
a
b
c
a a b c b c
3行をコピーしてカーソル行の直後に貼り付けると、同じ3行がその場で複製されます。y系のコマンドはカーソルを動かさないので、コピー直後にそのままpを続けられるのがポイントです。
ビジュアルモードでの選択コピー
v{範囲選択}y " 文字単位で選択してコピー
V{範囲選択}y " 行単位で選択してコピー
Ctrl-v{範囲選択}y " 矩形(ブロック)選択してコピー
矩形選択は、複数行の同じ列位置だけをまとめてコピーしたいときに使います。整形されたテーブルの1列だけを抜き出したい、といった場面で特に威力を発揮します。
6x3 が選択の大きさコピーとカーソル位置の関係
y系のコマンドを実行しても、基本的にカーソルは移動しません(yyやylではコピー範囲の開始位置にとどまります)。これは削除のdと違い、コピーはテキストを変更しない操作だからです。範囲の終点にカーソルを残したい特殊なケースを除けば、この「その場にとどまる」性質のおかげでコピー後すぐに貼り付け先へ移動する、という流れがスムーズに組み立てられます。
使い分けの目安
| 状況 | おすすめ |
|---|---|
| 数文字だけサッとコピー | yl・数字前置き |
| 行数が分かっている複数行 | {数字}yy |
| 範囲を目で確認したい | ビジュアルモード |
| 列単位でコピーしたい | 矩形選択(Ctrl-v) |
整形されたログファイルから特定の列だけを抜き出したいとき、矩形選択(Ctrl-v)を知らずに1行ずつ手作業で切り出していた時期がありました。矩形選択を覚えてからは、その作業が一瞬で終わるようになり、なぜもっと早く知らなかったのかと思いました。表形式のテキストを扱う機会が多い人ほど、この操作を知っているかどうかで作業時間に差がつくと、身をもって実感した出来事でしたので、今は新しい操作を覚えるたびに、実際の作業の中で意識的に試すようにしています。
貼り付け先とセットで考える
コピーの方法を選ぶときは、貼り付け先での扱われ方もあわせて考えると安心です。行単位でコピーした内容は貼り付けると独立した行になり、文字単位でコピーした内容はカーソル位置にそのまま挿入されます。どちらが欲しい結果かを先にイメージしておくと、コピーの単位選びで迷わなくなります。貼り付け側の指定方法はレジスタを貼り付ける全パターンにまとめてあります。
なお、ここで説明しているコピーはすべてVimの中のレジスタを相手にしたもので、ブラウザなど別のアプリへ持ち出すには別の仕組みが必要です。OSのクリップボードとやりとりする方法はVimでOSのクリップボードにコピペするで扱っています。
コピーした内容が消える条件
コピーしたあとに何かを削除すると、貼り付けようとしていた内容が消えます。削除も同じ無名レジスタを使うためで、Vimを使い始めた人がいちばん引っかかるところです。
ヤンクした内容だけは "0 にも残っているので、上書きされたと気づいたら "0p で貼れます。先回りするなら、消すときに "_dd と書けば無名レジスタが汚れません。
"0p " 最後にヤンクした内容を貼る
"_dd " レジスタを汚さずに消す
"_d " 同上(オペレータとして)
ビジュアルモードで貼り付けると入れ替わる
選択範囲の上で p を押すと、選んだ範囲がレジスタの内容と入れ替わります。このとき、消えた範囲のほうが無名レジスタに入ります。
そのため、同じ内容を何か所かに貼りたいのにビジュアルモードで貼り付けると、2回目から中身が変わってしまいます。避けるには "0p のようにヤンク専用のレジスタを指定するか、名前付きレジスタに入れておきます。
v で選ぶ → "0p " 何度貼っても同じ内容が入る
OSのクリップボードとやり取りする
Vimのレジスタは、そのままではOSのクリップボードと別物です。ブラウザからコピーしたテキストを貼りたいときや、Vimでコピーしたものを他のアプリで使いたいときは "+ を指定します。
"+y " クリップボードへコピー
"+p " クリップボードから貼り付け
:set clipboard=unnamedplus " y と p を直接つなぐ
unnamedplus を設定すると打つ量は減りますが、Vim側の削除でもクリップボードが上書きされます。ブラウザでコピーした内容がVimで x を押した瞬間に消えるので、好みが分かれる設定です。レジスタの使い分けは名前付きレジスタの記事にまとめています。
まとめ
コピー操作は数字前置きの一発コマンドとビジュアルモードを使い分けると効率が上がります。特に矩形選択は知らないと発想すら出てこない操作なので、覚えておく価値が高いです。
ここで扱ったキーは、ブラウザ上で動くVim道場のコピーして貼り付けるでそのまま試せます。インストールもログインも要りません。