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>
普通模式工作正常,但插入模式不行。这在函数之外不起作用的任何原因?
有两种可能:
- 插件可能会覆盖插入模式映射;检查
:verbose imap <Up>
.
- 您的映射仅适用于 第一个 缓冲区;对于全局配置,从
:map
命令中删除 <buffer>
(就像您将 :setlocal
切换到 :set
)。
我正在尝试根据 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>
普通模式工作正常,但插入模式不行。这在函数之外不起作用的任何原因?
有两种可能:
- 插件可能会覆盖插入模式映射;检查
:verbose imap <Up>
. - 您的映射仅适用于 第一个 缓冲区;对于全局配置,从
:map
命令中删除<buffer>
(就像您将:setlocal
切换到:set
)。