次のようなコードがあるとしましょう(|
カーソル位置を表します):
func1(x|, func2(), y);
取得したい:
func1(x|);
カーソルの位置から現在の内部ブロックの右端の前の位置までのコードを削除する方法はありますか?
私は私が一緒に行くことができることを知っていますdt).
が、私はそれを何と混ぜる方法があるのだろうかと思いdi)
ます。
%
動きはあなたが探していることをすることができます(すなわちd%
)。
次のようなコードがあるとしましょう(|
カーソル位置を表します):
func1(x|, func2(), y);
取得したい:
func1(x|);
カーソルの位置から現在の内部ブロックの右端の前の位置までのコードを削除する方法はありますか?
私は私が一緒に行くことができることを知っていますdt).
が、私はそれを何と混ぜる方法があるのだろうかと思いdi)
ます。
%
動きはあなたが探していることをすることができます(すなわちd%
)。
回答:
モーションは一方向にのみ移動し、テキストオブジェクトは二方向にのみ移動します。
これは、フードの下でそのテキストオブジェクトを使用するか、その動作を模倣するモーションを保留しているカスタムオペレータを作成しない限り、テキストオブジェクトの半分を保持できないことを意味します。
あなたの例では、で覆われているテキスト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>
ib
、imb
右およびiMb
左などに(自動的に)。
この特定のケースでは dfy
一般的な場合:
dT(
カーソルからブロックの先頭までを削除しますvib
内側のブロックの残りを選択しますp
内側のブロックを先ほど削除したものに置き換えますマッピングにすることができます。
:map K dt(vibp
他の既存の回答はすべて、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""
。
これにより、現在の位置が要求された場所とは少し異なる場所に変更され、挿入モードに変更されます。しかし、残りのすべてを削除するための解決策を共有したかったのです。
cf
ソリューションの問題は、削除を停止する文字を指定する必要があることです。質問は、あなたが実際に到達したい前にcf)
別のものがあるために単純にできない場合にどうするかを尋ねます(たとえば、あなたがに変更したいとき)。基本的に、after を押すのを避けることができるかどうかを知りたかった。)
)
func(x|, g(x, x), x, x, g(x, x))
func(x)
.
cf)
t
はなく、f
までのデータを削除するのではなく、与えられた文字を含まないので、あなたの最初の例(func1(x|, func2(), y);
)、あなただけ使用することができますd2t)
。@MateuszPiotrowskiが言及しているように、それは一般的な解決策ではなく、どの文字に削除したいかを知る必要があります。ただし、特定の言語でどの文字がブロックを終了するかを一般的に知っているので、それほど悪くはありません。
VIM-忍者フィートのプラグインは、あなたが探しているものかもしれません。私が理解から、それは作るd[
とd]
そう、「テキストオブジェクトのカーソルからの削除を開始する/終了」にd]i)
なる「周囲の括弧の終わりまで削除」する必要があります。
C);
この特定のケースで行うでしょう。