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

h3pei
フリーランスのソフトウェアエンジニア。Ruby / Rails アプリケーションの開発が得意領域。設計・実装・運用まで含めてプロダクト開発が好きです。
Questalという目標達成コミュニティサービスを開発しました。仲間と一緒に目標達成に取り組みたい方はぜひご利用ください。