我有一段时间没有在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系统的情况。