ノベルワークスのとっしー(@tossy)です.
前回, Vimの簡単な操作とモードについて, そして, 少しの小技を紹介しました. 小技の方は単語間のジャンプと削除だけだったので少し物足りなかったかのではと思います. そこで, 今回もう少し小技を補足したいと思います. また, 前回ノーマルモードと挿入モードがあることをご紹介しましたが, 今回はノーマルモードでの小技をご紹介します.
< 前回記事 >
小技 <其の一> ドットコマンドでラクをする
前回 daw
というVimのコマンド(※1)を紹介しました.
これは単語を削除するコマンドで, 現在のカーソルが当たっている単語全体を削除するものです.
それでは, 次のような文を考えます.
Edit and delete words.
この文を, delete words.
にするためにはどうしたらいいでしょうか?Vimを知っている皆さんにとっては簡単ですね. daw
を2回適応するだけです.
しかし, 実はもっと簡単な方法があるのです. その鍵となるのが, 今回ご紹介するドットコマンドです.
(※1) 正確にいうと, daw
は単なるコマンドでなく, "コマンド" と "モーション" の組み合わせで構成されています. 具体的には, d
(削除コマンド)とaw
(a word=単語全体を対象とするモーション)です.
このように「操作コマンド + モーション」の組み合わせによって, どの範囲にどの操作を行うかを指定します.
ドットコマンド
ドットコマンドはドットキー("."キー)押すと実行されます. ドットコマンドは前に行った操作(アクション)を繰り返します. daw
などもその対象であり, 一度daw
と打つとその操作がドットコマンドに記憶され, あとは対象にカーソルを合わせて"."キーを押すだけで単語削除出来ます.
先程の文を再掲します. Edit and
を削除したいとします.
Edit and delete words.
ドットコマンドを習得した今では, daw .
と打つだけですね.
(2単語消すだけでは少し物足りないですか?続きはぜひ, 皆さんの実践で試してみてください!)
小技 <其の二> 行と仲良くなる
この小技は, かゆいところに手が届くといった感じです.
まずは, 行頭・行末にジャンプする方法についてです. 行頭に"1."などの項目入れたり, プログラマであれば行末に";"を入れたりする機会がよくあるのではないでしょうか.
行頭・行末ジャンプ
^
: 行頭に飛ぶ
$
: 行末に飛ぶ
(小ネタ)
これは正規表現の行頭・行末に対応しています.
正規表現でパターンを書く際に, 以下のように^
や$
を指定します.
行頭のパターン: ^abc(行の先頭でabcにマッチ)
行末のパターン: abc$(行の末尾でabcにマッチ)
^
や$
でも十分に便利なのですが, さらに便利なコマンドがあります.
それはA
とI
コマンドです. 大文字なことに注意してください.
このコマンドはそれぞれ^
と$
に加えて, 「挿入モードに入る」というところまでやってくれます.
行頭・行末ジャンプから挿入モード
I
: 行頭に飛んで挿入モードに入る
A
: 行末に飛んで挿入モードに入る
勘がいい方は気がついているかもしれませんが, これは前回説明した, ブロックカーソルから挿入モードに入る時のi
, a
コマンドに対応しています. iを押せばブロックカーソルの手前に入って挿入モード, aを押せばブロックカーソルの後に入って挿入モードになりました. これが大文字になると, 行単位で手前と後に入って挿入モードに入ってくれる訳です.
もう少し「操作 + 挿入モードに入る」という枠組みで, o
(小文字)とO
(大文字)コマンドを紹介します.
このコマンドは行の前後に文を追加する時に重宝します.
行追加
o
(小文字) : 現在のカーソルの行の下に, 新たに行追加し挿入モードに入る
O
(大文字) : 現在のカーソルの行の上に, 新たに行追加し挿入モードに入る
この章で, いくつか行に関するコマンドを紹介しました.これらのコマンドを駆使することで, 行単位での編集がとてもラクになります.
とくにプログラマの方は, A
やo
コマンドが重宝するのではないでしょうか. もちろんこれらのコマンドにおいても色々な発展があるので, 是非Vimを勉強してこれらの操作に磨きをかけてみてください.
小技の合わせ技
最後に, さっきの小技の合わせ技を披露したいと思います. 次のような文(コード)を考えます.
function greet() {
console.log("Hello")
console.log("world")
console.log("!")
}
console.logの末尾に";"を付け加えたいとします. これを, さっきの小技を使って鮮やかに編集してみましょう.
A
コマンドを用いて行末で挿入モードに入り, ";"をタイプしてesc
で抜ける. あとはドットコマンドで繰り返すことで実現できます.
合わせ技をやってみる
まずドットコマンドに正しくアクションを記憶させる準備として, ノーマルモードに入り, 1行目のconsole.log("Hello")
にカーソルを合わせます.(カーソル位置はどこでも大丈夫ですが, 試しに行頭にセットしておきます)
次にドットコマンドの記憶を初期化するためにesc
を押します. これでドットコマンドに操作w記憶させるための準備は完了です.
では, ドットコマンドに一連の操作(アクション)を記憶させます.
A
で行末に飛んで挿入モードに入り, ";"をタイプします. そして, esc
で挿入モードを抜けます. esc
を押した時点で, この一連の操作がドットコマンドに記憶されます.
後は, 各行に対して同じ操作をドットコマンドを用いて各行に適応するだけです. j.j.
と繰り返すことで, 全てのconsole.log()
の末尾に";"が追加されたはずです. もしやりすぎてしまった時はu
(undo)コマンドで元に戻せます.
どうでしょうか, あまりの簡単さに少し驚いた方もいるのではないでしょうか. このようにドットコマンドと操作を組み合わせることで, 面倒な編集が, とても簡単になることがあるんです.
今回ご紹介した小技だけでもかなり編集がラクになると思いますが, 他にも もっとたくさんの便利な技があります. 宜しければ皆さんもまた, 一緒にVimを学んでいきましょう.