を交換してください。->特定の場所


7

コードを修正.する->とき、時々私はと取り替える必要があります。

多くの(数百の)ドット(.)があり、変更する必要があるのは少数のドットだけなので、通常、検索と置換は使用できません。

ただし、make changelistを実行しているときに変更が必要なものを見つけました。

繰り返し演算子を使用しても、1つのインスタンスを変更してからドットコマンドで繰り返すと、次のようになるため、まったく機能しません。

structBlah->.memberBlah

次にx、不要なドットを削除するために使用すると、最後の変更が削除されたため、貼り付けとドットが機能しなくなります。

つまり、基本的に問題は繰り返しオペレーターがモーションと編集を繰り返すことですが、ここでは削除と挿入の2つの編集を繰り返す必要があります。

これを行う便利な方法はありますか?私の考えの1つは、次のようなマクロを使用することでした。

xi-><ESC>

最初の変更を行うためにどのコマンドを使用していますか?私の最初の素朴な試みa<BS>-><Esc>(同様にi<Del>-><Esc>)コマンドは、完全に繰り返し可能です。
Random832 16

使用するs代わりのi文字を削除し、挿入モードに行くことに。
Shahbaz

回答:


8

cw(単語の変更)コマンドは問題を解決します。

期間とタイプにカーソルを合わせます cw-><Escape>

some.somethingelse

になる

何か->何か

また、.cwは削除と置換の両方を行う1つの操作であるため、演算子は引き続き機能します。


1
単一の文字に単語の変更を使用することは考えていませんでした。それは完全に理にかなっています。ピリオドが「単語」と見なされることを知りませんでした。「文字の変更」コマンド(文字を削除して入力モードにする)はありますか?
タイラーダーデン2016

1
@Tyler Durden Changeは、実際には、削除コマンド(d)と同様に、任意の動きを続けることができるコマンドです。したがって、clを入力して文字を左に変更し、c2lを入力して2文字を変更し、c $を入力して行の終わりに変更できます。ct; セミコロンなどに変更するには...
DoYouEvenCodeBro

8
単一の文字にcwを使用すると、入力が多すぎます。sを使用するだけです。
ケビン

1
@タイラーダーデンハハ、あなたは私の解決策を試してみましたか?キーストロークが少なくても同じことができます。代用scwてください。
Tumbler41 2016

11

sカーソルの下の文字を削除し、挿入モードにする演算子を使用できます。次に、置換を入力し、後で使用.して置換全体を繰り返すことができます。ワークフローは次のようになります。

  1. /\. すべての期間を強調表示します。
  2. n 最初のドットへ
  3. s->そしてEsc。これにより、ドットが置き換えられ、1回の操作でテキストが挿入されます。
  4. n 次のドットへ
  5. . 必要に応じて変更します。

:h s 詳細については。


私の質問で述べたように、何百ものドットがあり、置き換えを行う必要がある特定の場所が数箇所しかないため、これは実用的ではありません。
タイラーダーデン2016

3
さて、その時点であなたの問題はフィルタリングの問題になりました。これはあなたが尋ねたものではありません。2つの編集についての質問に答えてみました。今ではそれを一つで行うことができます。問題が実際にどのドットを置き換えるかを見つけることである場合は、質問を編集することをお勧めします
Tumbler41

1
私の質問で具体的に「ドット(。)が多数(数百)あり、選択したドットをいくつか変更する必要があるため、検索と置換は使用できません」と具体的に述べました。変更リストは、私の質問で述べているように、変更を行う必要があるインスタンスを見つけるために使用されています。
タイラーダーデン2016

1
次に、s上記で提案されたソリューションを使用して一度変更を行います。変更リストの次のアイテムでそれを使用できます。
nobe4 16

2
@TylerDurdenこれは検索および置換ではありません。@ tumbler41は検索を使用して検索することを提案しましたnが、ここでの主な最適化はs->Esc を使用することです。これらの4つのキーストロークにより、必要なテキストの変更が作成されます。これを使用.して、必要な場所でそのアクションを繰り返すことができます。
Desty 2016

7

私は代替コマンドを使用することをお勧めします:

:%s/\./->/gc

この意志:

:%s     substitute over all lines
/\.     match dot
/->     replace by arrow
/g      replace all on lines
c       ask for confirmation

これにより、すべて.のファイルが処理され、毎回置換したいかどうか尋ねられます。

を押すyn次のドットに移動します。

:h :s_cすべてのオプションについては、を参照してください。


1
先ほど述べたように、何百ものドットがあり、置換を行う必要がある特定の場所が数箇所しかないため、これは実用的ではありません。
タイラーダーデン2016

1
あなたは置き換えることができます:%:g/.../して、一致した行にのみ代替に:'<,'>現在選択されているラインのため、または持つ:.か、:現在の行のため、および使用は@:、あなたが他のいくつかの方法で、に移動していること、特定の行にコマンドを繰り返します。
deltab 2016

7

他の回答で提案されているように置換やドットコマンドを使用したくない場合は、おそらくカーソルがドットの隣にあるときに使用できるマクロを作成することをお勧めします。

マクロを記録できます

qaf.vc->^[q

これは、行の次のドットに移動しf.ます()視覚的に選択(v)して置き換えます(c->)。

コードをナビゲートして、変更すべきドットを見つけたら、でマクロを呼び出すことができます@a

あなたはそれをあなたの中に置いて、あなた.vimrcが異なるコーディングセッションの間でマクロを保つことさえできます:

let @a="f.vc->^["

コメントで提案されている@grochmalを編集して、2番目のレジスターを使用して、かなり便利な後方移動マクロを持つようにします。

let @e="F.vc->^["

これが私がすることです。唯一の違いは、2つのレジスタlet @q="F.vc->^["とを使用しlet @w="f.vc->^[""前のドット次のドットコマンドがあることです。
2016

@grochmal:私はこれについては考えていませんでしたが、これは賢いです:-)
statox

マクロの<ESC>前に必要はありませんqか?(私はコンピューターにアクセスできないため、テストしていません)。
Loovjo 16

@loovjo:そうです、編集します、ありがとう!
スタトックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.