[英]Override vim autocmd for Makefiles
我正在上的一門課要求提交帶有兩個空格而不是制表符的代碼。 我在.vimrc
有一個 autocmd 來僅在用於該類中的作業的目錄中使用兩個空格長的選項卡。
autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
但是,我不希望目錄中的 Makefile 使用expandtab
選項,因為 make 需要制表符。
為此,我在.vimrc
創建了另一個 autocmd :
autocmd FileType make setlocal noexpandtab
然而,雖然第一個 autocmd 工作得很好,但第二個不會覆蓋第一個並且expandtab
將繼續設置,即使是在 Makefile 或 make 類型的文件上。 無論配置中的順序如何,都會發生這種情況。
我發現可行的一種有點hack-y的解決方案是使用
autocmd FileType make autocmd!
這將禁用該文件的所有其他 autocmd。 但是,這將禁用 Makefile 的所有其他 autocmd,這是不可取的。
有沒有其他方法可以使第二個命令優先於第一個命令,或者以某種方式禁用 Makefile 上的expandtab
選項?
白名單通常比黑名單容易得多:
augroup class
autocmd!
autocmd BufNewFile,BufRead ~/path/to/dir/*.{foo,bar,baz} set tabstop=2 shiftwidth=2 expandtab
augroup END
如果你把配置放在~/.vim/filetype.vim
而不是~/.vimrc
,它可能已經工作,因為你的用戶自定義在內置ftplugin/Makefile
之前運行(它將縮進設置重置為合理的東西) :
augroup filetypedetect
autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
augroup END
如果這不起作用,我會向:autocmd
添加一個條件,而不是定義一個中和的第二個:autocmd
:
autocmd BufNewFile,BufRead ~/path/to/dir/* if &filetype !=# 'make' | set tabstop=2 shiftwidth=2 expandtab | endif
在FileType
上使用一個 autocmd 而在BufNewFile,BufRead
事件上使用另一個的問題是事件類型決定了BufNewFile,BufRead
執行順序,盡管這個順序沒有很好地定義。
我選擇對兩個 autocmd 使用相同的事件類型。 這樣,指定它們的順序就是它們運行的順序(如 vim 文檔所述,但沒有提及事件類型警告):
set noexpandtab
au BufRead,BufNewFile,BufEnter /some/path/* set expandtab
" Not using FileType since that seems to run before BufRead,BufNewFile,BufEnter
au BufRead,BufNewFile,BufEnter *.go set noexpandtab
makefile 的文件類型檢測可能是根據BufRead,BufNewFile,BufEnter
事件類型定義的,例如BufRead,BufNewFile,BufEnter
,所以也許您可以將這些規則復制到您的.vimrc
並為您的其他規則使用相同的事件類型(也許不是最干凈的解決方案)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.