20071017

Делаем из текстового файла PDF с подсветкой синтаксиса

Есть такой полезный инструмент diff, чтобы смотреть, какие строки изменены в файле. Иногда же мне хочется получить красивую распечатку этих самых изменений. Это можно сделать, скормив текстовый вывод diff программке enscript:
$ diff -u файл1 файл2 | LANG=C enscript -Ediffu --color -o changes.ps && ps2pdf changes.ps && rm changes.ps && xpdf changes.pdf

или, в случае использования svn,
$ svn diff | LANG=C enscript -Ediffu --color -o changes.ps && ps2pdf changes.ps && rm changes.ps && xpdf changes.pdf
Ключевой момент — это вызов enscript, который создаёт файл changes.ps (параметр -o changes.ps), где удалённые и добавленные строки подсвечены разными цветами (-color), в соответствии с синтаксисом diff (-Ediffu).

Кстати, кроме подсветки синтаксиса diff-ов, enscript умеет подсвечивать и многие другие форматы файлов, включая большинство распространённых языков программирования. Загляните в /usr/share/enscript/hl/.

Да и результат можно сохранить не только в PS, но и в HTML. Так, чтобы «раскрасить» файл с текстом программы на C++ можно сделать следующее:
$ cat hello.cc | enscript -Ecpp --color -whtml -o hello.html
А если сделать алиас
alias hidiff="enscript -Ediffu --color -wansi -o -"
то смотреть «подкрашенный» diff можно прямо в терминале:
$ svn diff | hidiff


К сожалению, enscript не работает с уникодом. Поэтому если файлы написаны по-русски в кодировке UTF-8 — ничего хорошего не выйдет. Да и дату, если локаль русская, он скорее всего попытается отобразить кракозябами… В общем, мне обычно надо сравнивать куски кода или текста на английском, где русских букв нет, и такого решения хватает.