Vim更改了.sml文件的shiftwidth

时间:2013-01-18 16:38:12

标签: vim sml indentation

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。

之前我没有使用过filetype插件缩进,但经过一些搜索后,似乎可能是问题。我的ftplugin文件夹中没有文件,所以我将filetype plugin indent on添加到我的_vimrc,创建了sml.vim并将其放在ftplugin文件夹中(再次尝试了很多变种:

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,我的缩进文件夹是空的。

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

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

1 个答案:

答案 0 :(得分: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)