Vimの編集操作まとめ|コピペ・レジスタの落とし穴・連番マクロ
/ 6 min read
Table of Contents
はじめに
Vimの編集操作でよく使うものと、慣れないうちに必ず引っかかるレジスタの挙動についてまとめました。
コピーと削除の基本
yy カーソル行をコピー(ヤンク)dd カーソル行を削除p カーソルの下(後ろ)に貼り付けP カーソルの上(前)に貼り付けy は yank(コピー)、d は delete(削除)、p は put(貼り付け)です。数字を前に付ければ複数行を対象にできます。
3yy 3行コピー5dd 5行削除dコマンドはコピーした内容を上書きする
Vimを使い始めて必ず引っかかるのがこれです。
**d は「削除」ではなく「切り取り」です。**削除した内容が無名レジスタ(コピー用の保管場所)に入るため、それ以前にヤンクした内容が消えます。
1. yy でコピーする2. dd で別の行を削除する3. p で貼り付ける → 1でコピーした内容ではなく、2で削除した行が貼り付けられる「コピーしたはずなのに違うものが貼られる」の原因はこれです。c(変更)や s(置換)も同じ挙動をします。
その場しのぎの対処
ブラックホールレジスタ _ を指定すると、削除した内容がどこにも保存されません。
"_dd レジスタを汚さずに1行削除するただし毎回 "_ を打つのは現実的ではありません。
キーマップで解決する
削除系のキーはレジスタを汚さないようにして、x を切り取り専用にするという割り当てにすると、他のエディタと同じ感覚で使えるようになります。
Neovimでの設定例です。設定ファイルは、Windowsなら C:\Users\ユーザー名\AppData\Local\nvim\lua\config、Linuxなら ~/.config/nvim/lua/config に置きます。
-- keymap.lualocal keymap = vim.keymap
-- 削除系はレジスタに残さないkeymap.set("n", "d", '"_d')keymap.set("n", "D", '"_D')keymap.set("x", "d", '"_d')keymap.set("n", "c", '"_c')keymap.set("n", "C", '"_C')keymap.set("n", "s", '"_s')keymap.set("n", "S", '"_S')keymap.set("x", "c", '"_c')keymap.set("x", "C", '"_C')
-- x を切り取りにするkeymap.set("n", "x", "d")keymap.set("n", "xx", "dd")keymap.set("n", "X", "D")keymap.set("x", "x", "d")"n" はノーマルモード、"x" はビジュアルモードの指定です。
マクロで連番を入力する
同じ編集を繰り返すなら、マクロが使えます。次のような行に、0からの連番を付ける例です。
aaa aaa0bbb → bbb1ccc ccc2ddd ddd3eee eee4操作は次のとおりです。
gg A 0 Esc qa yl j p Ctrl+a q 3@a1文字ずつの意味です。
| キー | 動作 |
|---|---|
gg |
ファイルの先頭へ移動 |
A |
行末へ移動して挿入モードへ |
0 |
0 を入力 |
Esc |
ノーマルモードへ戻る |
qa |
レジスタ a にマクロの記録を開始 |
yl |
カーソル位置の1文字(0)をコピー |
j |
1行下へ移動 |
p |
行末に貼り付け |
Ctrl+a |
カーソル位置の数値をインクリメント |
q |
マクロの記録を終了 |
3@a |
記録したマクロを3回繰り返す |
Ctrl+a が数値をインクリメントするというのがVimらしいところです。Ctrl+x でデクリメントもできます。
おわりに
d がレジスタを上書きする挙動は、知らないと何が起きているか分からず、知ってしまえば設定で回避できます。Vimを常用するなら、最初にキーマップを整えておく価値のある部分です。
