開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

Vim:改行コードを可視化し、置換する方法、まとめ。

最終更新:2017-08-03 by Joe

Vimで、改行コードが意図しないものになってしまった時、変換して修正するための方法です。

いったん覚えると、結構簡単です。2通り紹介しますね。

Vimで改行コードが問題になる時

Linux環境や、MacOS環境、Windows環境では、改行コードが異なっているのは、ご存知の方も多いと思います。

MacOSはver9まではCRでしたが、昨今ver10から、Unix系のLFに変更されました。

OS 改行コード 正規表現
LinuxなどのUnix系システム
MacOS(v10~)
LF (Line Feed) \n
MacOS (~v9) CR (Carriage Return) \r
Windows CR + LF \r\n

これが、Windows環境で保存されたファイルとうまく整合しません。またそのような場合は、Gitのdiffで、全ての行に改行コードの差分がでてしまい、かなり気持ちが悪いです。

例えば、CR(Carriage Return)のみのWindows環境で保存されてしまったファイルを、VIMで開きます。

VIMで、改行コードを確認する

一見、普通ですが、これはVIM側が改行コードをうまく解釈して表示してくれているからです。

エンコーディングを確認するコマンドを打ちます。

// ファイルフォーマットを確認するコマンド
:set fileformat? 
// 同義
:set ff?

こちらが、出力です。

fileformat=dos

「fileformat」が「dos」という値の時は、だいたいWindows環境で保存されたファイルでしょう。

改行コードを可視化する

改行コードの正体を暴くため、バイナリモードで起動します。一度ファイルを閉じて・・・-bオプションでファイルを開きます。

// VIMバイナリモードで起動
$ vim -b index.php

このようになります。Windowsの改行コードCR(Carriage Return)が「^M」という記号で可視化されて見えるようになります。

VIMのバイナリモードで、改行コードを確認する

実際にはこのファイルは、LFCRの2つの改行コードがならんでいるのですが、バイナリモードでは、LFはそのまま改行として表現されていますので、CR(= ^M)だけ見えています。

改行コードを置換する

さて、今回こちらのCRコードを削除していきます。2つのアプローチがありますが、どちらもシンプルですので、お好きな方法でどうぞ。

1)「^M」を正規表現で置換する

直感的に行うには、正規表現の置換で、空文字と置き換えることで削除するのがわかりやすいでしょう。

上記のバイナリモードのまま、正規表現で「^M」を削除します。Vim上では、「^M」は、CRを表す文字コードなので、「Ctrl + V」「Ctrl + M」と入力することで書き込めます。

ちょっと特殊です。

// 正規表現で改行コードをCRを削除
%s/^M//g

もしくは、CRを表すメタ文字「\r」を利用することもできます。こちらの方が入力方法を上記の「^M」の入力方法忘れてしまっても使えるので、覚えやすいかもしれませんね。

// 改行コードCRメタ文字「\r」を空文字と置換。
%s/\r//g

蛇足ですが・・Vimでの正規表現について:先頭の「%」を付けると、ファイル内の全行を捜査対象にします。逆に、そうでない場合は現在の行、もしくは「%10, 110」のように、範囲を指定することもできます。

そして、末尾の「g」は対象行のすべてのマッチを対象にします。逆に、これがないと、1行あたり、1度しか置換されません。

ちなみに、1つずつ置換の確認したい場合は、末尾に「gc」をすると確認しながら進められます。(ConfirmationのCですね、きっと)でもとにかく、ズバっと直したいので、今回は「c」はいらないでしょう。

2)「:set ff」コマンドを利用して変換

上記はバイナリモードでそのまま編集しましたが、そうでない方法でも修正できます。

いったんバイナリモードを閉じて下さい。Vim の通常モードで改めて開き直します。

あとは、ファイルフォーマットを「unix」と指定して、ファイルを保存し直すだけです。

// ファイルフォーマットを変更する
:set fileformat=unix
// 同義
:set ff=unix

簡単ですね。

ファイルを閉じて、またバイナリモードで開いてみて下さい。「^M」は消え去っているはずです。同じ操作をバイナリモードではうまくいかないのでご注意下さい。

参考リンク

Vimの文字コードに関する記事です。

マニュアルです。

閉じる