Vim:\ n与\ r

我有一段时间没有在Unix系统中使用vim,但是我记得没有\ r,它总是\ n。

我在Windows下使用gVim,当我search新行字符时,我使用\ n。 search\ r不返回任何内容。 但是当我replace字符时,我必须使用\ r's。 \ n的给我^ @

任何人都可以解释这里发生了什么?

查找:

:set fileformat=unix :set fileformat=dos 

这可以在任一平台上用于切换到其他编码。

看起来你在问两件事。 其中一个问题是\r\n其他人已经涉及的问题。

另一个问题是\n在替换的右侧。 如果你看一下:hs/\n ,它表示在替换的替换部分插入一个<NUL> / <NL> ,而不是一个换行符。

如果您执行了:%s/\n/\n/并保存并在十六进制编辑器中打开该文件,则所有^@字符都是ASCII 0(NUL字符)。 为什么Vim开发人员在左边使用\n作为行尾, \n在右边使用NUL就是超越了我。 但是这个特殊的行为与Windows和Unix没有任何关系。

在后台,Vim使用\ r(回车符)来保存行结束符(无论文件格式如何,只在读取或写入文件时才起作用)。 Vim使用\ n来表示NUL。 但是,您搜索EOL为\ n,但在替换中,\ n代表NUL。 这在下面解释:h sub-replace-sepcial。 搜索\ r将找到不属于fileformat的EOL的回车符。 h文件格式有很长的解释。

vim对回车符(\ r)和换行符(\ n)做了一些修改。 例如,如果你使用的是Unix,并且vi显示了以'^ M'结尾的行,因为它们是Windows文本文件,那么简单的方法就是输入命令

 :%s/^V^M/^V^M/g 

它看起来不应该做任何事情,但它确实。

 :%s/^V^M/^V^M/g 

同样的,下面也做了同样的事情(我认为),并且更容易输出。

 :%s/\r/\r/g 

我认为问题可能在于Windows和Unix做新行。 Unix的格式是\ n(换行),但对于Windows而言,它是\ r \ n(回车,换行)。

在unix下,在vim里, ^V + <enter>给我一个^M这个\r字符。

另外,你不能在vim里找到\r ,除非你告诉它以二进制模式编辑文件,也就是说,不使用自动检测行结束的默认自动模式。 (它应该在状态中打印[dos] 。)

在Windows中,如果以文本模式打开文件,\ n将被解释为换行符和换行符。 这通常不是* nix系统的情况。