h3pei.tech
お仕事のご依頼
2022-06-08

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

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

3つの改行コード

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

改行コードvim 上での表現
LF(Line Feed)unix主に UNIX 系のシステムで用いられる. 16進数で0a
CR(Carriage Return)mac主に古い macOS 系で用いられる. 16進数で0d
CR+LFdos主に 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 上で表現されるかはいまいちわからなかったのですが、調べるとアスキーコードにおける順番とアルファベットの順番が関係しているそうでした。真偽が判別できなかったのでリンクは載せませんが、気になった方は調べてみてください。

参考

h3pei's icon

h3pei

フリーランスのソフトウェアエンジニア。Ruby / Rails アプリケーションの開発が得意領域。設計・実装・運用まで含めてプロダクト開発が好きです。

Questalという目標達成コミュニティサービスを開発しました。仲間と一緒に目標達成に取り組みたい方はぜひご利用ください。

お仕事のご依頼
GitHubnoteX

関連記事