可変行数を上下に移動するプラグインを作成しようとしています。カスタム モーションとして使用できるものを作成し、ノーマル モード、ビジュアル モード、オペレータ保留モードで使用できるようにしたいと考えています。
ここにアイデアの小さなスニペットがあります:(ここの「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 さん、たまたまこれを読んでいるなら、非常によくコメントされたキャメルケースモーション スクリプトに感謝します。