WindowsからWSLのNeovimに文章をコピペするとMや^Mが表示されることがある。
これは Windows と Unix 系(WSL / Linux / macOS)の改行コードの違いが原因。
見えているMや^Mは「見えないはずの制御文字が可視化されている」状態。
1. CRLF と LF の違い
\r= CR(Carriage Return)\n= LF(Line Feed)
改行コードの種類
- Windows
- CRLF =
\r\n
- CRLF =
- Mac / Linux
- LF =
\n
- LF =
2. Mや^Mの正体
なぜMや^Mになるのか
\r(CR)は 制御文字- Neovim / Vim は制御文字を
^表記で可視化する
\r = ASCII 13
= Ctrl + M
= ^M
末尾に見える^M
Windows由来の CR (\r) が残っている
表示上Mに見えるケース
フォントや listchars 設定の関係で^Mが潰れてMに見えるだけ(中身は同じ\r)
3. Neovimで消す方法
ファイル全体から、CR(\r)という文字を全部削除するコマンド
:%s/\r//g
%: 範囲指定s: substitute = 置換/\r: 検索パターン//: 置換後の文字が空g: globalフラグ- これがないと、各行につき1個だけしか置換されない
gをつけると、行内にある すべての一致を置換
全部つなげると
:
% → 全行に対して
s → 置換を行い
/\r → CR を探し
// → 空文字に置き換え
g → 行内のすべてを対象にする
構文的にはこう
:s/{pattern}/{replacement}/{flags}
4. fileformat=unixでは消えない
WSLで作成したファイルに、Windowsからコピペしたら、
:set fileformat=unix
では^Mは消えない。
:set fileformat=unixは、ファイルの改行ルールを指定するだけ。
すでに中に入り込んだ\rは、これじゃ消えない。
Windowsからコピペした時点で、\rがただの文字として混入しているから。
だから、:%s/\r//gで消す必要がある。
:set fileformat=unixは、ファイルの改行コードを変える。
でも、本文に混ざったCRは掃除できない。
fileformatを確認するには?
:set fileformat?
私の場合は、WSLでファイルを作成しても、fileformat=dosになってる。
うーむ、WSLはなかなか挙動が難しい。
まあ、日記書くだけだし、あまり深入りしないでおこう。