Vim - ビジュアルモード - 単語選択の改善

Vim - ビジュアルモード - 単語選択の改善

皆様、

ビジュアル モード (.vimrc) で以下のショートカットをトリガーすると、vim が次のような動作を示す理由がわかりません。

vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
     "empty
endfunction

ここに画像の説明を入力してください

Vim は、ショートカットをトリガーした行の上の行の最初の列に移動し、ステータス バーに「: '<,'> call Test ()」と表示します。ただし、これは関数を呼び出す場合にのみ発生し、「$」などのコマンドを使用する場合 (* を参照)、動作は予想どおりです。

ここに画像の説明を入力してください

(*)

vmap <C-LEFT> $

私の目標は、「Ctrl+Left」の組み合わせを使用するときに、Vim が「タブ」を単語として認識するようにすることです。これは、行の最初の文字が「タブ」の場合、Vim が最上行の最初の単語を選択するためです。

ここに画像の説明を入力してください

望ましい動作は次のとおりです。

ここに画像の説明を入力してください

代替の解決策や回避策があれば、それもありがたいです。

ありがとう!

答え1

これはvmap、vim がビジュアル モードまたは選択モードのときに適用されます。マップをトリガーしたときにどのテキストが選択されたかを指定しませんでした。

この驚くべき行動は、

:'<,'>

を使用してビジュアル モードから Ex モードに切り替えるときに自動的に提供される範囲:。また、ユーザー定義関数がデフォルトで範囲を処理する方法。

そうは言っても、カーソルはビジュアル選択の最後の行で終了するはずです。説明されている動作を再現できません。

:help :call
:help '<
:help v_:

答え2

:callこれは、 が自動的に追加された視覚範囲 で呼び出されるためです'<,'>:help :callは次のように説明しています。

範囲が指定され、関数自体がそれを処理しない場合は、関数は範囲内の各行に対して実行され、カーソルはその行の最初の列にあります。カーソルは最後の行に残ります (最後の関数呼び出しによって移動された可能性があります)。

だから範囲をクリアする必要がある

vmap <script> <C-LEFT> :<C-u>call Test()<CR>

または関数に処理させます:

function! Test() range

答え3

私は次のアプローチを使用してこの問題を「解決」しました。

" Note: "Normal" movement with "Ctrl+Right"! By Questor
nmap <silent> <C-Right> e
imap <silent> <C-Right> <C-o>e<Right>
vmap <silent> <C-Right> e

" Note: "Normal" movement with "Ctrl+Left"! By Questor
nmap <silent> <C-Left> b
imap <silent> <C-Left> <C-o>b
vmap <silent> <C-Left> b

ただし、関数は使用しないことに注意してください。関数が使用されている場合は、Ingo Karkat が回答で説明しているように ( を使用: <C-u>) 続行する必要があります。

この単純なアプローチにより、上で説明した Vim の望ましくない動作を「修正」します。

使用例を見るhttps://github.com/eduardolucioac/groovim/blob/master/.vimrc

[]の

関連情報