以下を使用せずに、vim入力モードで上矢印と下矢印をgj-gkに再マップします。?

以下を使用せずに、vim入力モードで上矢印と下矢印をgj-gkに再マップします。?

ビジュアルラインモードで移動するように矢印キーをマッピングし、キーは通常のhjkl論理ライン移動用に残しました。

" Visual movement with the arrows and End-Home 
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
inoremap <Home> <C-o>g<Home>
inoremap <End>  <C-o>g<End>

これはうまくいきますが、小さな問題があります。ステータスバーには、次のように入力モードと通常モードの間の色を変更するコードがあります。

if version >= 700
  highlight statusLine cterm=bold ctermfg=black ctermbg=red
  au InsertLeave * highlight StatusLine cterm=bold ctermfg=black ctermbg=red gui=bold guifg=black guibg=red
  au InsertEnter * highlight StatusLine cterm=bold ctermfg=black ctermbg=green   gui=bold guifg=black guibg=green
endif

<ctrl>o...今は、(家のものより遅いマシンで)矢印の1つを押すたびに、一時モードスイッチ(少なくとも私の考えでは)がステータスバーを赤くすばやく点滅させ、すぐに点滅することを発見しました。また緑に変わりました。

一時的に通常モードにジャンプするのを防ぐためにキーをオーバーライドできますか?

答え1

2つのアイデアがありますが、どちらも複雑です。

  1. 直接使用してカーソル:inoremap <expr>位置を調整してください:call cursor()。欠点は、どの改行列が大きく、すぐ上/下にあるかを計算する必要があることです。
  2. 次のように、以前にコマンドを:inoremap <expr>ラップし、その後に回復を選択するために使用されます。<C-o>gj:set eventignore+=InsertLeave,InsertEnter
function! IgnoreOn( motion )
    set eventignore+=InsertLeave,InsertEnter
    return "\<C-o>" . a:motion
endfunction
function! IgnoreOff()
    set eventignore-=InsertLeave,InsertEnter
    return "\<Left>\<Right>" | " Workaround for missing screen update.
endfunction
inoremap <expr> <SID>IgnoreOff IgnoreOff()
inoremap <expr> <SID>IgnoredDown IgnoreOn('gj')
inoremap <script> <Down> <SID>IgnoredDown<SID>IgnoreOff

答え2

私の解決策はIgnoの提案に基づいていますが、マウスの動きはあまり必要ありません。

autocmd! InsertEnter * set eventignore-=InsertLeave
function! s:UpDown(keys)
  set eventignore+=InsertLeave
  return "\<C-O>".a:keys
endfunction
inoremap <expr> <DOWN> <SID>UpDown('gj')
inoremap <expr> <Up> <SID>UpDown('gk')

関連情報