0

可変行数を上下に移動するプラグインを作成しようとしています。カスタム モーションとして使用できるものを作成し、ノーマル モード、ビジュアル モード、オペレータ保留モードで使用できるようにしたいと考えています。

ここにアイデアの小さなスニペットがあります:(ここの「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 さん、たまたまこれを読んでいるなら、非常によくコメントされたキャメルケースモーション スクリプトに感謝します。

4

1 に答える 1