Vim:如何摆脱特定于文件类型的映射?

l0b*_*0b0 6 vim keyboard-shortcuts

编辑:工作版本

我已经制定[[]]我自己的功能

nmap <silent> ]] :let &tabstop += 1 <CR> :echo 'tabstop =' &tabstop <CR>
nmap <silent> [[ :let &tabstop -= &tabstop > 1 ? 1 : 0 <CR> :echo 'tabstop =' &tabstop <CR>
Run Code Online (Sandbox Code Playgroud)

但是,根据:verbose map [[这些被/usr/share/vim/vim72/ftplugin/php.vim. 如何在保留自己的同时摆脱 PHP 映射?我试过了

autocmd FileType php unmap! [[
autocmd FileType php unmap! ]]
Run Code Online (Sandbox Code Playgroud)

根据教程,但随后我在 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

所以它确实找到了假设的覆盖。

组合nnoremap和“之后”脚本也不起作用。

Luc*_*tte 5

特定定义(特定于文件类型、特定于项目,...)应始终声明为当前缓冲区的本地定义。这是通过<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>
Run Code Online (Sandbox Code Playgroud)

PS:SO 或 SU 更适合回答这样的问题。