簡體   English   中英

為 Makefile 覆蓋 vim autocmd

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM