複数のカーソルを使用することはVimmerのことではありません
(プラグインでも)マルチカーソルを使用したコメントで述べたように、実際には「Vimの道をたどる」わけではないので、Sublime-Textから来た人にとって魅力的であることは完全に理解していますが、 Vimのビルトイン機能で効率的。
もちろん、これらの代替ソリューションを見つけるのは必ずしも容易ではなく、時には時間がかかることもありますが、Vimを使用すると簡単になり、時間の経過とともに複数のカーソルがまったく役に立たなくなることがわかります。
それはクールですが、どうすれば別の方法を見つけることができますか?
あなたが何をしようとしているかに大きく依存するため、普遍的な答えはありません。
ドットコマンド .
DotコマンドはおそらくVimで最も強力なツールの1つであり、単に最後の変更を繰り返すことを可能にします。彼のPractical Vimでドリュー・ニールよりもうまく説明できませんでした。すべてのVimmerはこの本を読むことを検討すべきだと思います。
このコマンドの長所は、最後の変更がキャラクター、行、またはファイル全体に作用するアクションになることです。たとえば、変更は、挿入モードに入った瞬間と通常モードに戻った瞬間で区切ることができます。
それを念頭に置いて、マルチカーソルでやりたいことを簡単に行うことができます:
最初に環境を設定しましょう:あなたが提案したように書きましょう
\section[]{}
次に、繰り返し可能な変更を行い
ます。カーソルがオンになり}
、ヒットF[
して[
キャラクターに戻ります。その後でモードのインサート入りi
し、入力My first section in this book
として通常モードに戻りますESC
。
\section[My first section in this book]{}
そしてここに魔法の部分があります:文字にf{
カーソルを置き、{
ヒット.
して最後の変更を繰り返しましょう:
\section[My first section in this book]{My first section in this book}
ドットコマンドのすべての課題は、繰り返し可能な変更を加える方法を学ぶことです。Vimを理解することは付属していますが、基本は繰り返し可能な方法で変更を加える方法を理解することです。
たとえば、行の末尾にセミコロンを挿入するには、のA;
代わりに使用することをお勧めします
$a;
。どうして?
A;
アトミックアクションが作成されるため.
、別の行で使用する場合は、行のどこにいても、セミコロンを最後に挿入します。一方、使用$a;
する場合、変更を2つの部分に分割$a
し、挿入;
する.
と、カーソルの現在の位置にセミコロンが挿入されます。
注 Vimの魔法の式はn.
です。本当にクールなワークフローは次のとおりです。
- 編集する場所を検索します
/pattern
- 繰り返し編集できる
n
編集する次の場所に移動するために使用します
- 使用
.
編集を繰り返します
- 最後の2つのステップを繰り返します。あなたは世界の王様です(少なくとも編集の王様です)
マクロ
マクロは、Vimのもう1つの非常に重要なツールです。マクロを使用すると、一連のキーストロークを記録し、もう一度入力したかのように繰り返すことができます。
例として、2番目のユースケースを使用します。
variable1 = 2
my_variable2 = 12
var3 = 14
繰り返しますが、重要なことは、マクロを効率的にする方法を学ぶことです(すぐに反例があります)。
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- これで、マクロを使用して編集を繰り返すことができます。編集する正しい行にいるので、単にマクロを実行できます
@q
。2回実行したいので、使用でき2@q
ます。次の結果が得られます。
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
注1お気づきかもしれません0ea
が、マクロの先頭で使用することは非常に重要です。実際、マクロを記録して再度実行する前に最初の単語の最後にカーソルを置いていた場合、結果は次のようになります。
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
カーソルとして、テキストは行の変更後のカーソルの位置に挿入されます(つまり、この場合は行の終わり)
注2マクロは非常に強力であり、使い慣れたときに再帰的なマクロを作成することもできます。ここで、マクロは次のようになります。
`0ea.someStuff<Esc>j@q`
最終版で@q
は、マクロを使用する代わりに、それ自体でマクロを呼び出していました2@q
。使用@q
したばかりで、すべての作業が完了していました。
視覚ブロック
ユースケースに直接適用されない別のトリックがありますが、多数の行を同時に編集するのに本当に役立ちます。このCSSコードの抜粋を取得してみましょう。
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
スプライトをからimages
に移動した場合はどうなりますcomponents
か?
カーソルをi
ofに置いてimages
を押すことができます<C-v>
。これにより、ブロックを選択できるビジュアルブロックモードが開始されます。これで、入力t/
して変更する単語を選択し、その単語2j
の出現箇所をすべて選択できます。
その後、単にc
単語を変更するために入力する必要がありcomponents
ます。挿入モードを終了すると、次のように表示されます。
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
グローバルコマンド
グローバルコマンドは、パターンに一致する行にexモードコマンドを適用できるツールです。これは、複数のカーソルを必要とせずに、同じ変更を別の場所に適用するのに適した方法です。
構文は次のとおりです。
:[range] g / pattern / command
[range]
パラメータの詳細については、を参照してください:h :range
。ここでは詳しく説明しませんが%
、ファイル全体を'<,'>
表し、最後の選択を1,5
表し、ファイルの1行目から5行目を表すことを思い出してください。
このパラメーターは、globalコマンドで処理される行を定義します。範囲が指定されていない場合、globalコマンドは%
デフォルトで使用します。
[pattern]引数は、検索エンジンで使用するために使用される検索パターンです。検索履歴を統合するため、このフィールドを空白のままにすると、グローバルコマンドは検索履歴の最後の検索パターンを使用します。
最後に、[command]パラメーターは、おそらく慣れているexコマンドです。
これで、グローバルコマンドの動作は非常に簡単になりました。
- [range]パラメーターで定義されたすべての行を反復処理します
- 現在の行が定義されたパターンと一致する場合、コマンドを適用します
[command]パラメーターはexコマンドであるため、多くのことができます。あまり面白くなく、多くのデバッグメッセージがある次の疑似コードを見てみましょう。
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
ここで、このコードが機能することを確認し、これらの不要なecho
ステートメントを削除するとします。
ファイル全体にグローバルコマンドを適用できるため、コマンドの前に%
(または%
デフォルトの範囲なので何も付けずに)コマンドを追加する必要があります。
削除する行がすべてパターンに一致することを知っている echo
これらの行を削除したいので、コマンド:delete
を使用する必要があります。d
したがって、次の関数を使用するだけです。
:%global/echo/delete
これは次のように短縮することもできます
:g/echo/d
注%
姿を消したが、global
と略記されるg
とdelete
としてd
。ご想像のとおり、結果は次のとおりです。
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
注1理解するまでに時間がかかった重要な点は、
normal
コマンドがexコマンドであるということです。つまり、グローバルコマンドで使用できるということです。これは非常に強力です。たとえば、エコーを含むすべての行を複製したいとしn.
ます。マクロや魔法の式さえ必要ありません。単純に使用できます
:g/echo/normal YP
そして出来上がり:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
注2「特定のパターンに一致しない行でコマンドを使用したい場合はどうすればよいですか?」
global
コマンドは[pattern]パラメーターと一致しない行に適用されることを除いて、まったく同じように機能する逆のコマンドをvglobal
省略してv
いglobal
ます。このように適用すると
:v/echo/d
前の例では次のようになります。
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
delete
コマンドが含まれていなかった行に適用されていますecho
。
ここで、これらのいくつかのヒントが、マルチカーソルプラグインを取り除き、VimをVimのように使用する方法についてのアイデアを提供してくれることを願っています;-)
ご想像のとおり、これらの例は非常に単純であり、Vimの方法を使用する場合、複数のカーソルが必要になることはほとんどないことを示すために作成されています。私のアドバイスは、あなたがそれが有用だと思う状況に遭遇したとき、それを書き留めて、より良い解決策を見つけるのにしばらく時間をかけることです。99%の時間で、最終的にはより高速で効率的な方法を見つけることができます。
また、もう一度繰り返しますが、ドリュー・ニールのPractical Vimを読むことをお勧めします。
この本は「Vimでそれを行う方法」ではなく、「Vimの考え方を学ぶ方法」に関するものではないからです。これにより、将来の問題に対する独自のソリューションを適切に構築できます。
PS特別な編集作業と彼がこの長い投稿に対して行った修正に対して@Alex Stragiesに感謝します。