다음을 사용하지 않고 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. 직접 사용하여 :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')

관련 정보