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

问题描述 投票:0回答:12

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

file vim settings indentation
12个回答
351
投票

您可以添加

.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,向下滚动到有关文件类型插件的部分。


236
投票

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

ft插件

~/.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

我还建议学习

tabstop
softtabstop
之间的区别。很多人不知道
softtabstop


108
投票

编辑您的

~/.vimrc
并为不同的缩进添加不同的文件类型,例如我想要
html/rb
缩进两个空格,
js/coffee
文件缩进四个空格:

" 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 空白首选项


63
投票

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

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

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


28
投票

我通常使用

expandtab
集,但这对 makefile 不利。我最近添加:

:autocmd FileType make set noexpandtab

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


20
投票

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

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

7
投票

这可能是我们大多数人都知道的,但无论如何(我第一次很困惑): 执行

:set et
(
:set
Expandtabs) 不会更改文件中已存在的选项卡,必须执行
:retab
。 例如:

:set et
:retab

文件中的制表符被足够的空格替换。要恢复选项卡,只需执行以下操作:

:set noet
:retab

6
投票

今天,你可以尝试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

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
了解更多信息。


5
投票

在 Lua(对于 Neovim 用户)中,您可以使用

RUNTIMEPATH/ftplugin/*yourfiletype*.lua
以及以下选项:

vim.opt_local.shiftwidth  = 2
vim.opt_local.tabstop     = 2

请确保在引号中使用字符串值。例如:

vim.opt_local.foldmethod  = 'marker'

3
投票

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

还推荐:


2
投票

我使用一个用 C 语言编写的实用程序,名为

autotab
。它会分析您加载的文件的前几千行,并确定 Vim 参数
shiftwidth
tabstop
expandtab
的值。

这是使用例如

gcc -O autotab.c -o autotab
编译的。与 Vim 集成的说明位于顶部的评论标题中。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.