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

EBG*_*een 364 vim settings file indentation

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

Spo*_*ser 289

.vim只要vim切换到特定文件类型,您就可以添加要执行的文件.

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

setlocal shiftwidth=2
setlocal tabstop=2
Run Code Online (Sandbox Code Playgroud)

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

这里描述:http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4,向下滚动到filetype插件部分.

  • 你应该把它放在`〜/ .vim/after/ftplugin/html.vim`中.但正如其他人在下面指出的那样,将`autocmd FileType html setlocal shiftwidth = 2 tabstop = 2`添加到你的`.vimrc`会好得多. (218认同)
  • 仅供参考:不要将js用于javascript文件类型.请改用javascript.(`autocmd FileType javascript setlocal shiftwidth = 2 tabstop = 2`) (35认同)
  • 你需要在你的vimrc上添加`filetype plugin on`. (10认同)
  • 哎呀,实际上,那是/我/那里有那个文件.我会解决问题.我不同意,但我认为将不同文件类型的命令分离成单独的文件会使一切变得更加容易,特别是如果您有许多文件类型的要求,或者某些文件类型的许多选项. (9认同)
  • 实际上,没有太多理由为ftplugins使用after目录.Vim将加载它在运行时路径中找到的所有内容,而不仅仅是语法文件中的第一个. (3认同)
  • @zardilior 使用 `typescript` 文件类型。使用`:set filetype?`命令可以显示当前打开文件的文件类型。 (2认同)

gra*_*ywh 166

使用ftplugins或autocommands设置选项.

文件类型插件

~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab
Run Code Online (Sandbox Code Playgroud)

别忘了打开它们~/.vimrc:

filetype plugin indent on
Run Code Online (Sandbox Code Playgroud)

(:h ftplugin了解更多信息)

自动命令

~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab
Run Code Online (Sandbox Code Playgroud)

你可以用它们的短版本替换任何长命令或设置:
autocmd:au
setlocal:setl
shiftwidth:sw
tabstop:ts
softtabstop:sts
expandtab:et

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

  • `sw`是`softwidth`的缩写,`sts`是`softtabstop`的缩写,`et`是`expandtab`的缩写,`setl`是`setlocal`的缩写,`au`是`autocmd的缩写.您可以使用长格式而不是短格式. (23认同)
  • 我相信`sw`扩展到`shiftwidth`而不是`softwidth`. (12认同)
  • @jvriesem没有太多内容:'ts'是制表符的显示方式; 'sts'是按Tab键时要插入的"空格"数; 'sw'是每个缩进级别使用多少"空格"; 'et'是使用空格还是标签; 'sta'允许您在按行的开头按Tab键时插入'sw'"空格". (11认同)
  • 我想知道为了清楚起见,完整的表格是否会更好用,而不是最后的简短句子. (10认同)

Siw*_*申思维 80

编辑你的~/.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
Run Code Online (Sandbox Code Playgroud)

参考:按文件类型设置Vim空白首选项


Pau*_*lin 59

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

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on
Run Code Online (Sandbox Code Playgroud)

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

  • "FileType"有什么优势呢? (17认同)
  • 我在使用文件类型来处理html文件时遇到了问题(因为.html文件实际上不是HTML,而是带有模板语言的模板HTML文件).Filetypes似乎并不认为它是html,但这种方法会. (6认同)
  • 有没有办法颠倒比赛? (3认同)
  • @digitxp-优点是当您使用的扩展名与定义的“ FileType”不匹配时。例如,在我的安装中,*。md表示Modula2的文件类型,而我正在使用它进行降价。我可以(a)更改默认的FileType设置(b)使用自定义配置更改文件类型设置,或者(c)在与(c)一起使用的1 .vimrc文件中使用此设置可以快速获得所需的内容。 (2认同)

Jon*_*ler 23

我通常使用expandtabset,但这对makefile来说很糟糕.我最近补充说:

:autocmd FileType make set noexpandtab
Run Code Online (Sandbox Code Playgroud)

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

  • 例如,Vim附带的文件类型插件将为makefile等"setlocal noexpandtab"提供有用的功能.对于诸如shiftwidth之类的个人事物,自动命令与ftplugins并不重要 - 这就是你选择构建你的vim配置的方式. (5认同)
  • 好的。您能解释一下这样做的好处以及这样做涉及到什么吗?为什么文件类型插件比 autocmd 更好?什么时候应该使用autocmd?不曾用过? (2认同)

小智 15

我总是对那些为不同文件类型更改选项卡大小的人感到惊讶.当您使用较少的文件查看文件时,您到底做了什么?

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

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Run Code Online (Sandbox Code Playgroud)

  • 与某些公司一样,许多语言都有很长的惯例.以NodeJS为例.标签应该是两个空格.头痛,很傻,但很重要. (22认同)
  • @felixphew 只要在整个过程中保持不变,Python 对于任意数量的空格(甚至制表符)都是完全正确的。 (4认同)
  • 为什么选项卡必须在所有情况下都相同?对于配置文件,8个空格选项卡可以正常工作,但对于具有大量缩进的代码,2更容易管理.然后有固定的约定:node.js应该有2个空格选项卡,而python实际上在语法上无效,除了4个空格选项卡之外的任何其他选项. (3认同)

Jua*_*nus 6

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

:set et
:retab
Run Code Online (Sandbox Code Playgroud)

并且文件中的选项卡被足够的空格替换.要让标签返回,只需:

:set noet
:retab
Run Code Online (Sandbox Code Playgroud)


che*_*gbo 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
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

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

对 的初始调用autocmd!告诉 vim 删除所述分组中任何先前定义的自动命令。如果.vimrc再次来源,这将防止重复定义。查看:help augroup更多信息。


Dzi*_*ars 5

在 Lua(对于 Neovim 用户)中,您可以使用RUNTIMEPATH/ftplugin/*yourfiletype*.lua以下选项:

vim.opt_local.shiftwidth  = 2
vim.opt_local.tabstop     = 2
Run Code Online (Sandbox Code Playgroud)

请务必在引号中使用字符串值。例如:

vim.opt_local.foldmethod  = 'marker'
Run Code Online (Sandbox Code Playgroud)