2022-06-08

Vimの改行コードの設定見直し

Vimの文字エンコーディングの設定を見直しているときに、改行コードについてもドキュメントなどから目に触れる機会が多かったのでついでに見直した雑な記録です。

3つの改行コード

以下は前提知識として抑えておきます。色々な記事で説明されていますのでざっくりと。

改行コード vim上での表現
LF(Line Feed) unix 主にUNIX系のシステムで用いられる. 16進数で0a
CR(Carriage Return) mac 主に古いmacOS系で用いられる. 16進数で0d
CR+LF dos 主にWindows系で用いられる

fileformats の設定

Vimは改行コードを一定自動的に判別してエディタ上に表示してくれます。

この設定は fileformats というオプションで制御できます。私は明示的に設定していなかったのですが、:set fileformats? コマンドで確認したところ fileformats=unix,dos となっていました。ドキュメントによると、macOSでのデフォルト値のようです。

つまり、LFとCR+LFについてはVimが自動で判別してくれるという状態のようですね。

※ このオプションの詳細は https://vim-jp.org/vimdoc-ja/options.html#'fileformats' をご確認ください。

実際に試す : それぞれの改行コードのファイルをVimで開いてみる

まず unix.txt という名称で以下の内容のファイルを作ります。

Hello
World

私の環境は比較的新しいmacOS環境なので、作成したファイルの改行コードは LF になります。これは nkf コマンド等で確認できます。

$ nkf --guess unix.txt
ASCII (LF)

次に、このファイルを基にして mac.txt(CR)windows.txt(CR+LF) という改行コードがそれぞれ異なるファイルを作成します。改行コードの変換には再び nkf を用います。

$ nkf -Lm unix.txt > mac.txt
$ nkf -Lw unix.txt > windows.txt

これで、以下3つのファイルができました。

$ nkf --guess unix.txt mac.txt windows.txt
unix.txt: ASCII (LF)
mac.txt: ASCII (CR)
windows.txt: ASCII (CRLF)

ちなみに、odコマンドを使うとファイルの中身をバイト単位で確認できてより実感が湧きます。
LFは \n 、CRは \r 、CR+LFは \r\n で表現されていますね。

$ od -tx1c unix.txt
0000000    48  65  6c  6c  6f  0a  57  6f  72  6c  64  0a
           H   e   l   l   o  \n   W   o   r   l   d  \n
0000014

$ od -tx1c mac.txt
0000000    48  65  6c  6c  6f  0d  57  6f  72  6c  64  0d
           H   e   l   l   o  \r   W   o   r   l   d  \r
0000014

$ od -tx1c windows.txt
0000000    48  65  6c  6c  6f  0d  0a  57  6f  72  6c  64  0d  0a
           H   e   l   l   o  \r  \n   W   o   r   l   d  \r  \n
0000016

以下は、それぞれのファイルをVimで開いたときの結果です。

unix.txt
unix.txt
mac.txt
mac.txt
windows.txt
windows.txt

fileformatsunix,dos となっていたので、改行コードがCRのmac.txtは ^M というおかしな表示になっていますね。期待通りの結果と言えます。

画像は割愛しますが、fileformats の設定を unix,dos,mac とすると、mac.txtも正常に開けるようになります。改行コードがCRなファイルを開く可能性がある方は明示的に fileformats を設定しておいたほうが良さそうですね。

余談 : ^M とは

ここまでの流れを踏まえると予想がつきますが、^M は CR を表しています。つまり \r です。

なぜ ^M としてVim上で表現されるかはいまいちわからなかったのですが、調べるとアスキーコードにおける順番とアルファベットの順番が関係しているそうでした。真偽が判別できなかったのでリンクは載せませんが、気になった方は調べてみてください。

参考