レジスタの変更タイミングまとめ

あまりにも複雑怪奇すぎて混乱したのでまとめ。
わかりにくかった部分だけまとめた。全レジスタを網羅しているわけではないので注意。

前置き

レジスタの指定

以下で出てくるレジスタを指定するとは、

  • ノーマルモードで "x (xはレジスタ名)を前置する。
  • :delete :yank コマンドの引数に指定する。

ことを指す。

操作の種類
削除系
d x :delete
変更系
c cc C s S
コピー系
y Y :yank

置換系(r R gR)や:changeではレジスタは変更されない模様。

レジスタリスト

:helpの内容をまとめたもの。全リストではない。

"_ (削除専用レジスタ)
"" (無名レジスタ)
  • 削除、変更、コピー系コマンドが使用された際に変更される。
  • レジスタを指定していても変更される。
"0 (番号つきレジスタ)
  • コピー系コマンドが使用された際に変更される。
  • ただし、レジスタを指定していた場合は変更されない。
"1 (番号つきレジスタ)
  • 削除、変更系コマンドが使用された際に変更される。ただし、
    • レジスタを指定していた場合は変更されない。
    • 対象テキストが1行以下(改行を含まない)場合は変更されない。ただし、
      • % ( ) ` / ? n N { } これらの移動コマンドを使った場合は例外。
"2-9 (番号つきレジスタ)
  • "1 が変更された際、 "2 以降のレジスタは "9 に向かってシフトし、 "9 は消える。
  • 番号つきレジスタにコピーした場合、普通にコピーされた後、 "1 が変更されているようならばシフトされる。
"- (小削除用レジスタ)
  • 削除、変更系のコマンドが使用された際に変更される。
  • ただし、レジスタを指定していた場合は変更されない。
  • 場合によっては "1-9 と同時に変更される可能性もある。

まとめ

○の付いている箇所が、レジスタが変更される。それぞれの表は実際に試しながら埋めた。条件等に抜けがある可能性がある。

削除、変更系 (""以外のレジスタを指定)
レジスタ "" "0 "1 "- 指定したレジスタ
レジスタ無指定 × 対象か2行以上か、特定の移動コマンドを使った場合○ 対象が1行以下の場合○ -
""レジスタ指定 :delete の場合は×、それ以外は○ × -
""以外のレジスタを指定 × ×
コピー系 (レジスタ無指定)
レジスタ "" "0 "1 "- 指定したレジスタ
レジスタ無指定 × × -
""レジスタ指定 × × -
""以外のレジスタを指定 × × ×
:let @" = × × -
:let @a-z = × × × ×

なぜか

一部予想とそぐわない結果になった。バグだろうか。余計混乱する羽目になった。ちなみに試したのは Vim 7.2.132 KaoriYa ver.

Tips

""と"@は同じ意味らしい。 :help に見当たらないけど多分そう。