7

組み込み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>

ただし、次の理由で満足していません。

  1. 私が書くすべての新しいfgpluginに迷惑なラッパーを置く必要があります。
  2. ビジュアル (現在の) モードを終了することなく、カーソルを移動する (または他の任意の副作用を持つ) 関数を呼び出すことは、非常に自然なことのように思えます。もう<expr>ほとんどやってるのもありますが、カーソル位置をリセットします。
4

1 に答える 1

2

modeこれを解決するには、関数に引数 (または代わりにブール値isVisualフラグ) を渡します。

fu! F(mode) range
    if a:mode ==# 'v'
        normal! gv
    endif
    ...
endf
nn <buffer> a :cal F('n')<cr>
vn <buffer> a :cal F('v')<cr>
于 2013-04-25T11:21:54.537 に答える