skip to content
barorin&

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.lua
local 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 aaa0
bbb → bbb1
ccc ccc2
ddd ddd3
eee eee4

操作は次のとおりです。

gg A 0 Esc qa yl j p Ctrl+a q 3@a

1文字ずつの意味です。

キー 動作
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を常用するなら、最初にキーマップを整えておく価値のある部分です。

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で実際に使っているコードや、Ubuntu・Raspberry Piの設定メモを書いています。