Vim 重映射仅在函数内部有效

Vim remaps only work if inside of a function

我正在尝试根据 VIM 中显示的行启用导航,并启用 set wrap linebreak

我有这个 function,它会用 <Leader-W>

切换换行
noremap <silent> <Leader>w :call ToggleWrap()<CR>
function ToggleWrap()
  if &wrap
    echo "Wrap OFF"
    setlocal nowrap
    set virtualedit=all
    silent! nunmap <buffer> <Up>
    silent! nunmap <buffer> <Down>
    silent! nunmap <buffer> <Home>
    silent! nunmap <buffer> <End>
    silent! iunmap <buffer> <Up>
    silent! iunmap <buffer> <Down>
    silent! iunmap <buffer> <Home>
    silent! iunmap <buffer> <End>
  else
    echo "Wrap ON"
    setlocal wrap linebreak nolist
    set virtualedit=
    setlocal display+=lastline
    noremap  <buffer> <silent> <Up>   gk
    noremap  <buffer> <silent> <Down> gj
    noremap  <buffer> <silent> <Home> g<Home>
    noremap  <buffer> <silent> <End>  g<End>
    inoremap <buffer> <silent> <Up>   <C-o>gk
    inoremap <buffer> <silent> <Down> <C-o>gj
    inoremap <buffer> <silent> <Home> <C-o>g<Home>
    inoremap <buffer> <silent> <End>  <C-o>g<End>
  endif
endfunction  

这非常有效。但我想一直启用换行和换行,并让这个导航映射工作。所以我删除了这个功能并留下了这个。

    set wrap linebreak nolist
    set virtualedit=
    set display+=lastline
    noremap  <buffer> <silent> <Up>   gk
    noremap  <buffer> <silent> <Down> gj
    noremap  <buffer> <silent> <Home> g<Home>
    noremap  <buffer> <silent> <End>  g<End>
    inoremap <buffer> <silent> <Up>   <C-o>gk
    inoremap <buffer> <silent> <Down> <C-o>gj
    inoremap <buffer> <silent> <Home> <C-o>g<Home>
    inoremap <buffer> <silent> <End>  <C-o>g<End>

普通模式工作正常,但插入模式不行。这在函数之外不起作用的任何原因?

有两种可能:

  1. 插件可能会覆盖插入模式映射;检查 :verbose imap <Up>.
  2. 您的映射仅适用于 第一个 缓冲区;对于全局配置,从 :map 命令中删除 <buffer>(就像您将 :setlocal 切换到 :set)。