5

Win 7 下的 Vim 将我的 shiftwidth 设置更改为我不希望仅用于 .sml 文件的设置。

我想要的是所有内容都只能缩进空格,并且所有内容都始终是 4 个空格。这是我当前 _vimrc 文件的内容,尽管我尝试了很多变体:

set nocompatible
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

set guifont=Consolas:h9:cANSI
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

filetype plugin indent on

" Set the tab width
let s:tabwidth=4
exec 'set tabstop='    .s:tabwidth
exec 'set shiftwidth=' .s:tabwidth
exec 'set softtabstop='.s:tabwidth

当我第一次在没有加载文件的情况下启动 Vim 时,:set shiftwidth返回shiftwidth=4. 当我打开 .py 或 .php 文件时,它仍然返回shiftwidth=4. 但是,当我打开一个 .sml 文件或仅使用 .sml 扩展名保存空白文件时,它会更改为shiftwidth=2. 手动设置:set shiftwidth=2适用于该会话,但我每次打开 .sml 文件时都必须这样做。

它只影响带有打开的 .sml 文件的缓冲区。未保存的缓冲区或同时打开其他文件类型的缓冲区显示 shiftwidth=4。

我之前没有使用文件类型插件缩进的东西,但经过一番搜索,这似乎是问题所在。我的 ftplugin 文件夹中没有文件,所以我添加filetype plugin indent on到我的 _vimrc,创建 sml.vim 并将其放入 ft​​plugin 文件夹中(再次尝试了许多变体:

set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

" Set the tab width
let s:tabwidth=4
exec 'set tabstop='    .s:tabwidth
exec 'set shiftwidth=' .s:tabwidth
exec 'set softtabstop='.s:tabwidth

我知道 sml.vim 正在被读取,因为我一开始在其中放入了错误,并且它们被捕获了。

不确定这是否相关,但在我的 indent.vim 中没有任何关于 .sml 的内容,而且我的 indent 文件夹是空的。

然而,每次我加载 .sml 文件时,Vim 仍然设置 shiftwidth=2。我想知道为什么。

更新:我说的空缩进文件夹是 vim\vimfiles\indent。在下面的答案和评论之后,我搜索了 sml.vim 并找到了另一个缩进文件夹 vim\vim73\indent。我编辑了 sml.vim 并将 shiftwidth=2 更改为 shiftwidth=4 ,问题就解决了。

4

1 回答 1

6

这很可能是由于某些文件类型插件。如果它是默认的(即与 vim 本身一起提供),正确的修复将是放置适当的集合

setlocal ts< sw< sts< " Set ts, sw and sts to global values

^ 进入~/.vim/after/ftplugin/sml.vim. 但是在 vim 发行版中没有这样的设置。在这种情况下,上述解决方案可能有效(取决于此非标准插件所在的位置),但最好先检查verb set sw并检查定义的插件&sw是 a) 您真正需要的插件还是 b) 可配置的,所以可以在不使用after/目录的情况下禁用该设置。

更新:看起来它实际上是默认的,但是indent脚本而不是ftplugin@Nikita Kouevda 指出的那样。因此,您需要将此行放入~/.vim/after/indent/sml.vim.


" Set the tab width
let s:tabwidth=4
exec 'set tabstop='    .s:tabwidth
exec 'set shiftwidth=' .s:tabwidth
exec 'set softtabstop='.s:tabwidth

改用这个:

let s:tabwidth=4
let &tabstop     = s:tabwidth
let &shiftwidth  = s:tabwidth
let &softtabstop = s:tabwidth

或者

let [&tabstop, &shiftwidth, &softtabstop]=repeat([4], 3)
于 2013-01-18T17:48:37.537 回答