417

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

4

11 回答 11

330

您可以添加.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,向下滚动到文件类型插件部分。

于 2008-10-01T18:37:48.037 回答
217

使用 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

您可以将任何长命令或设置替换为其短版本:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop:sts
expandtabet

tabstop我还建议学习和之间的区别softtabstop。很多人都不知道softtabstop

于 2008-10-01T18:37:42.093 回答
96

编辑您的~/.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 空白首选项

于 2015-05-08T00:49:59.833 回答
63

根据 ~/.vimrc 中的文件后缀放置 autocmd 命令

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

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

于 2008-10-01T18:21:31.070 回答
26

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

:autocmd FileType make set noexpandtab

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

于 2008-10-01T18:23:34.653 回答
19

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

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
于 2012-05-03T11:49:50.897 回答
6

这可能我们大多数人都知道,但无论如何(我第一次感到困惑):做:set et:setexpandtabs)不会更改文件中已经存在的选项卡,一个必须做的事情:retab。例如:

:set et
:retab

并且文件中的制表符被足够的空格替换。要返回标签,只需执行以下操作:

:set noet
:retab
于 2012-03-17T19:52:58.183 回答
5

对于那些使用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更多信息,请参阅。

于 2020-02-29T22:14:55.520 回答
4

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

下面是一个简单的编辑器配置,如您所见,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
于 2017-06-02T23:15:51.583 回答
3

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

还推荐:

于 2009-05-14T20:50:48.487 回答
1

我使用了一个我用 C 语言编写的实用程序,名为autotab. 它分析您加载的文件的前几千行并确定 Vim 参数的值shiftwidthtabstop以及expandtab.

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

Autotab 相当聪明,但有时会让人感到困惑,特别是使用不同的缩进样式进行不一致的维护。

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

它适用于各种编程语言,并且可以容忍不服从缩进增量的“带外”元素,例如 C 预处理指令、C 语句标签,更不用说明显的空行了。

于 2015-12-05T02:22:17.153 回答