7/15 - Weekly Vim(移動fとtの違い、無名レジスタ、InsertモードのままPasteする方法)
概要
Vimをちゃんと使い始めて、二ヶ月くらい経ちました。 勉強の仕方としては、
- したい操作があった時に調べる
- 『実践Vim』をパラパラ読んで、便利そうなものを覚えていく
という二つの方法を取っています。 学んだことを忘れないように、定期的にアウトプットしておこうと思います。
現在の位置から、)
の直前まで削除したいケース
以下のコードの引数を減らす時
# before get_hoge(foo, bar) # after get_hoge(foo)
f,
: 今いる行の次の,
の上まで移動dt)
: 今いる行の次の,
の手前まで移動して、delete
とすることで簡単に削除をすることができます。
f
とt
は同じ行のあるcharacterまで移動するという機能自体は似ていますが、その文字の上まで移動するのか(f
)、その文字の手前まで移動するのか(t
)という点に違いがあり、このようなケースで使い分けると便利です。
yank → deleteした後に、yankしたものをput したいケース
様々な方法がありますが、無名レジスタを使う方法がシンプルなケースでは便利そうです。
まず前提として、Vimでは一般的なCut, Copy, PasteはDelete, Yank, Put という名前で存在します。
- Delete = Cut (×Delete)
- Yank = Copy
- Put = Paste
※ CopyのCは、ChangeのCとして使われていたため、Yankが採用されたそうです。
これらは一般的なそれとほとんど同じような挙動をするのですが、特に"Delete"に関しては一般のDeleteとは少し異なる挙動をするので、注意が必要です。
例えば以下のケースで、build_hoge
の第一引数を、hoge
に変えたいというケースです。
# before hoge = get_hoge build_hoge(fuga, user) # after hoge = get_hoge build_hoge(hoge, user)
直感的には、 1. yank hoge(yiw) iをつけることで単語だけをyankする 1. move to fuga(jww) 1. delete fuga(dw) 1. put hoge(Pw) Pは、その場所からPasteを行う
としたくなるところですが、そのようにすると、削除したはずので、fuga
が再びpasteされます。
これは、VimにおけるDelete が、削除してその内容を無名レジスタに記録するために発生する現象です。
これを回避するためには、いくつかの方法があって、
- 名前付きレジスタに保存: yankする先を、名前付きレジスタにする(
"ayw
: aという名前のレジスタにwordをyankする →"ap
: aという名前のレジスタからputする) Yank レジスタを使う: yankされたものは、常に無名レジスタに保存されるのと同時に、
"0
という名前のレジスタに保存されるため("0p
とすることで、yankしたものをputすることができる) また直感的には、putの目的語に"0
を指定したくなりますが、そうすると、putが実行されてしまうので、文頭で行う必要があります。yank hoge(yiw)
- move to fuga(jww)
- delete fuga(dw)
- put hoge("0P)
『Vim実践』p.148より
Insert モードからPasteしたいケース
以下のテキストで二行目の文末に、hoge fuga
という単語を挿入したいケースを考えます。
# before His name is hoge fuga. And this book is written by # after His name is hoge fuga. And this book is written by hoge fuga.
結論から言うと、Ctrl + r 0
で、Insertモードからyankしたものをpasteすることができます。
- Yank words in line 1
- Move to line 2
- Move to end of line and Insert Mode
- Paste from yanked words
という流れで、Insertモードを出ることなく、Pasteを行うことができます。 基本的には、作業をしたら、Normalモードに戻ることが良しとされているVimですが、時には、Insertモードに残ったまま、Pasteなどを行うことで無駄なモードの切り替えを減らすこともできます。
参考
- 実践Vim