Vim自动命令不会在搜索时触发?

时间:2013-08-22 15:42:08

标签: vim automation indentation

我使用Vim 7.3,并在我的.vimrc(以及其他任何内容)中使用它:

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当前开启

另一方面,如果我启动一个新的Vim实例并转到:vim A ~/testdir/**,那么此搜索将会打开A.java,但现在:set et?告诉我expandtab关闭

如何将我想要的缩进设置始终应用于~/testdir/下的文件?

3 个答案:

答案 0 :(得分:1)

应该触发事件BufReadPost。检查是否正在撰写邮件。这是:

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

使用以下内容查找消息:

:messages

如果有消息,那么您知道您正在为缓冲区设置这些选项。因此,如果在显示缓冲区时选项已更改,则可能是插件将其设置为其他内容。通过显示最后一个用

更改选项的人来检查谁是罪魁祸首
:verbose set sw?

如果这不能引导您找到解决方案,请尝试使用BufWinEnter代替BufReadPost。这可能会奏效。

答案 1 :(得分:1)

Vim明确建议将~用于用户家。

:h autocmd-patterns的帮助说你可以在事件模式中使用环境变量......

  

... [a] nd ~可用于主目录(如果已定义$HOME):

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

定义自动命令时扩展环境变量,而不是何时扩展   自动命令被执行。这与命令不同!

因此,请在自动命令中将$HOME更改为~

即使您的问题无关紧要,也可以按照文档中推荐的做法进行操作。

答案 2 :(得分:0)

autocmd确实有效,但可能不是您预期的方式,因为您没有设置softtabstop

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

如果您没有设置softtabstop,它将保留其旧值。如果按Tab键时该值不为0(这似乎是这种情况),您将获得插入文件的softtabstop空格的数量。看起来它不起作用。

如果你改变了它,通常最好将shiftwidth,tabstop和softtabstop设置为相同的值。

使用setlocal将set命令设置为缓冲区本地也是个好主意。

查看:h softtabstop


如果运行这样的命令,当softtabstop设置为其默认值(0)时,您可以看到autocmd“有效”。然后运行:vim命令

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