【问题标题】:Changing Vim indentation behavior by file type按文件类型更改 Vim 缩进行为
【发布时间】:2010-09-14 14:39:05
【问题描述】:

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

【问题讨论】:

标签: file vim settings indentation


【解决方案1】:

根据文件后缀在你的~/.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 文件中使用此设置快速获得我想要的内容。
  • 值得指出的是-假设我对文档的快速阅读是正确的-您可以通过这种方式为每个文件类型添加多个命令,并且保证按照给定的顺序执行它们.
【解决方案2】:

我通常使用expandtab 设置,但这对makefile 不利。我最近添加了:

:autocmd FileType make set noexpandtab

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

【讨论】:

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

使用 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
expandtab:et

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

【讨论】:

  • 谢谢!还要感谢关于“ts”和“sts”的那一点。您是否推荐任何特定页面来讨论这种差异以及如何使用它?
  • @jvriesem 没什么大不了的:'ts' 是制表符的显示方式; 'sts' 是按下制表键时要插入多少个“空格”; 'sw' 是每个缩进级别使用多少个“空格”; 'et' 是使用空格还是制表符; 'sta' 允许您在行首按制表符时插入 'sw' “空格”。
  • 为了清楚起见,我想知道完整的表格是否会更好,而不是结尾的简短句子。
  • swsoftwidth 的缩写,stssofttabstop 的缩写,etexpandtab 的缩写,setlsetlocal 的缩写,@ 987654357@ 是autocmd 的缩写。您可以使用长格式而不是短格式。
  • 我相信 sw 扩展为 shiftwidth 而不是 softwidth
【解决方案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,向下滚动到文件类型插件部分。

【讨论】:

  • 你应该把它放在~/.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中。
【解决方案5】:

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

也推荐:

【讨论】:

    【解决方案6】:

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

    :set et
    :retab
    

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

    :set noet
    :retab
    

    【讨论】:

      【解决方案7】:

      就我个人而言,我在 .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 个字符的制表符。
      【解决方案8】:

      编辑您的~/.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的评论是单" :)
      • 是的。我的评论说使用单个",这意味着不要用另一个" 关闭它。不知道为什么我会这样评论。
      【解决方案9】:

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

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

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

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

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

      【讨论】:

        【解决方案10】:

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

        【讨论】:

        • 这是否会覆盖用户配置设置的选项卡设置或运行时(或)其他插件提供的缩进?
        【解决方案11】:

        对于使用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 了解更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多