2013-08-22 61 views
0

我用Vim 7.3,並有這在我的.vimrc(沒有別的):Vim自動命令不在搜索上觸發?

filetype plugin indent on 
autocmd FileType java :setlocal sw=4 ts=4 sts=2 noet 
autocmd BufNewFile,BufReadPost ~/testdir/* setlocal sw=2 ts=2 sts=2 et 

我有一個目錄~/testdir只包含子目錄p和包含該文件~/testdir/p/A.java

class A { 
} 

如果我打開A.java:e ~/testdir/p/A.java然後:set et?報告expandtab目前ON

在另一方面,如果我啓動Vim的新實例,去:vim A ~/testdir/**那麼這個搜索將打開A.java,但現在:set et?告訴我expandtabOFF

如何使我的預期縮進設置始終適用於~/testdir/下的文件?

+0

是位於'$ HOME/git/repo /'下的文件'X'? – Kent

+0

是的,我將編輯該問題以澄清此問題! – user11171

+0

不知道,但有幫助BufReadPost說'不適用於':r文件''的說明。也許它不適用於':vim'。 – glts

回答

1

事件BufReadPost應該被解僱。檢查是否寫了一條消息。這就是:

autocmd BufNewFile,BufReadPost $HOME/git/repo/* echom "Reading buffer " . expand("<afile>") 

查找消息有:

:messages 

如果消息是有,那麼你知道你正在設置緩衝這些選項。所以,如果顯示緩衝區時選項已經改變,可能是一個插件將它們設置爲其他的東西。檢查誰是罪魁禍首通過展示誰最後有

:verbose set sw? 

改變的選項。如果不帶你到一個解決方案,請嘗試使用BufWinEnter代替BufReadPost。這可能會奏效。

+0

我已經縮小了它現在的問題是由filetype插件引起的。 'BufReadPost'確實會觸發,但是我猜這個文件類型插件在那之後運行並且覆蓋了我的設置。 – user11171

+0

剛試過'BufWinEnter',這似乎工作,我不認爲我嘗試了這一點,當我第一次看到你的答案,但這似乎解決了我的問題!謝謝! 閱讀了文檔後,似乎'BufEnter'也可以工作。 – user11171

0

autocmd確實有效,但可能不是您期望的方式,因爲您沒有設置softtabstop

autocmd BufNewFile,BufReadPost ~/git/repo/* setlocal sw=2 ts=2 sts=2 et 

如果您未設置softtabstop,它將保留其舊值。如果這個值不是0(似乎是這種情況),當你按下tab鍵時,你將得到插入到文件中的softtabstop空間的數量。它會看起來不起作用。

如果您更改它,通常將shiftwidth,tabstop和softtabstop設置爲相同的值是一個好主意。

它也可能是一個好主意,通過使用setlocal使set命令本地緩衝區。

看看:h softtabstop


你可以看到自動命令「作品」時,如果你像這樣運行命令softtabstop被設置爲(0),它的默認值。然後運行命令:vim

vim -u NONE -N -c'autocmd BufNewFile,BufReadPost $HOME/git/repo/* set sw=2 ts=2 et' 
+0

我現在也在設置'softtabstop',但沒有運氣。 – user11171

1

Vim的明確建議使用~用戶家中。

:h autocmd-patterns幫助說,你可以在事件模式使用環境變量...

... [一]第二~可用於主目錄(如果$HOME定義):

:autocmd BufWritePost ~/.vimrc so ~/.vimrc 
:autocmd BufRead ~archive/*  set readonly 

當自動命令被定義,而不是當執行 自動命令環境變量已展開。這與命令不同!

因此,改變$HOME在你的自動命令~

即使您的問題變得不相關,最好遵循文檔中推薦的做法。