Vim:如何擺脫特定於文件類型的映射?

Vim:如何擺脫特定於文件類型的映射?

編輯:工作版本

我已經繪製了地圖[[並且]]我自己的職能

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>

相關內容