有人能简单地向我解释一下根据文件类型更改Vim缩进行为的最简单方法吗?例如,如果我打开一个Python文件,它应该缩进2个空格,但如果我打开Powershell脚本,它应该使用4个空格。
只要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,向下滚动到关于文件类型插件的部分。
使用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
我还建议学习tabstop
和softtabstop
之间的区别。很多人不知道softtabstop
。
编辑您的~/.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空白首选项
将基于文件后缀的autocmd命令放入~/.virc
autocmd BufRead,BufNewFile *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile *.pl syntax on
您要查找的命令可能是ts=和sw=
我通常使用expandtab
集,但这对makefile来说不好。我最近添加了:
:autocmd FileType make set noexpandtab
到我的.virc文件的末尾,它将Makefile、Makefile和*.mk识别为Makefile,并且不展开制表符。据推测,你可以扩展这一点。
就我个人而言,我在.virc:中使用这些设置
autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
这可能是我们大多数人都知道的,但无论如何(我第一次感到困惑):执行:set et
(:set
展开选项卡)不会更改文件中已存在的选项卡,必须执行:retab
。例如:
:set et
:retab
并且文件中的选项卡被足够的空间替换。要使选项卡返回,只需执行:
:set noet
:retab
今天,你可以尝试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
对于那些使用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
了解更多信息。
在Lua中(对于Neovim用户),您可以使用RUNTIMEPATH/ftplugin/*yourfiletype*.lua
和以下选项:
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
只要确保在引号中使用字符串值。例如:
vim.opt_local.foldmethod = 'marker'
虽然您可以使用缩进插件或手动使用设置来很好地配置Vim的缩进,但我建议您使用名为Vindect的python脚本,该脚本在打开python文件时会自动为您设置相关设置。使用此技巧可以使使用Vindect更加有效。当我第一次开始编辑其他人使用各种缩进样式(制表符与空格和空格数)创建的python文件时,我感到非常沮丧。但是Vindect和这个缩进文件
还建议:
- 蟒蛇助手
- python_match
- 蟒蛇_折叠
我使用了一个用C编写的名为autotab
的实用程序。它分析您加载的文件的前几千行,并确定Vim参数shiftwidth
、tabstop
和expandtab
的值。
这是使用例如gcc -O autotab.c -o autotab
编译的。与Vim集成的说明在顶部的注释标题中。
Autotab相当聪明,但有时会感到困惑,尤其是使用不同的缩进样式维护不一致。
如果文件明显使用制表符或制表符和空格的组合进行缩进,Autotab将通过考虑内部元素在连续行之间的对齐等因素(如注释)来确定使用的制表符大小。
它适用于各种编程语言,并且可以容忍不遵循缩进增量的"带外"元素,例如C预处理指令、C语句标签,更不用说明显的空行了。