Vim で s/n/n/g 会导致文件的换行全部被替换成 ^@ 字符,按照通常的理解,s/n/n/g 不应该有任何的效果,但在 Vim 中,n を使用する場合は、扱いが少し異なります。
:NL で使用される NUL をヘルプします
[<Nul>](http://vimdoc.sourceforge.net/htmldoc...) characters in the file are stored as [<NL>](http://vimdoc.sourceforge.net/htmldoc...) in memory. In the display they are shown as "^@". The translation is done when reading and writing files. To match a [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) with a search pattern you can just enter [CTRL-@](http://www.vim.org/htmldoc/insert.htm...) or "[CTRL-V](http://www.vim.org/htmldoc/insert.htm...) 000". This is probably just what you expect. Internally the character is replaced with a [<NL>](http://vimdoc.sourceforge.net/htmldoc...) in the search pattern. What is unusual is that typing [CTRL-V](http://www.vim.org/htmldoc/insert.htm...) [CTRL-J](http://www.vim.org/htmldoc/insert.htm...) also inserts a [<NL>](http://vimdoc.sourceforge.net/htmldoc...), thus also searches for a [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) in the file. {Vi cannot handle [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) 文字がファイル内にあります}
以前noteに書きましたが、公開されていなかったので参考にさせていただきます。
(原文はマークダウン形式であり、SFでは完全にはサポートされていませんが、読むには影響ありません)
メモテキストVimの改行問題
===============
Vim で
s/n/n/g
会导致文件的换行全部被替换成^@
字符,按照通常的理解,s/n/n/g
不应该有任何的效果,但在 Vim 中,n
を使用する場合は、扱いが少し異なります。:NL で使用される NUL をヘルプします
この説明から、Vim では空文字
<Nul>
(ASCII 0)在内存中是作为<NL>
(改行) が処理されることが分かります。'n' は検索式内の文字列と一致するため、
<Nul>
字符。在替换表达式中 'n' 会被解释为<NL>
,于是在内部,<Nul>
会被输入,所以在替换的表达式中 'n' 不再表示 'new line' 或者 'end-of-line'。同样,在搜索表达式中,输入 "CTRL-@" 或者 "CTRL-V 000" 表示<Nul>
字符,但是在内部,他们还是都被替换为<NL>
进行处理的,这也就是为什么直接键入 CTRL-V CTRL-J(输入的是<NL>
文字自体ではなく、リテラルの '改行' 文字列が一致します)。これは同じ効果があります。混乱の理由は、おそらく Vi が
<Nul>
字符,而 Vim 由 Vi 发展而来,作者可能为了方便,直接使用了<NL>
用来表示<Nul>
,这也就是 'NL-used-for-Nul' 的字面意思。与此同时,<NL>
原本的作用则使用<CR>
を置換としてサポートしていないためだと思います。これは、文字通りの意味では「CR-used-for-NL」です。:NL で使用される CR のヘルプ
(dos)を置換式でどのように表現すればよいのでしょうか。<NL>
呢?答案就是<CR>
,可以使用 CRTL-V CRTL-M(输入的是<CR>
字符本身) 或者 'r',Vim 并不会在文件中直接输入<CR>
字符,它会根据当前 ‘fileformat’ 的设置来决定使用<CR>
(Mac),<NL>
(*nix) 还是<CR><NL>
参考資料