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
  • Mac / Linux
    • LF = \n

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置換を行い
/\rCR を探し
//空文字に置き換え
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はなかなか挙動が難しい。
まあ、日記書くだけだし、あまり深入りしないでおこう。