最近用vim编辑一些xml和html文件,在某些版本的VIM上出现了不能根据文件类型自动缩进的问题,经过多次试验摸索,总算是找到了症结所在,特此记录下来供大家参考。

1 vim 自动缩进原理

vim不依赖于插件的情况下也能支持几种简单的缩进,例如

:set cindent
:set smartindent
:set autoindent

这些缩进方式是与文件类型无关系的,对于程序员来说用处不大,毕竟向我这样的码农编辑的都是特定类型的文件,如C、C++源文件、html文件,php文件等。

这种于特定文件类型相关联的缩进叫做filetype indent,对于每一种文件类型都要有一个对应的插件文件来支持,例如:对于c源码,对应的缩进支持插件为

/usr/share/vim/vim74/indent/c.vim

对于php源码,对应的缩进支持插件为:

/usr/share/vim/vim74/indent/php.vim

VIM本身能够根据编辑的文件名字后缀来探测文件类型,例如VIM会把test.html探测确定为html文件类型。当然我们也可以手动为VIM指定当前编辑文件的类型:

:set filetype=html

这主要用于一些没有文件名后缀的文件。

默认情况下,VIM并不会自动根据文件类型来加载对于的缩进插件。需要如下命令开启自动加载功能:

:filetype indent on

打开这个开关后,VIM将会根据文件类型自动加载对应的缩进插件,从而用户就可以享受自动缩进功能了。

2 缩进失效的现象与分析

2.1 现象

今天新建立了一个名为test.xml的文件,但是在用vim编辑时却无法实现自动缩进。

之后通过命令确认vim正确的识别了文件类型:

输入 :set filetype
输出 filetype=xml

然后查看文件类型缩进开关是否打开:

输入 :filetype
输出 filetype detection:ON  plugin:ON  indent:OFF 

好像找到原因了,原来文件类型缩进开关没打开。马上使用如下命令开启之。

:filetype indent on  

然后再查看:

输入 :filetype
输出 filetype detection:ON  plugin:ON  indent:ON

这下确认了,文件类型缩进已经开启。

到目前为止,(1)文件类型已经识别;(2)文件类型缩进已经开启。然而不能自动缩进的问题仍然存在,没有丝毫改变。

2.2 分析

一开始还以为是版本的问题,后来在Linux和Mac上都进行了同样的试验,结果一样,均都是无法自动缩进。

剩下最后的办法了,看看缩进插件是否被VIM加载了。运行如下命令查看已经加载的插件:

输入 :scriptenames
输出1: /etc/vimrc2: /usr/share/vim/vim74/syntax/syntax.vim3: /usr/share/vim/vim74/syntax/synload.vim4: /usr/share/vim/vim74/syntax/syncolor.vim5: /usr/share/vim/vim74/filetype.vim6: /usr/share/vim/vim74/ftplugin.vim7: ~/.vimrc8: /usr/share/vim/vim74/plugin/getscriptPlugin.vim9: /usr/share/vim/vim74/plugin/gzip.vim10: /usr/share/vim/vim74/plugin/matchparen.vim11: /usr/share/vim/vim74/plugin/netrwPlugin.vim12: /usr/share/vim/vim74/plugin/rrhelper.vim13: /usr/share/vim/vim74/plugin/spellfile.vim14: /usr/share/vim/vim74/plugin/tarPlugin.vim15: /usr/share/vim/vim74/plugin/tohtml.vim16: /usr/share/vim/vim74/plugin/vimballPlugin.vim17: /usr/share/vim/vim74/plugin/zipPlugin.vim18: /usr/share/vim/vim74/syntax/xml.vim19: /usr/share/vim/vim74/syntax/dtd.vim20: /usr/share/vim/vim74/ftplugin/xml.vim21: /usr/share/vim/vim74/indent.vim

可见,并没有找到xml的缩进插件 /usr/share/vim/vim74/indent/xml.vim。难道没有这个文件?通过文件系统查看这个插件文件确实存在,只是VIM并没有加载它。

这就奇怪了,VIM为什么不加载它呢?难道是VIM的BUG?非也!通过实验发现,filetype indent on 这个命令只能打开文件类型缩进开关,并不能触发VIM去加载对应的缩进插件。 只有VIM在识别文件类型时,才能触发加载此插件,而实际的过程中,VIM在识别xml文件类型时,filetype indent 是关闭的,所以那个时候没有加载缩进插件。当后来 filetype indent on 开启时,VIM并不会重新去识别文件类型,也就没有加载缩进插件。

知道了这个原因,我们就可以手动让VIM重新去识别文件类型,从而触发加载缩进插件的动作。

:set filetype=xml

试验发现,此时VIM仍然不会去加载缩进插件,因为之前VIM已经识别成了XML类型,上述命令并没有改变它,所以VIM不会有任何动作。

总而言之,VIM加载文件类型缩进插件的条件是:在VIM识别文件类型动作之前,filetype indent 必须已经处于 on 状态。

3 解决方法

知道了原因,解决起来就非常简单了。有两种方式来解决这个问题:
(1)把 filetype indent on 这个命令加入 /etc/vimrc 启动配置文件,因为VIM会首先加载这个文件,然后才会去识别文件类型,所以能保证识别文件类型之前已经把filetype indent 置于 on。
(2)执行如下命令,强迫VIM重新识别文件类型。

:set filetype=php
:set filetype=xml

或者

:filetype detect

首先把文件类型强制改为php,然后再改回xml,这样文件类型就发生了变化,从而导致VIM重新识别,进而加载缩进插件。

此时,再查看VIM已经加载的插件,发现xml缩进插件确实已经被加载:

输入 :scriptenames
输出1: /etc/vimrc2: /usr/share/vim/vim74/syntax/syntax.vim3: /usr/share/vim/vim74/syntax/synload.vim4: /usr/share/vim/vim74/syntax/syncolor.vim5: /usr/share/vim/vim74/filetype.vim6: /usr/share/vim/vim74/ftplugin.vim7: ~/.vimrc8: /usr/share/vim/vim74/plugin/getscriptPlugin.vim9: /usr/share/vim/vim74/plugin/gzip.vim10: /usr/share/vim/vim74/plugin/matchparen.vim11: /usr/share/vim/vim74/plugin/netrwPlugin.vim12: /usr/share/vim/vim74/plugin/rrhelper.vim13: /usr/share/vim/vim74/plugin/spellfile.vim14: /usr/share/vim/vim74/plugin/tarPlugin.vim15: /usr/share/vim/vim74/plugin/tohtml.vim16: /usr/share/vim/vim74/plugin/vimballPlugin.vim17: /usr/share/vim/vim74/plugin/zipPlugin.vim18: /usr/share/vim/vim74/syntax/xml.vim19: /usr/share/vim/vim74/syntax/dtd.vim20: /usr/share/vim/vim74/ftplugin/xml.vim21: /usr/share/vim/vim74/indent.vim22: /usr/share/vim/vim74/indent/xml.vim

当然,xml缩进功能也非常正常了。

关于VIM自动缩进失效(filetype indent on无效)的详细分析相关推荐

  1. linux怎么设置自动缩进,配置Linux下vim自动缩进等功能

    从终端打开配置文件: vim ~/.vimrc 添加如下代码: set tabstop=4 set softtabstop=4 set shiftwidth=4 set autoindent set ...

  2. linux vim 配置文件(高亮+自动缩进+行号+折叠+优化)

    点评:将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份) "==================== ...

  3. vim 配置文件 ,高亮+自动缩进+行号+折叠+优化

    vim 配置文件 ,高亮+自动缩进+行号+折叠+优化 http://apps.hi.baidu.com/share/detail/31767352 将一下代码copy到 用户目录下 新建文件为  .v ...

  4. Tab键== 4个空格并在Vim中的花括号后自动缩进

    我如何制作vi - Vim从不使用制表符(将空格转换为制表符,不好!),制作Tab键== 4个空格,并在像Emacs这样的大括号块之后自动缩进代码? 另外,如何保存这些设置,以便我再也不必输入它们? ...

  5. vim显示行号、语法高亮、自动缩进的设置

    在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc  在Fedora中vim的配置文件存放在/etc目录中,配置文件名为vimrc 在Red Hat Linux 中v ...

  6. vi/vim粘贴代码自动缩进导致全乱了

    用vim打开一个空白文档,然后把已经复制的代码给粘贴进来,发现它有自动缩进功能,最终导致粘贴的文本一行比一行靠右,看起来乱成一团.比较快的解决办法是,在粘贴文档前,在命令行模式下,输入 :set no ...

  7. 设置vim语法高亮显示和自动缩进

    1.配置文件的位置 在目录/etc/下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效,而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:".vim ...

  8. ubuntu设置vim语法高亮显示和自动缩进

    今天自己学习使用vim,当我在vim中输入程序时,默认的显示以及缩进等都和平时自己的习惯不一致,所以就上网查找了相关的资料.以下是我在设置时所用的指导资料. 1.安装vim        sudo a ...

  9. vim粘贴时错位、自动缩进问题

    大家应该有类似的困扰vim粘贴时有错位.自动缩进问题: 下面介绍解决办法 vim 复制粘帖出现错位.自动缩进 问题的解决办法: 1.先进入paste模式: :set paste 2.再按键 i 进入插 ...

最新文章

  1. python list的复制
  2. 开发日记-20190507 关键词 java通过id直接操作视图
  3. linux中export与source的作用
  4. ndk学习19: 使用Eclipse调试so
  5. python工作方法_用python开始一天工作
  6. Rotate String
  7. 树莓派Raspberry Pi OS开机自启动脚本
  8. curl post file PHP
  9. 深度学习经典论文翻译合集Deep Learning Papers Translation(CV)
  10. Android热修复核心原理介绍
  11. 同步捕获matlab,基于多匹配滤波器的跳码直扩同步捕获方法与流程
  12. Android Socket 编程(WIFI 和 ADB)
  13. 共模电感的工作原理及选型
  14. 杭州电子科技大学acm--2018
  15. 带有鸿蒙logo的壁纸,鸿蒙OS Logo曝光
  16. 蓝牙耳机买什么品牌好一些?2022蓝牙耳机品牌排行榜10强
  17. 七星配资爆量强上攻创业板大阳
  18. 外卖CPS小程序推广系统外卖侠探探外卖优惠券源码开后台及搭建一条龙
  19. 1分钟部署单机版kubernetes 1.13.4
  20. 服务器 虚拟机版本,VMWARE-版本比较各版本区别

热门文章

  1. 蓝叠模拟器国际版( bluestacks国际版)介绍 | bluestacks国际版与国内版区别
  2. 新版iTunes Connect如何删除一个已上传的built。重新上传
  3. PHP中在公用PHP文件中使用相对路径的正确方法
  4. win10备份为wim_Winclone Pro 8 for Mac(Windows分区备份还原工具)
  5. 基于android开发的日历,基于android开发的日历APP设计.doc
  6. php与mysql 圣经_今天买了本传说中的PHP圣经-PHP和MySQL Web开发
  7. 生日应该过农历还是公历?
  8. h264 rtp FU-A
  9. NC信息交换平台外部接口写入单据
  10. 狼人杀凉了,贴着AI标签的剧本杀如何构建自己的商业版图