Posted at

CLIでもWinMergeのように綺麗に比較したい(emacsのediff-merge)

More than 3 years have passed since last update.

普段GUIにおいて、2つのファイルを比較する場合、WinMergeを利用しています。LinuxなどCLIで作業する場合において、ファイルを比較する場合「diff」や「sdiff」コマンドを使って確認します。しかし、ファイルの差異が少ない場合は良いですが、1000行を超えるテキストファイル同士を比較して、何十箇所も差異があった場合標準出力に大量の出力が出て、出力のどこに違いがあるのかわからずヒエッとしてます。できれば、余計なパッケージを入れることなく、綺麗に比較できるツールがあれば良いなと思っていましたが、emacsのediff-mergeが私のイメージに合いました。


emacsのediff-merge

emacsの一機能であり、2つのファイルを比較して、差異をハイライトで見ることのできるツールです。2つのファイルを並べて、差異ごとに異なる箇所を確認でき、キーで1箇所ずつ自身のペースで確認できます。


ediff-mergeで比較する

インストール方法にもよりますが、Linux系などemacsが使える環境であれば使えます。では使って見ます。まず、以下のようなファイルを準備しました。

比較ファイル1


main.html

<!DOCTYPE html>

<html lang=“ja”>
<head>
<meta http-equiv="content-language" content="ja">
<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow">
<title></title>
<script type="text/javascript"><!-- alert("");--></script>
<style>body {background: #ffffff;}</style>
<script type="text/javascript" language="javascript" src=""></script>
<link rel="stylesheet" type="text/css" href="" />
</head>
<body></body>
</html>

比較ファイル2


other.html

<!DOCTYPE html>

<html lang=“ja”>
<head>
<meta http-equiv="content-language" content="ja">
<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow">
<title></title>
<script type="text/javascript"><!-- alert("");--></script>
<style>body {background: #ff0000;}</style>
<script type="text/javascript" language="javascript"></script>
<link rel="stylesheet" type="text/css" href="" />
</head>
<body></body>
</html>

Linuxのコマンドラインからemacsを起動する

#emacsが入っているか確認

$ which emacs
/bin/emacs

$ emacs

emacsで比較する

※すでにご存知だと存じますが、emacsの「M-x」はエスケープキーを押下した後、xキーを押下します。

$ M-x emacs-version

GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.8.8) of 2015-11-21 on worker1.bsys.centos.org

$M-x ediff-merge
File A to merge (default ~/): ~/main.html
File B to merge (default main.html): ~/other.html

比較画面

スクリーンショット 2016-04-04 2.19.15.png

画面が3分割され、左上にはmain.htmlを表示、右上にはother.htmlを表示、下には2ファイルの差異を表示しています。

ハイライトさせる

「h」キー

スクリーンショット 2016-04-04 2.22.30.png

差異がある箇所をハイライトしています。それぞれ差異がある箇所に色をつけています。

差異部分をなぞる

「p」キー(進む)、または、「n」キー(戻る)

ショートカットによって、次の差異箇所に移動します。

ediff-mergeから抜ける

qキーを押下

Quit this Ediff session? (y or n)

抜けた直後、3分割したemacs画面になります。

emacsを抜ける、分割画面で作業するなど選んでください。

スクリーンショット 2016-04-04 2.28.46.png