ChatGPT解决这个技术问题 Extra ChatGPT

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

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

顺便说一句 - Python 的 PEP8 约定说制表位应该是 4 个空格,制表符应该是 4 个空格。参考:stackoverflow.com/questions/120926/…

S
SpoonMeiser

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


你应该把它放在 ~/.vim/after/ftplugin/html.vim 中。但正如其他人在下面指出的那样,将 autocmd FileType html setlocal shiftwidth=2 tabstop=2 添加到您的 .vimrc 会更好。
哎呀,实际上,那个 /is/ 我有那个文件的地方。我会修复答案。不过我不同意,我认为将不同文件类型的命令分离到单独的文件中会使一切变得容易得多,特别是如果您对许多文件类型有要求,或者对某些文件类型有很多选项。
实际上,没有太多理由为 ftplugins 使用 after 目录。 Vim 将加载它在你的运行时路径中找到的所有它们,而不仅仅是语法文件的第一个。
仅供参考:不要将 js 用于 javascript 文件类型。改用javascript。 (autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
您还需要将 filetype plugin on 添加到您的 vimrc。
g
graywh

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

我还建议了解 tabstopsofttabstop 之间的区别。很多人不知道softtabstop


谢谢!还要感谢关于“ts”和“sts”的那一点。您是否推荐任何特定页面来讨论这种差异以及如何使用它?
@jvriesem 没什么:'ts' 是制表符的显示方式; 'sts' 是按下制表键时要插入多少个“空格”; 'sw' 是每个缩进级别使用多少个“空格”; 'et' 是使用空格还是制表符; 'sta' 允许您在行首按制表符时插入 'sw' “空格”。
为了清楚起见,我想知道完整的表格是否会更好,而不是最后的简短句子。
swsoftwidth 的缩写,stssofttabstop 的缩写,etexpandtab 的缩写,setlsetlocal 的缩写,auautocmd 的缩写.您可以使用长格式而不是短格式。
我相信 sw 扩展到 shiftwidth 而不是 softwidth
r
ryche

编辑您的 ~/.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

参考:Setting Vim whitespace preferences by filetype


vimrc 的注释是单个 " :)
是的。我的评论说使用单个 ",这意味着不要用另一个 " 关闭它。不知道为什么我这么评论。
P
Paul Tomblin

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

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

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


这比 FileType 有什么优势?
有什么办法可以逆转比赛吗?
我在让文件类型与 html 文件一起使用时遇到了问题(因为 .html 文件并不是真正的 HTML,而是带有模板语言的模板 HTML 文件)。 Filetypes 似乎无法将其识别为 html,但此方法可以。
@digitxp - 优点是您使用的扩展名与定义的“文件类型”不匹配。例如,在我的安装中,*.md 表示 Modula2 的文件类型,而我将它用于降价。我可以 (a) 更改默认 FileType 设置 (b) 使用自定义配置更改文件类型设置,或者 (c) 在我使用 (c) 的 1 .vimrc 文件中使用此设置快速获取我想要的内容。
值得指出的是 - 假设我对文档的快速阅读是正确的 - 您可以通过这种方式为每个文件类型添加多个命令,并且保证按照给定的顺序执行它们。
J
Jonathan Leffler

我通常使用 expandtab 集,但这对生成文件不利。我最近补充说:

:autocmd FileType make set noexpandtab

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


更好的选择是启用 :filetype 插件。 Vim 的默认选项包括 :setl noet,因此您甚至不需要在 vimrc 中使用该 aucmd。
好的。你能解释一下这样做的好处,以及这样做涉及到什么吗?为什么文件类型插件比 autocmd 更好?什么时候应该使用 autocmd?不曾用过?
Vim 附带的文件类型插件会做一些有用的事情,例如对 makefile 的“setlocal noexpandtab”。对于像 shiftwidth 这样的个人事物,自动命令与 ftplugins 无关紧要——这只是您选择构建 vim 配置的方式。
m
miken32

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

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

许多语言早已建立了惯例,某些公司也是如此。以 NodeJS 为例。制表符应该是两个空格。头痛,而且很傻,但很重要。
为什么选项卡在所有情况下都必须相同?对于配置文件,8 个空格制表符可以正常工作,但对于有很多缩进的代码,2 个更容易管理。然后有固定的约定:node.js 应该有 2 个空格制表符,而 python 实际上在语法上对于 4 个空格制表符以外的任何内容都是无效的。
@felixphew Python 对于任意数量的空格(甚至制表符)都是完全正确的,只要它在整个过程中保持不变。
@DJMcMayhem 你是对的 - 我应该说“强烈推荐”。
+1 给尼洛。制表符具有悠久的传统,即以 8 个字符的倍数跳转到下一个位置。这只是因为人们想使用制表符来表示“下一个在我的语言中看起来不错的缩进”,并且因为一些文本编辑器并没有费心区分“添加制表符”和“添加空格进行缩进”,而人们调整了他们的编辑器以使其按自己的方式进行,我们现在遇到了这样的混乱,其中选项卡永远不会显示预期的方式。源代码是文本,文本的标准是 8 个字符的制表符。
N
Neysor

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

:set et
:retab

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

:set noet
:retab

6
67hz

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


c
chengbo

今天,你可以试试editorconfig,还有一个vim plugin。有了这个,您不仅可以在 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

这是否会覆盖用户配置设置的选项卡设置或运行时(或)其他插件提供的缩进?
a
aymericbeaumet

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

还推荐:

蟒蛇助手

python_match

python_ifold


D
Dzintars

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

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

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

vim.opt_local.foldmethod  = 'marker'

K
Kaz

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

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

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

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

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