組み込みcursor()
関数でカーソルを移動する関数があり、通常モードで正常に動作します。
具体的には、これが関数であると仮定します。
function! F()
call cursor( line('.')+1, 1)
endfunction
次のようにマッピングで使用されます。
nnoremap <buffer> a :call F()<cr>
ここで、この関数を再利用して、以前の選択を失うことなく、任意のビジュアル モード (ビジュアル、ライン ビジュアル、ブロック ビジュアル) でカーソルを移動したいと考えています。
たとえば、ビジュアル モードの初期バッファでは (c
カーソルが行にあるv
ことを意味し、その行が現在のビジュアル選択の一部であることを意味します):
vc 1
2
3
ヒットa
すると次のようになります。
v 1
vc 2
3
もう一度押すと、次のa
ようになります。
v 1
v 2
vc 3
そのため、古い選択が保持されました。
私のアプリケーションはかなり大きいF()
ので、できるだけ再利用したいと思います。
それを行う最善の方法は何ですか?F()
これまで、私ができる最善のことは、ラッパー関数を使用することでした:
function! VisMove(f)
normal! gv
call function(a:f)()
endfunction
次のようにマップします。
vnoremap <buffer> a :call VisMove('F')<cr>
ただし、次の理由で満足していません。
- 私が書くすべての新しいfgpluginに迷惑なラッパーを置く必要があります。
- ビジュアル (現在の) モードを終了することなく、カーソルを移動する (または他の任意の副作用を持つ) 関数を呼び出すことは、非常に自然なことのように思えます。もう
<expr>
ほとんどやってるのもありますが、カーソル位置をリセットします。