编辑:工作版本。
我已经映射[[
并]]
到我自己的职能:
nmap <silent> ]] :let &tabstop += 1 <CR> :echo 'tabstop =' &tabstop <CR>
nmap <silent> [[ :let &tabstop -= &tabstop > 1 ? 1 : 0 <CR> :echo 'tabstop =' &tabstop <CR>
然而,根据:verbose map [[
这些被覆盖/usr/share/vim/vim72/ftplugin/php.vim
。如何在保留我自己的映射的同时摆脱 PHP 映射?我试过了
autocmd FileType php unmap! [[
autocmd FileType php unmap! ]]
根据教程,但随后我在 Vim 启动时收到错误消息:
Error detected while processing FileType Auto commands for "php":
E31: No such mapping
E31: No such mapping
Press ENTER or type command to continue
使用nnoremap
而不是nmap
没有帮助。
将映射放入~/.vim/after/ftplugin/php.vim
也没用。vim -V
显示:
...
finished sourcing /usr/share/vim/vim72/ftplugin/php.vim
...
finished sourcing /home/user/.vim/after/ftplugin/php/php.vim
所以它确实找到了所谓的覆盖。
组合nnoremap
和“之后”脚本也不起作用。
答案1
特定定义(特定于文件类型、特定于项目……)应始终在当前缓冲区本地声明。这是通过<buffer>
映射和缩写的限定符来完成的(命令使用-b
,菜单需要特定的插件来模拟它,变量以 为前缀b:
,设置应使用 来设置(原文如此):setlocal
)。
此外,要在缓冲区本地声明它(即 ft 特定定义),您可以像您似乎正在做的那样使用自动命令,但我建议改为使用 ftplugins。它更易于维护,并且已经考虑了有关覆盖各种定义(映射等)的所有规则。
" => ftplugin/php/php_my_stuff.vim
" headers guards...
...
:nnoremap <silent> <buffer> ]] :setlocal ts+=1<cr>:set ts?<cr>
:nnoremap <silent> <buffer> [[ :setlocal ts-=1<cr>:set ts?<cr>
PS:SO或SU更适合这样的问题。
答案2
我会尝试使用提示来否决所描述的默认插件检查这里。总结一下:将映射插件文件放在运行路径的后期(例如~/.vim/after/ftplugin/php.vim
)以覆盖全局映射。
答案3
你是否尝试使用nnoremap
而不是nmap
在你的.vimrc
nnoremap <silent> ]] :let &tabstop += 1 <CR> :echo 'tabstop =' &tabstop <CR>
nnoremap <silent> [[ :let &tabstop -= &tabstop > 1 ? 1 : 0 <CR> :echo 'tabstop =' &tabstop <CR>