^M的前世今生
^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13。
回想计算机发展,旧的打字机使用两个字符来开始一个新行。首先是一个字符命令使打印头移回开始位置(回车),然后另一个字符命令控制向前进纸一行(进纸)。在计算机诞生之初,存储设备十分昂贵,于是有人就提出没有必要用两个字符来表示一行的结束。UNIX一族决定只用进纸一个字符来表示行尾,来自苹果阵营的人则把回车作为换行的标准,MS-DOS(和微软的Windows)仍然决定沿用古老的回车换行传统。这也意味着如果把文件从一个系统移到另一个不同的系统,你就会遇到与换行相关的问题。
有两种情况,会出现打开的文件都显示^M符号:
(1) vim被配置为fileformat=unix,而你打开的文件都是dos格式的。
(2)你的文本中既有unix的换行符,又有dos的换行符,那么vim会认为你打开的是unix的,所以,那些dos的换行符就会出现恼人的^M。
unix格式的换行符为0A(ascii码)也就是<LF>,dos格式的换行符为 0D 0A(也就是<CR><LF>),<CR>其实就显示为^M。另外:^L 是ascii 0x0C '\f', 换页控制符。
解决方法:
(1)若vim版本大于7.1,并想用dos显示和保存,如下语句::e ++ff=dos
(2)tr -d "\015" < myfile > myfile_new
(3)dos2unix file_name