48
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vimのドットコマンドが便利っぽい

Posted at

実践Vim 思考のスピードで編集しよう!を買ってみた。
素のVimの機能をとことん掘り下げる本で、Vimmerの間では人気っぽい。
まだ全部読んでないけど、この中で真っ先に紹介されるドットコマンドが便利な気がするのでまとめてみる。

日本語ドキュメント

これには、

最後の変更を繰り返す。

としか書かれていない。

最後の変更ってなんぞや?

最後の変更とは

ノーマルモードの場合

最後の変更 = テキストに変更を及ぼすコマンド1個分

たとえば、

  • x : 1文字削除
  • p : ペースト
  • dd : 1行削除
  • >G : 現在の行からファイルの末尾までインデントを一段深くする
  • ...などなど。

なお、1手戻るコマンドuは含まれない。

たとえば行頭を1文字ずつ削除する場合。

#Line1
^
#Line2
--------------------
Line1             [x]
^
#Line2
--------------------
Line1             [j]
#Line2
^
--------------------
Line1             [.]
Line2
^

jはカーソル移動なので変更にはカウントされない。
なのでこの場合は、最後の変更 = x となる

挿入モードを挟む場合

最後の変更 = 挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作

ただし、挿入モードでカーソルキーを使うと、変更がリセットされる。
なぜなら、これらは一旦ノーマルモードに戻って、h,j,k,lコマンドで移動して、再度挿入モードに入ったことになるから。

ノーマルモードでの「変更」も、一度挿入モードに入ってゴニョゴニョしてノーマルモードに帰って来ていると考えたら、一貫性があるようにに思えるなー。

たとえば行末に;を付け加える操作を繰り返す場合。

var foo = 1
^
var bar = 100
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [A;<ESC>]
           ^
var bar = 'a'
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [j]
var bar = 'a'
           ^
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [.]
var bar = 'a';
             ^
var foobar = foo + bar
--------------------------------------
var foo = 1;                 [j.]
var bar = 'a';
var foobar = foo + bar;
                      ^
--------------------------------------

ドットコマンドの理想的な使い方

理想としては、移動に1ストローク、ドットコマンドで1ストローク。
移動用のキーと.を交互に打つだけで作業が完了すれば最強。

そのために考えなければならないポイントは大きく2つ。

  • 挿入モードへの入り方
  • 移動の方法

挿入モードへの入り方を考える

最後の変更 = 挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作

そしてここでのポイントは、「挿入モードに入った瞬間から」という部分。
Vimには何かしらの操作をしつつ挿入モードに入るコマンドがたくさん用意されている。
これを使って挿入モードに入ると、「何かしらの操作」も一緒に繰り返してくれる。

挿入モードに入るコマンドには、以下のものがある。

  • i : カーソル位置の左から挿入開始
  • I : 行頭から挿入開始 = ^i
  • a : カーソル位置の右から挿入開始
  • A : 行末から挿入開始 = $a
  • o : カーソル位置の下に1行開けて挿入開始 = A<CR>
  • O : カーソル位置の上に1行開けて挿入開始 = ko
  • c : 削除して挿入開始。単体だと機能しないけど、このあとに続く文字で削除するものが決まる。
  • cw : カーソル位置の単語を削除して挿入開始
  • cf{検索文字} : カーソル位置から、{検索文字}の位置までを消して挿入開始
  • ...など
  • C : カーソル一から行末までを削除して挿入開始 = c$
  • s : カーソル位置の文字を削除して挿入開始 = cl
  • S : カーソル位置の行を削除して挿入開始 = ^C,cc

先の例では、Aコマンドを使うことで行末までの移動も繰り返し処理の中に含めていた。

この他にも、例えばcwを使うと、カーソル位置の単語を別の単語に置き換える繰り返し処理を作れたり、いろいろできるはず。

移動の方法を考える

移動の方法はh,j,k,lだけではない。
検索による移動方法を知っておくと便利。

f{検索文字}の後の;/,コマンド

f{検索文字}は、行内で文字を前方検索するコマンド。
一度このコマンドを実行しておくと、;で同じ方向に検索、,で逆方向に検索が繰り返される。

ちなみにF{検索文字}だと後方検索。;/,の検索方向も逆転する。

文字列検索の後のn/Nコマンド

/{検索文字列}や、*コマンド(カーソル位置の単語を検索)でドキュメント内での前方検索を行なった後、
nで同じ方向に検索、Nで逆方向に検索が繰り返される。

ちなみに?{検索文字列}だと後方検索。n/Nの検索方向も逆転する。

まとめ

あとは慣れるだけ!

48
46
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?