Vim重映射仅在函数内部工作

时间:2015-02-14 08:14:37

标签: vim

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

我有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 个答案:

答案 0 :(得分:1)

有两种可能性:

  1. 插件可能会覆盖插入模式映射;查看:verbose imap <Up>
  2. 您的映射只能在第一个缓冲区中使用;对于全局配置,请从<buffer>命令中删除:map(例如,将:setlocal切换为:set)。