按文件类型更改Vim缩进行为


379

有人可以简单地向我解释根据文件类型更改Vim缩进行为的最简单方法吗?例如,如果我打开Python文件,则应缩进2个空格,但是如果我打开Powershell脚本,则应缩进4个空格。


9
顺便说一句-Python的PEP8约定说,制表符应为4个空格,制表符应为4个空格。REF: stackoverflow.com/questions/120926/...
cgseller

Answers:


304

您可以.vim在vim切换到特定文件类型时添加要执行的文件。

例如,我有一个~/.vim/after/ftplugin/html.vim 包含以下内容的文件:

setlocal shiftwidth=2
setlocal tabstop=2

这导致vim使用宽度为2个字符的制表符进行缩进(该noexpandtab选项在我的配置中全局设置)。

对此进行了描述:http : //vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4,向下滚动到文件类型插件部分。


229
您应该放进去~/.vim/after/ftplugin/html.vim。但是正如其他人在下面指出的那样,只需将添加autocmd FileType html setlocal shiftwidth=2 tabstop=2到中就更好了.vimrc
亚里斯多德·帕加尔兹

10
哎呀,实际上,/ is /是我拥有该文件的位置。我会解决问题的答案。不过,我不同意,我认为将不同文件类型的命令分成单独的文件会使一切变得容易得多,尤其是在您需要多种文件类型或某些文件类型有很多选项的情况下。
SpoonMeiser

3
实际上,没有很多理由将ftplugins使用after目录。Vim会在运行时路径中加载所有找到的文件,而不仅仅是语法文件中的第一个文件。
graywh

36
仅供参考:请勿将js用于javascript文件类型。请改用javascript。(autocmd FileType javascript setlocal shiftwidth=2 tabstop=2
Kiddo

13
您也需要添加filetype plugin on到vimrc中。
gatoatigrado 2014年

191

使用ftplugins或自动命令来设置选项。

ftplugin

~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

并且不要忘记将它们打开~/.vimrc

filetype plugin indent on

:h ftplugin有关更多信息)

自动命令

~/.vimrc

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

您可以代替任何的长命令或设置及其短版本:
autocmdau
setlocalsetl
shiftwidthsw
tabstopts
softtabstopsts
expandtabet

我也建议学习之间的差异tabstopsofttabstop。很多人不知道softtabstop


1
谢谢!也感谢您对“ ts”和“ sts”的关注。您是否有推荐的特定页面讨论这种差异以及如何使用它?
jvriesem 2013年

11
@jvriesem没什么大不了的:'ts'是标签字符的显示方式;“ sts”是按下Tab键时要插入的“空格”数;“ sw”是每个缩进级别使用多少个“空格”;“ et”是使用空格还是制表符;当在行首按Tab键时,可以使用“ sta”插入“ sw”“空格”。
graywh

10
我想知道,为了清楚起见,使用完整的表格是否比使用最后的简短句子更好。
icedwater

23
sw简称softwidthsts简称softtabstopet简称expandtabsetl简称setlocalau简称autocmd。您可以使用长格式代替短格式。
Flimm

13
我相信sw扩展到shiftwidth而不是softwidth
johncip '16

83

编辑~/.vimrc,并为不同的缩进添加不同的文件类型,例如,我希望html/rb缩进2个空格,js/coffee文件缩进4个空格:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

请参考:通过文件类型设置Vim空格首选项


对vimrc的评论是单一的":)
sdkks

@sdkks我不这么认为。双引号是注释,单引号'在我的所有Linux vim上都出错。(7.3+,8.0 ...)
沉思为申思维

是的 我的评论说使用单个",意味着不要用另一个关闭它"。不知道为什么我要评论。
sdkks

好吧,我误会了你。我虽然用单引号表示,'但并非"没有" @@@
沉思玮申思维

60

将基于文件后缀的autocmd命令放在〜/ .vimrc中

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

您正在寻找的命令可能是ts =和sw =


18
over by的优点是什么FileType
Casey Chow

3
有什么办法可以反转比赛?
SystemParadox 2012年

7
我在使文件类型与html文件一起使用时遇到了问题(因为.html文件不是真正的HTML,而是具有模板语言的模板HTML文件)。文件类型似乎无法将其识别为html,但是此方法可以。
Mark Hildreth 2013年

3
@digitxp-优点是当您使用的扩展名与定义的“ FileType”不匹配时。例如,在我的安装中,*。md表示Modula2的文件类型,而我正在使用它进行降价。我可以(a)更改默认的FileType设置(b)使用自定义配置更改文件类型设置,或者(c)在与(c)一起使用的1 .vimrc文件中使用此设置可以快速获得所需的内容。
pdwalker 2014年

值得指出的是-假设我对文档的快速阅读是正确的-您可以通过这种方式为每个文件类型添加多个命令,并确保它们以给定的顺序执行。
underscore_d 2015年

23

我通常使用expandtabset,但这对makefile不利。我最近补充说:

:autocmd FileType make set noexpandtab

到我的.vimrc文件的末尾,它会将Makefile,makefile和* .mk识别为makefile,并且不会展开选项卡。大概可以扩展它。


更好的选择是启用:filetype插件。Vim的默认值包括:setl noet,因此您甚至不需要在vimrc中使用该aucmd。
greywh

好。您能解释一下这样做的好处,以及这样做的意义吗?为什么文件类型插件比autocmd更好?什么时候应该使用autocmd?未使用?
乔纳森·勒夫勒

5
例如,Vim附带的文件类型插件将为makefile做有用的事情,例如“ setlocal noexpandtab”。自动命令vs ftplugins对于诸如shiftwidth之类的个人问题并不重要-这只是选择如何构建vim配置的方式。
graywh

17

就个人而言,我在.vimrc中使用以下设置:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
与某些公司一样,许多语言都有很长的约定。以NodeJS为例。制表符应为两个空格。头痛,而且很傻,但是很重要。
Paul Hazen 2012年

3
为什么选项卡在所有情况下都必须相同?对于配置文件,8个空格键可以正常工作,但是对于带有很多缩进的代码,2个空格键的管理要容易得多。然后有固定的约定:node.js应该有2个空格键,而python实际上在语法上对4个空格键无效。
felixphew

1
@felixphew Python可以正确使用任意数量的空格(甚至制表符),只要它在整个过程中保持相同即可。
詹姆斯

@DJMcMayhem你是对的-我应该说“强烈推荐”。
felixphew's

1
+1到内洛。制表符具有悠久的传统,即以8个字符的倍数跳转到下一个位置。这仅仅是因为人们希望使用制表符来表示“在我的语言中看起来不错的下一个缩进”,并且由于某些文本编辑器没有理会“添加制表符”和“添加缩进空格”之间的区别,因此人们调整了他们的编辑器,使其按自己的方式进行操作,使我们现在陷入混乱,使选项卡从不显示预期的方式。源代码是文本,文本的标准是8个字符的标签。
Florian F

6

这对于大多数人来说可能是众所周知的,但是无论如何(我第一次感到困惑):这样做:set et:setexpandtabs)不会更改文件中已经存在的选项卡,而必须这样做:retab。例如:

:set et
:retab

文件中的选项卡将被足够的空格替换。只需返回标签即可:

:set noet
:retab

4

今天,您可以尝试使用editorconfig,还有一个vim插件。这样,您不仅可以在vim中更改缩进大小,而且可以在许多其他编辑器中保持一致的编码样式。

下面是一个简单的editorconfig,如您所见,python文件将具有4个缩进空间,而pug模板文件将仅具有2个空间。

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

虽然您可以使用indent插件或手动使用设置来配置Vim的缩进,但我建议使用一个名为Vindect的python脚本,当您打开python文件时,该脚本会自动为您设置相关设置。使用此技巧可以使Vindect更加有效。当我第一次开始编辑由其他人使用各种缩进样式(制表符与空间和空格数)创建的python文件时,它令人难以置信。但是Vindect以及这个缩进文件

还建议:


2

对于使用的用户autocmd,最好将它们组合在一起。如果分组与文件类型检测有关,则可能会有以下内容:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

分组有助于保持.vimrc井井有条,尤其是在文件类型具有多个与其相关联的规则时。在上面的示例中,定义了专用于.c文件的注释快捷方式。

初始调用autocmd!告诉vim删除所述分组中的所有先前定义的自动命令。如果.vimrc再次获得定义,这将防止重复定义。有关:help augroup更多信息,请参见。


1

我使用用C语言编写的实用程序autotab。它分析您加载的文件的前几千行,并确定Vim参数的值shiftwidthtabstopexpandtab

例如,使用编译gcc -O autotab.c -o autotab。与Vim集成的说明在顶部的注释标题中。

Autotab相当聪明,但是可能会不时混淆,特别是使用不同的缩进样式不一致地对其进行维护时。

如果文件显然使用制表符或制表符和空格的组合来缩进,则Autotab将通过考虑诸如跨连续行的内部元素对齐之类的因素来确定正在使用的制表符大小,例如注释。

它适用于多种编程语言,并且宽恕了不遵循缩进增量的“带外”元素,例如C预处理指令,C语句标签,更不用说明显的空白行了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.