0

我使用 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当前为ON

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

如何使我的预期缩进设置始终适用于下的文件~/testdir/

4

3 回答 3

1

Vim 明确推荐使用~用户 home。

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

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

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

环境变量在定义自动命令时展开,而不是在执行自动命令时展开。这和命令不一样!

因此,在您的自动命令中更改$HOME~

即使您的问题被证明是无关的,最好遵循文档中推荐的做法。

于 2013-08-22T17:50:05.847 回答
1

该事件BufReadPost应该被触发。检查写消息。这是:

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

查找消息:

:messages

如果消息在那里,那么您知道您正在为缓冲区设置这些选项。因此,如果在显示缓冲区时选项已更改,则可能是插件将它们设置为其他内容。通过显示谁最后更改选项来检查谁是罪魁祸首

:verbose set sw?

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

于 2013-08-22T17:26:08.860 回答
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'
于 2013-08-22T17:45:18.353 回答