目的の場所に複数のカーソル


13

vim-multiple-cursorsプラグインを使用しています。

カーソルを希望する場所に正確に配置したいと思います。例([x]カーソル位置です):

Lorem ipsum dolor sit amet[1], consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.

崇高なテキスト私は通常、矢印キーで次の位置に移動し、第二1を入れ、その後、最初にカーソルを置きます。

VIMに類似したものはありますか? このプラグインなどを使用します。

編集

コメントに続いて
\section[My first section in this book]{My first section in this book}
.texファイルへの書き込みを試みたときにそうすることに興味がありました。私の最初の反応は\section[]{}[]andの中に同じものを書くために2つのカーソルを書いてから置くこと{}でした。

他の例は_someStuff、いくつかの異なる変数名の後に追加することです。たとえば、これを有効にします。

variable1 = 2
my_variable2 = 12
var3 = 14

これに:

variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14

複数のカーソルを使用して、列カーソルを選択し、単語の最後に移動してから挿入するなどの方法で実行できます。しかし、カーソルを配置する場所を正確に選択するのは簡単だと思います。



1
尋ねるべき重要な質問は、なぜそれをしたいのかということだと思います。あなたは何をしようとしているのですか?複数のカーソルを使用することは、実際には「Vimの方法に従う」のではなく、組み込み機能を使用して、少なくとも同じくらい効率的に、必要なことを行う別の方法がおそらくあります。
statox

@statox。編集を参照してください。思いついた2つの例を挙げました。2つ目はvim-multiple-cursorsプラグインで達成できますが、1つ目は少なくとも簡単な方法ではできません。
-tomasyany

@ Nobe4。おかげで、2番目のスクリプトが成功しました。
-tomasyany

回答:


29

複数のカーソルを使用することは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マクロの記録を開始します qq。これは、「将来のすべてのキーストロークを指定されたレジスタに記録し始める」ことを意味しqます。

  • 編集タイピングを開始します。

    • 0 行頭に行く
    • e 最初の言葉の最後に行く
    • a カーソルの後に追加する
    • .someStuff 必要なテキストを追加するには
    • <Esc> 挿入を停止する
    • j 次の行に行く
    • q マクロの記録を停止するには
  • あなたが得る:

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か?

カーソルをiofに置いて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と略記されるgdeleteとして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省略してvglobalます。このように適用すると

: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に感謝します。


非常に完全な答え。私は実際にそれらのコマンドをすべて知っていましたが、そのように使用することを考えたことはありませんでした...もっと練習が必要だと思います。ただし、「vim-way」は単にプラグインを使用するよりも時間がかかる場合があります(たとえば、CSSの例は、前述のプラグインを使用するとはるかに速く実行できます)。ほとんどの場合、vimはテキストエディタよりも高速です(適切に使用されている場合)。
-tomasyany

ところで、あなたの答えはすでにかなり完成していると思います。私はそれを受け入れますが、あなたがより詳細を追加したいならば、してください、そして、私はそれらを読んでうれしいです。
-tomasyany

1
@tomasyany:実際、「vim way」の使用は長いように見える場合があります(手動で変更を行った場合よりも作業マクロの作成に多くの時間を費やすことはできません)が、練習すると最終的には速くなります。Vimを使用してから1年になりますが、専門家になるには(非常に)遠いですが、練習を重ねるうちに編集が継続的に改善されると感じています。
statox

1
おそらくgnテキストオブジェクトについても言及する必要があります。複数のカーソルのいくつかのユースケースに対処します。またはで検索し/、で繰り返します。dgncgn.
ジャスティンM.キーズ

@Justin私はあまり詳しくないgnので、試してみて後で追加します。頭を上げてくれてありがとう!
statox

5

私に与えられたユースケースは、.キーコマンドを知りたいようです(最後の編集コマンドを繰り返します)

  • 最初の場所に移動し、を押しiてテキストを挿入し、<ESC>
  • 場所2に移動し、.(Dot)を押します==>同一のテキストが挿入されます
  • ここで1行下に移動してもう一度挿入するには(連続する行に挿入する場合)、 <ALT>-j.

あなたのTexの例は私によって解決されます:

I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.


それはとてもいい解決策です。.キーコマンドは完全に知っていましたが、そのように使用することは考えませんでした。いい方法だと思います。しかし、あなたの答えは実際には本当の質問を参照していないので、それを受け入れるのは適切ではないと思います。
tomasyany

1
さて、あなたの質問(目的のユースケースを追加した後)は、「私はハサミが本当に好きで、ハサミでネジを締めたいです。方法を教えてください」と思い出しました。そして、私はドライバーの気の利いた使用法を示します;)(私は答えとして追加しました、私はコメントでフォーマットする方法を知らないので)
アレックスStragies

4

より多くのVimの方法。

最初のタスク:

\section[foobar baz]{foobar baz}

ワークフロー:

\section[]{}
hh
ifoobar baz<Esc>
$.

2番目のタスク:

variable1 = 2
my_variable2 = 12
var3 = 14

コマンド:

3:norm ea_somestuff

結果:

variable1_somestuff = 2
my_variable2_somestuff = 12
var3_somestuff = 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.