これは単純なものに違いないことはわかっています。
vnoremap <leader>rl di[<esc>pa]選択したテキストを括弧で囲むのはなぜですか?
vnoremap <leader>rl :call VisAddRefLink()<CR>
function! VisAddRefLink()
execute "normal! di[\<esc>pa]"
endfunction
じゃない?!
どんな助けでも大歓迎です!
これは単純なものに違いないことはわかっています。
vnoremap <leader>rl di[<esc>pa]選択したテキストを括弧で囲むのはなぜですか?
vnoremap <leader>rl :call VisAddRefLink()<CR>
function! VisAddRefLink()
execute "normal! di[\<esc>pa]"
endfunction
じゃない?!
どんな助けでも大歓迎です!
これを試して:
vnoremap <leader>rl :<C-u>call VisAddRefLink()<CR>
function! VisAddRefLink()
execute "normal! gvdi[\<esc>pa]"
endfunction
の<C-u>前はcall、マッピングが'<,'>視覚的な範囲をその前に挿入することを回避します。範囲内のすべての行に対して 1 回ではなく、関数を 1 回だけ呼び出す必要があります。
関数内では、操作を行う前にまず視覚的な選択を再確立する必要があります。はgvそれを行います。
関数で範囲を処理する必要があります。これを実現する 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:firstlineとa:lastline変数を使用できます。これを使用してこれを達成できます。次のように、単一の like でこれを実現することもできます。
vnoremap <leader>rl <esc>:norm! '<^x2Phr['>$x2pr]<cr>
これは、最初<esc>に視覚的な選択を終了するために使用されます。次に、一度だけ実行される通常のコマンドを実行します。ビジュアル選択が残っている場合、ビジュアル選択の各行に対して 1 回実行されます。一度実行したら
'<^ビジュアル選択の最初の行と、その行の空白以外の最初のスペースにジャンプします。
x2Phr[その文字を削除し、前に 2 回貼り付け、左に移動して新しい文字の上に移動し、開始 [
'>$視覚的な選択範囲の最後の行の最後の文字に移動します
x2pr]前と同じだが逆方向
いつものように、特に vimscript を使用して、猫の皮を剥く方法は複数あります。もっと学べば、物事を達成するための多くの可能性が見えてきます。