![Vim - ビジュアルモード - 単語選択の改善](https://rvso.com/image/1399997/Vim%20-%20%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%20-%20%E5%8D%98%E8%AA%9E%E9%81%B8%E6%8A%9E%E3%81%AE%E6%94%B9%E5%96%84.png)
皆様、
ビジュアル モード (.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
[]の