2

これは単純なものに違いないことはわかっています。

vnoremap <leader>rl di[<esc>pa]選択したテキストを括弧で囲むのはなぜですか?

vnoremap <leader>rl :call VisAddRefLink()<CR>

function! VisAddRefLink()
    execute "normal! di[\<esc>pa]"
endfunction

じゃない?!

どんな助けでも大歓迎です!

4

2 に答える 2

2

これを試して:

vnoremap <leader>rl :<C-u>call VisAddRefLink()<CR>

function! VisAddRefLink()
    execute "normal! gvdi[\<esc>pa]"
endfunction

<C-u>前はcall、マッピングが'<,'>視覚的な範囲をその前に挿入することを回避します。範囲内のすべての行に対して 1 回ではなく、関数を 1 回だけ呼び出す必要があります。

関数内では、操作を行う前にまず視覚的な選択を再確立する必要があります。はgvそれを行います。

于 2012-09-20T07:14:18.953 に答える
2

関数で範囲を処理する必要があります。これを実現する 1 つの方法は次のようになります。

vnoremap <leader>rl :call VisAddRefLink()<CR>

function! VisAddRefLink() range
   exe a:firstline . "normal! ^i["
   exe a:lastline . "normal! $a]"
endfunction

あなたの例が機能しない理由は、exe がビジュアル選択ごとに動作しないためです。たとえば、何かを視覚的に選択してから を実行してみてください:norm d。削除されないことに気付くでしょう。関数に範囲を追加する:help function-range-exampleと、同様の方法で(行ごとに)操作することで視覚的な選択に役立ちます。ただし、それはまだ真の視覚的な選択ではありません。ただし、範囲の追加により、変数a:firstlinea:lastline変数を使用できます。これを使用してこれを達成できます。次のように、単一の like でこれを実現することもできます。

vnoremap <leader>rl <esc>:norm! '<^x2Phr['>$x2pr]<cr>

これは、最初<esc>に視覚的な選択を終了するために使用されます。次に、一度だけ実行される通常のコマンドを実行します。ビジュアル選択が残っている場合、ビジュアル選択の各行に対して 1 回実行されます。一度実行したら

'<^ビジュアル選択の最初の行と、その行の空白以外の最初のスペースにジャンプします。

x2Phr[その文字を削除し、前に 2 回貼り付け、左に移動して新しい文字の上に移動し、開始 [

'>$視覚的な選択範囲の最後の行の最後の文字に移動します

x2pr]前と同じだが逆方向

いつものように、特に vimscript を使用して、猫の皮を剥く方法は複数あります。もっと学べば、物事を達成するための多くの可能性が見えてきます。

于 2012-09-20T00:44:54.863 に答える