web-dev-qa-db-ja.com

VIMでドット(。)コマンドが非常に便利なのはなぜですか?

私はVIMを今はかなり定期的に使用していますが、ドット(。)コマンドを使用して前のアクションを繰り返すことはありません。その素晴らしさについて読み続けていますが、意味のある実世界の例を見たことはありません。私とVIMでコーディングする方法についてドット(。)コマンドがいかにすばらしいかを示す実際の例は何ですか?

49
rhinoinrepose

次に、dotコマンドで実行するいくつかのアクションを示します。

  • :%s/\<Word\>/replacement/gcよりも単純なのは、Wordで*、次にcereplacement<esc>、次にn.を繰り返します。 Wordが2回または3回出現する場合、これは適切です。置き換える単語が複数ある場合は、次の単語に移動し、*を押し、もう一度n.を押します。
  • 一部のブロックを左揃えにする場合:<Ctrl-V>jjj<.....または前にスペースを挿入:<ctrl-v>jjjI<space><esc>....
  • ddまたはdwの後、ドットコマンドは別の行/ Wordを削除します

Dotコマンドで発生する不思議なことは、番号付きレジスタを使用したコマンドを繰り返すと、次の番号付きレジスタを使用することです(:help redo-registerを参照)。

説明:9行でddを実行し、それらを削除した順序で復元したい場合は、"1P........を実行してください。レジスタ1〜9はVimの削除リングであることに注意してください。 "1Pは最後に削除されたテキストをカーソルの前に挿入し、"2Pは最後に削除された前のテキストを挿入します。

35
Benoit

私が使う dw....多くの場合、一連の単語を最初にメンタルカウントする必要なく削除します。その例では、5dwの方が文字数は少ないですが、ドットコマンドを使用するとdelete Wordそれらをカウントしすぎます。

編集ちょうど今少し編集していて、ドットコマンドをかなり使用する別の状況があることに気づきました。 Vimでこの種のことを処理する方法はもっと簡単だと思いますが、dotコマンドは次のような状況で役立ちます。以下は、基本的には「私は一度何かをしたので、もう数回繰り返したいです。」の例です。私は新しいテストを書いていました( C)で、別の場所からコピーしたSQLスクリプトを表す文字列定数を埋め込む必要がありました。元の複数行(7行)スクリプトは二重引用符で囲まれていなかったため、次のようにしました。

  • スクリプトをコードに直接貼り付けます(ファイルの新しい7行)。
  • カーソルを最初の新しい行に置きます。
  • Ispacespacespacespace"esc 現在の行にスペースと開始引用符を挿入します。
  • j. 追加の各行の開始引用符を追加するために6回。
  • 貼り付けたテキストの最初の行に再配置します。
  • A\n"esc 現在の行に改行文字と閉じ引用符を配置します。
  • j. 残りの行に最後の引用を置くために、もう一度6回。
13
Mark Wilkins
do_something();
do_another();
third_option();

ここで、カーソルを最初の行に置きます:A<bs><cr>{<cr><cr>}<cr><esc>j.j.および

do_something()
{ 

}

do_another()
{ 

}

third_option()
{ 

}
7
sidyll

他のすべての答えは良い例を提供します。dotは素晴らしいということを付け加えたいだけです。ある意味、これは、キーが1つだけ離れた最後のキーの組み合わせに対する自動マクロです。

マクロは素晴らしいですが、使用するのが少し面倒ですが、dotは、たとえ強力でなくても常に使用できます。

3
Xavier T.

私にとって、ドットコマンドは、あらゆる頻度でマクロの記録を開始するまで、最初はヒットまたはミスでした。有用なマクロを記録する秘訣は、問題を繰り返し可能なステップとして表すことです。場合によっては、ドットが唯一のこと、または問題をはるかに簡単にすることもあります。

また、dotコマンドを使用すると、次のような以前はそれほど必要でなかった特定のコマンドを使用するように強制されます。 ci "ca)テキストの削除/変更をドットで繰り返すことができる1つの"アクション "に折りたたむため。

また、ドットに加えてあります。使用頻度ははるかに少ないですが、最後のテキストモーションを繰り返す非常に便利です。 wやbなどの場合にはそれほど役に立ちませんが、fなどの場合には役立ちます。それは素敵な小さなトリックです。

3
Neg_EV

私の最も一般的な例は、テキストのインデントレベルを変更することです

>%...

または、いくつかの変数の前に(char *)を挿入するなど、特定のテキスト変更を再実行するだけです。

i(char *)<Esc>jjjwwww.jjjbb.

(または何でも)

3
evil otto

これを変換する必要がある場合:

instance Movable Position where
    (x,y) --> Left  = (x-1,y)
    (x,y) --> Right = (x+1,y)
    (x,y) --> Up    = (x,y-1)
    (x,y) --> Down  = (x,y+1)

これに:

instance Movable Position where
    Position(x,y) --> Left  = Position(x-1,y)
    Position(x,y) --> Right = Position(x+1,y)
    Position(x,y) --> Up    = Position(x,y-1)
    Position(x,y) --> Down  = Position(x,y+1)

左側の「位置」には視覚的なブロック選択を使用し、右側にはドットを使用します。

2
Al.G.

前のポスターと同様に、削除するときによく使用します。

  • dw...
  • dd...

複数の行でアクションを繰り返す場合:

  • iSomeText:[Esc]j.j.j.
2
paulmelnikow