5

Vimでは、残りのパラメータリストを書き直すためにキーストロークを望んでいることに気づき続けています。たとえば、次のPython関数では次のようになります。

def myfun(a, b=12, c=(1,2,3), d=15):
    pass

c=(1,2,3), d=15をに置き換えたいe=12。キーストロークci(を使用すると、パラメータリスト全体のすべてを置き換えることができますが、Vimテキストオブジェクトのプレフィックスを保持したい場合がよくあります。一般に、私が探しているこのキーストロークは、関数呼び出しの最終パラメーターと定義を置き換えるコンテキストで役立つと思います。

この質問に対する望ましい答えは、引用符で囲まれた文字列、[]ブロック、その他のテキストオブジェクトにも当てはまります。「 Vimで角かっこ(または引用符または...)を選択する方法」で回答されているように、テキストオブジェクトについてすべて理解していることに注意してください。

@ pb2qと@romainlはどちらも優れた検索ショートカットを提供しますが、ブロック内にある他のガベージに関して明確な検索を考案するために、囲んでいるブロックの終わりを視覚的に見つける必要があります(たとえば、ネストされた関数呼び出しを考えてください)。特に、操作したい括弧セット内に括弧を入れ子にした場合、これが必要になることがよくあります。私が本当に望んでいる答えは、最も近い囲み括弧に完全に類似しているci)ca)、完全に概念的に基づいており、)他のネストされた)ブロックを完全に優雅に処理します。

4

5 に答える 5

10

]それから始まり、ある種の構造の終わりに行き、ネストを尊重するコマンドがたくさんあります。])括弧で囲まれたブロック]}の最後に移動する、ブレースされたブロック]/の最後に移動する、Cコメント(/*...*/スタイル)の最後に移動する。の代わりに使用[]て、最後ではなく最初に移動します。

だからあなたのc=(1,2,3), d=15タイプの交換をするためにc])

これらのコマンドの完全なリストは、の下にリストされてい:help various-motionsます。残念ながら、角かっこで区切られたブロック用のものはありません。これは、古典的なviではすでに異なる意味を持っていたためです。vimはそれらを定義[[し、それらにうまく適合します。]]][[]

于 2012-07-26T17:34:21.103 に答える
5

これで地図を作成する

mavi)o`a
  • 現在の位置をマークします
  • ()内を視覚的に選択して、現在の()内の文字の完全なセットを選択します
  • 詳細については、強調表示されたテキストのもう一方の端に移動して:h v_oください
  • 以前にマークされた位置に移動します

これで、cやdなどの操作を実行できます。

編集:キーシーケンスが短いので、私はまだ@Alan-Curryのソリューションが一番好きです。ただし、この手法には、]でも機能するという利点があります。

また、ソリューションの簡略化も発見しました。

vi)o``

``最後の位置にジャンプします。したがって、マークを作成する必要はありません。

于 2012-07-26T17:36:20.617 に答える
1

プラグインを使用してもかまわないのであれば、vim-ninja-feetはまさにあなたが探しているものを実行すると思います。

  • c]i)パラメータリストの残りの部分を変更します、
  • d[i"引用符の先頭まで逆方向に削除し、
  • z]i][]ブロックの最後で挿入モードになります。
于 2018-03-14T19:23:09.293 に答える
0

私は小さな解決策を一緒にハックしました。いくつかのエッジケースがあり、1つずつエラーが発生する可能性がありますが、今日はテストする時間がありません。時間があればまた訪れます。

function! UntilTextObject(op)
    " Save marks
    let save_a = getpos("'a")
    let save_b = getpos("'b")

    " Read in the object type and set '< and '> to the ends of the
    " range of the text-object and 'a to the current position
    let object_type = nr2char(getchar())
    execute "normal! mavi" . object_type . "\<esc>"

    " Adjust end position (off by one)
    let pos = getpos("'>")
    let pos[2] += 1
    call setpos("'b", pos)

    " Operate on the range `a to `b
    execute "normal! `a" . a:op . "`b"

    " Restore marks
    call setpos("'a", save_a)
    call setpos("'b", save_b)
endfunction

onoremap u :call UntilTextObject(v:operator)<cr>

これによりdu)、テキストオブジェクトの最後まで削除することができます。他のテキストオブジェクトでも機能します。

マークを踏まないようにすることで、これをもう少し丁寧にするいくつかの変更を追加しました。何も選択しないテキストオブジェクトを指定すると、まだ少し風変わりです。後日これを再検討して、それを理解できるかどうかを確認します。デモンストレーションの目的で意図的に過剰にコメントされています。

于 2012-07-26T19:28:01.897 に答える
0

ct:この場合、を除くすべてを変更します:。の前にt数値引数を付けると、ネストされた中括弧/中括弧/引用符を快適に変更できますc2t)

カーソルが変更したい行にすでにある場合は、fc上記のコマンドで変更を開始したい文字にカーソルを合わせるか、検索を使用します。たとえば/c=、より一般的な場合、つまりc文字がある場合行の前、またはカーソルが現在前の行にあります。

于 2012-07-26T16:38:10.903 に答える