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で開いたときの結果です。
fileformats
は unix,dos
となっていたので、改行コードがCRのmac.txtは ^M
というおかしな表示になっていますね。期待通りの結果と言えます。
画像は割愛しますが、fileformats
の設定を unix,dos,mac
とすると、mac.txtも正常に開けるようになります。改行コードがCRなファイルを開く可能性がある方は明示的に fileformats
を設定しておいたほうが良さそうですね。
余談 : ^M
とは
ここまでの流れを踏まえると予想がつきますが、^M
は CR を表しています。つまり \r
です。
なぜ ^M
としてVim上で表現されるかはいまいちわからなかったのですが、調べるとアスキーコードにおける順番とアルファベットの順番が関係しているそうでした。真偽が判別できなかったのでリンクは載せませんが、気になった方は調べてみてください。