現在の内部ブロックの右端まで削除します


21

次のようなコードがあるとしましょう(|カーソル位置を表します):

func1(x|, func2(), y); 

取得したい:

func1(x|);

カーソルの位置から現在の内部ブロックの右端の前の位置までのコード削除する方法はありますか?

私は私が一緒に行くことができることを知っていますdt).が、私はそれを何と混ぜる方法があるのだろうかと思いdi)ます。


1
あなたが尋ねたように、「内側/外側ブロックの左/右半分を削除する」簡単な方法があるかどうかを知りたいです。しかし、補足として、私はおそらくC);この特定のケースで行うでしょう。
シャーバズ

1
時々、%動きはあなたが探していることをすることができます(すなわちd%)。
-alxndr

回答:


29

私は使うだろう

d])

つまりd、次の一致しない「)」まで削除()し])ます()。

をご覧ください:help ])


5

モーションは一方向にのみ移動し、テキストオブジェクトは二方向にのみ移動します。

これは、フードの下でそのテキストオブジェクトを使用するか、その動作を模倣するモーションを保留しているカスタムオペレータを作成しない限り、テキストオブジェクトの半分を保持できないことを意味します。

あなたの例では、で覆われているテキストi)は非常に簡単に視覚化できます:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

しかし、カーソルからそのテキストの最後まで操作するようにVimにどのように指示しますか?obi)andなどのカスタム演算子を作成する必要がありますoei)(半ランダムな例)。

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
すでに定義されているすべてのテキストオブジェクトを現在のカーソル位置と組み合わせて再利用する一般的なモーションを作成すると興味深いでしょう。たとえば、の代わりにibimb右およびiMb左などに(自動的に)。
ヴァンレーザー

3

この特定のケースでは dfy

一般的な場合:

  • dT( カーソルからブロックの先頭までを削除します
  • vib 内側のブロックの残りを選択します
  • p 内側のブロックを先ほど削除したものに置き換えます

マッピングにすることができます。

 :map K dt(vibp

3

他の既存の回答はすべて、vimの定義とブロックの検出に依存しています。この種の削除に対する私の戦略は、停止cするfモーションと実際のキャラクターと組み合わせたコマンドを使用することです。これにより実際にストップキャラクターが削除されますが、これは最後に押したキーでもあるため、2回繰り返すとコストがゼロに近くc、挿入モードに変更されてから再び挿入されます。


例で説明するには、

func1(x|, func2(), y); 

コマンドc2f))は与える

func1(x)|;

最初は他の回答のいくつかよりもエレガントに見えるかもしれませんが、この戦略は普遍的であり、ブロック定義に依存しないことに注意してください。


たとえば

<div| class="some-class">text</div>

コマンドcf>>は与える

<div>|text</div>

または、次のようなcsvファイルを編集するとき

2016-11-29,question,vi|.stackexchange.com,10435

コマンドcf,,は与える

2016-11-29,question,vi,|10435

多くの場合、これを使用して、残りの文字列を削除します

printf("Hello world| - a boring example\n");

printf("Hello world\|n");

cf\\

またはから

print("Hello world| - a boring example");

print("Hello world"|);

cf""


これにより、現在の位置が要求された場所とは少し異なる場所に変更され、挿入モードに変更されます。しかし、残りのすべてを削除するための解決策を共有したかったのです。


1
cfソリューションの問題は、削除を停止する文字を指定する必要があることです。質問は、あなたが実際に到達したい前にcf)別のものがあるために単純にできない場合にどうするかを尋ねます(たとえば、あなたがに変更したいとき)。基本的に、after を押すのを避けることができるかどうかを知りたかった。))func(x|, g(x, x), x, x, g(x, x))func(x).cf)
マテウスピオトロフスキ

(注)も使用できることtはなく、fまでのデータを削除するのではなく、与えられた文字を含まないので、あなたの最初の例(func1(x|, func2(), y);)、あなただけ使用することができますd2t)。@MateuszPiotrowskiが言及しているように、それは一般的な解決策ではなく、どの文字に削除したいかを知る必要があります。ただし、特定の言語でどの文字がブロックを終了するかを一般的に知っているので、それほど悪くはありません。
ヘギン16

3

VIM-忍者フィートのプラグインは、あなたが探しているものかもしれません。私が理解から、それは作るd[d]そう、「テキストオブジェクトのカーソルからの削除を開始する/終了」にd]i)なる「周囲の括弧の終わりまで削除」する必要があります。

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