これは単純なものに違いないことはわかっています。
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 を使用して、猫の皮を剥く方法は複数あります。もっと学べば、物事を達成するための多くの可能性が見えてきます。