我已经映射了我的箭头键以在可视线模式下移动,将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>
Run Code Online (Sandbox Code Playgroud)
这有效,但对于一个小问题。我的状态行中有一些代码可以在输入模式和正常模式之间更改颜色,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
...我现在注意到(在一台比我家里的机器慢的机器上)每次我按下一个箭头时,<ctrl>o
(至少,我认为)的临时模式开关会使状态行快速闪烁红色然后又绿了。
是否可以重新定义键以避免临时跳转到正常模式?
我有两个想法,但都很复杂:
:inoremap <expr>
并执行光标重新定位:call cursor()
。缺点是您必须计算哪个换行列直接位于光标上方/下方。: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
Run Code Online (Sandbox Code Playgroud)