Vimで改行コードを変更して開き直す(fileformat)
Windowsで作られたファイルをLinuxサーバー上で編集していたら、行末に見慣れない^Mが表示された。改行コードの違いが原因で、Vimには読み込み時に改行形式を指定し直す方法が用意されている。
改行コードを指定して開き直す
:e ++fileformat=dos " Windows形式(CRLF)
:e ++fileformat=unix " Unix形式(LF)
:e ++fileformat=mac " 旧Mac形式(CR)
省略形の++ff=でも同じように指定できる。これは文字コードを指定して開き直す++enc=と同じ発想の仕組みで、読み込み時の解釈だけを変更する。
現在の改行形式を確認する
:set fileformat?
:set ff? " 省略形
ステータスラインに表示する設定をしておけば、開くたびに毎回確認しなくても現在の形式が一目で分かる。文字コードと改行コードを合わせて表示する設定はこちらで扱っている。
改行コードを直接入力する
| キー | 入力される改行コード |
|---|---|
Ctrl-v Ctrl-m | CR(復帰) |
Ctrl-v Ctrl-l | LF(改行) |
特殊な改行コードをテキスト中に直接埋め込みたい、という場面は限られるが、バイナリに近いテキストデータを扱うときに使うことがある。
新規作成ファイルのデフォルト
既存ファイルを開く場合とは別に、新規ファイルを保存するときの改行コードはfileformats(複数形)の先頭の値が使われる。クロスプラットフォームで開発しているチームでは、この初期値をあらかじめunixに固定しておくと、意図せずCRLFで新規ファイルが作られる事故を防げる。
保存時の改行コードにも注意
ここまでは読み込み時の話だが、保存時にどの改行コードで書き出すかはfileformatの値がそのまま使われる。++ff=で読み込み直した状態で保存すると、指定した形式で書き出されるので、Windows向けにCRLFへ統一したいときなどはこの仕組みを使うとよい。
:e ++ff={形式}で開き直せば解決できる。読み込みと保存の両方に影響するので、変換したい場合はこのコマンドで開き直してから保存すればよい。
Windows環境で作成された設定ファイルをLinuxサーバーで編集するたびに^Mが表示されて煩わしかった。:e ++ff=unixで開き直してから編集し、そのまま保存する流れを覚えてからは、改行コードの不一致に悩まされることがほぼ無くなった。fileformatsの初期値をunixに固定してからは、そもそも意識する場面自体が減った。
Gitとの兼ね合い
チーム開発でGitを使っている場合、改行コードの扱いは.gitattributes側でも制御できる。Vim側の設定とGit側の設定が食い違っていると、保存のたびに意図しない差分が発生することがあるので、どちらか一方だけに頼るのではなく両方の設定を一致させておくと事故を防げる。
まとめ
改行コードのトラブルはfileformatの仕組みを理解していれば簡単に解決できる。文字コードの扱いとあわせて覚えておくと、環境をまたぐファイル編集で困ることが減る。