可変行数を上下に移動するプラグインを作成しようとしています。カスタム モーションとして使用できるものを作成し、ノーマル モード、ビジュアル モード、オペレータ保留モードで使用できるようにしたいと考えています。
ここにアイデアの小さなスニペットがあります:(ここの「3」は例です。目標は可変数の行を移動することですが、それは私の質問とは関係ありません。)
function! MoveDownThreeLines(mode)
if a:mode == 'v'
normal! gv
endif
if a:mode == 'o'
normal! V3j
else
normal! 3j
endif
endfunction
nnoremap w :call MoveDownThreeLines('n')<CR>
vnoremap w :call MoveDownThreeLines('v')<CR>
onoremap w :call MoveDownThreeLines('o')<CR>
このスニペットの目標は、3 行下に移動するカスタム モーションを作成することです。の動作を の動作w
と同じにしたい3j
。通常モードでは、予想どおり 3 行下に移動し、オペレーター保留モードでは、オペレーターは予想どおり 4 行 (現在の行とその下の 3 行) に作用します。( を使用して強制的にモーションを線単位にする必要がありましV
たが、これは奇妙です。これは、j
既に線単位のモーションであるためです。その理由を知っている人はいますか?)
問題はビジュアル モードにあります。ビジュアル モードに入ってから を押すw
と、予想どおり、カーソルが 3 行下に移動します。もう一度押すw
と、2行しか下に移動しません。
同様に、ビジュアル モードに入り、別の方法で選択範囲を下方向に拡張すると、 を押すw
だけで 2 行下に移動します。他の奇妙な問題は、ビジュアル モードに入って選択範囲を上に拡張すると、選択範囲w
が古い選択範囲の一番下から 2 行下になるように変更されることです。(目標はw
、 を使用した場合と同様に、選択範囲の上部を 3 行下に移動すること3j
です。)
どのようなw
場合でも 3 行下に移動するにはどうすればよいですか?
PS: Ingo Karkat さん、たまたまこれを読んでいるなら、非常によくコメントされたキャメルケースモーション スクリプトに感謝します。