2

VIM で Ctrl-y をマップして、カーソルの下から始まるブラケットに一致するものをすべて削除しようとしています。動作しますが、ブラケットも消去します。これは私が現在使用しているものです:

imap <c-y> <Esc><Right>d%<Insert>

私が言ったように、カーソルの下にあるものも削除します(つまり、ブラケットの一致)。私はこれを見つけました:

diX

X探しているブラケットです。[('、など

コマンドの問題は、iこれを定期的に行うブラケットごとに新しいキーをマップしたくないことです。%文字であっても、カーソルの下にあるものと一致するという点で気に入っていますs

ブラケットを保持するためにこれを取得する方法はありますか?

編集:申し訳ありませんが、例です。次のテキストの例があります (* はカーソルを表します)。

(*text to be erased between brackets)
"*text to be erased between brackets"
'*text to be erased between brackets'
[*text to be erased between brackets]
{*text to be erased between brackets}

基本的に、これらの各例では、カーソルを問題のブラケットの上に置き、ヒットCtrl-yすると、挿入モードから通常モードに移動し、すべてのテキストまたはカーソルの下のブラケットの間にあるものをすべて削除します(その時点での下)私は通常モードに移行したので<Right>、同じブラケットの次のものに移動しました。

したがって、上記のすべては次のようになります。

()
""
''
[]
{}

周囲のブラケットを削除せずに。ブラケットd%を取り外した状態。

4

3 に答える 3

5

いいえ、%ペアの残りの半分にのみ一致し、 のようなアルファベット文字はペアにsはなりません: でのみ作業できます(){}[]''""<>

また、編集は挿入​​モードではなく通常モードで行います。

通常モードでは、可能なシーケンスの 1 つが次のようになりますv%holc

" []: normal mode cursor, |: insert mode cursor

[(]foo bar baz)
[(foo bar baz)]
[(foo bar baz])
([foo bar baz])
(|)

したがって、次のマッピングはニーズを満たす必要があります。

nnoremap <C-y> v%holc

このマッピングを拡張して、任意の文字で機能するようにすることは、それほど簡単ではありません。

私はそれを付け加えなければci(なりません、そして友人はあなたが思っているほど負担ではありません.

編集

次の関数 (および関連するノーマル モード マッピング) はあまりスマートではありませんが、要求どおりに機能します。自由に変更してください。それはこのように動作します:

  • をクリック<C-y>する({[<と、現在の文字とその兄弟 ( >]})) の間のテキストが削除され、挿入モードになります。

  • 他の文字をヒット<C-y>すると、現在の文字とその行で次に出現する文字の間のテキストが削除され、挿入モードになります。

関数:

function! InPair()

  let l:this_char = getline('.')[col('.')-1]

  if this_char == '{' || this_char == '(' || this_char == '[' || this_char == '<'
    execute "normal! di" . this_char
  else
    execute "normal! ldt" . this_char
  endif

  startinsert

endfunction

マッピング:

nnoremap <C-y> :call InPair()<CR>

決して完璧ではありませんが、良い出発点になるはずです。

于 2013-03-29T06:48:34.987 に答える
0

例を挙げましょう。よくわかりませんでした... :(

これがあれば (* はカーソル)、現在のマッピングが変更されます。

(foo*bar)

into         

*ar)

しかし、あなたはそれをしたい:

(*ar) (back to INSERT mode)

次に、次のことができます。

imap <c-y> <Esc>lv%ls

最初に開始ブラケットを視覚的に選択し、次に右に移動してブラケットが後で削除されないようにsし、視覚的な選択を削除して INSERT モードに戻ります。

ああ、あなたの質問をもう一度読みました。

*bar) ( INSERT mode)

それは簡単です:(まだ現在のマッピングに基づいています)

 imap <c-y> <Esc>c%

ところで、あなたがしたい場合(*bar) (INSERT mode):(あなたは本当にあなたの質問で例を作るべきです.... ^_^)

imap <c-y> <Esc>v%lc
于 2013-03-28T22:42:30.030 に答える