zoukankan      html  css  js  c++  java
  • VIM从原理上认识^M问题

    问题背景

      VIM在打开文件的时候如果遇到两种换行符风格(dos与unix)共存的文件,通常会在行尾显示出烦人的^M。如果^M较少,比较容易定位到哪几行出了问题,但是如果^M较多,就很难搞。下面先给出解法,再来做分析。

    解决方案

    • ^M较少,需要定位哪几行包含^M,只需要在vim中输入:
    /
    
    • ^M较多,需要定位到哪几行不包含^M,只需要在vim中输入:
    /^(.*
    )@!.*

    原理解析

      要了解如何定位^M,首先得知道^M是如何产生的。要了解^M的产生原因,首先得了解VIM的fileformat——文件换行符风格。

    • 三种换行符风格
    换行符风格目前分了三种风格,分别是:
    • DOS-format:采用 换行,在vim中用"dos"表示,Windows系统默认风格
    • unix-format:采用 换行,在vim中用"unix"表示,unix派系系统默认风格
    • Mac-format:采用 换行,在vim中用"mac"表示,Mac系统默认风格

    想确定当前文件是被vim判断为哪种文件格式,可以在vim内输入“:set fileformat”,如果是unix风格,会在左下角的命令输入行显示如下:

    另外还可以用":set fileformats"查看当前配置的vim支持哪些换行符风格,如果能确定当前文件的格式不在可识别文件格式列表内,可以使用":set fileformats=unix,dos,mac"手动添加可识别格式。

    三种风格的历史由来感兴趣的同学可以自行百度,还是挺有意思的。

    • vim是如何判断文件的fileformat的
    • 如果所有行都是以 " " 也就是<CR><NL>结尾,'fileformat' 会被设置为 "dos"
    • 如果 "fileformats" 包含 "mac" 并且文件不含 " " 也就是 <NL> 字符,'fileformat' 会被设置为 "mac"
    • 以上两种情况之外的,会设置为 ‘unix’
    • ^M是如何产生的

    因为只有当文件所有行都是以 " " 结尾,能被识别为 "dos" 格式,所有当文件内 " " 风格和 " " 风格共存的时候,就会被标志为 "unix" 风格,而在unix风格中,只有 " " 被识别为换行,多余的 " " 就会用^M标识出来,^M其实就是 " " 在vim中的字符表述。所以在上文中用 " " 作为匹配字符串的时候,会匹配到 ^M,如下图所示

    • 匹配不包含^M的行
    匹配包含某个字符串的行非常的简单,但是匹配不包含某个字符串的行,就需要花费一番功夫了。具体可以参考这篇博文:http://blog.sina.com.cn/s/blog_9eccc8e50102wd7h.html。博主也是参考了这篇博文之后,才摸索出了上面的匹配不存在^M的行的写法。

    总结

      本次最大的收获是从原理上理解了vim是如何判断文件换行符风格的,在了解了原理之后,才能更清晰的认识到^M产生的原因,并且轻松找到应对方案。另外也掌握了vim里面匹配不存在行的技巧,这是一个非常有用的技巧。

  • 相关阅读:
    网络服务—VSFTP
    DHCP服务基本搭建
    zabbix使用钉钉告警
    差分数组
    最小点权覆盖集&最大点权独立集
    康托展开&康托逆展开 的写法
    可并堆(左偏树)简单学习
    树链剖分原理与应用
    后缀数组学习笔记
    HDU-3974 Assign the task题解报告【dfs序+线段树】
  • 原文地址:https://www.cnblogs.com/minglee/p/11772387.html
Copyright © 2011-2022 走看看