Vim更改.sml文件的shiftwidth

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文件夹中没有文件,因此我在我的_vimrc中添加了 filetype plugin indent on ,创建了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的内容,并且我的indent文件夹是空的。

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

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


3
加载一个 .sml 文件并运行 :verb set sw 命令 - 它会告诉你它最后一次被设置的位置。 - sidyll
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 / 目录的情况下禁用设置。

更新:它实际上是默认值,但是如@Nikita Kouevda指出的那样,它是indent脚本而不是ftplugin 。因此,您需要将此行放入〜/ .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)

1
请注意,OP使用filetype indent on,因此$VIMRUNTIME/indent/sml.vimshiftwidth设置为2。由于indent文件在sftplugin文件之后被引用,因此必须使用~/.vim/after/indent/sml.vim以覆盖$VIMRUNTIME/indent/sml.vim - Nikita Kouevda
@NikitaKouevda 谢谢,我已经习惯了将这些设置放在 ftplugin 中,并且只检查了这个和语法目录。 - ZyX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接