Использование подсветки синтаксиса emacs или vim для программы командной строки?

У меня есть программа командной строки, которая извергает JSON и YAML. По умолчанию он определяет, доступны ли пигменты (pygmentize), и если это так, передает вывод через него, чтобы получить хороший раскрашенный вывод. Однако pygments не устанавливается по умолчанию на большинстве компьютеров, на которых будет работать эта программа. Но на большинстве компьютеров есть либо emacs, либо vim. Есть ли способ заставить один из этих редакторов выделять синтаксис некоторого текста с помощью управляющих последовательностей ANSI, а затем снова выводить его?


person Steven Haryanto    schedule 15.11.2012    source источник
comment
Кстати, я только что узнал о coderay. Он основан на рубине, и его программа командной строки работает намного быстрее, чем pygmentize.   -  person Steven Haryanto    schedule 16.11.2012
comment
Другим вариантом может быть GNU Source-highlight. Я использую это, чтобы получить цвета с меньше.   -  person Randy Morris    schedule 16.11.2012
comment
@RandyMorris: да, для него даже есть модуль CPAN (моя программа основана на Perl). Единственная проблема заключается в том, что зависимость довольно велика (установка исходного текста и его библиотек разработки для сборки модуля CPAN требует около 100 МБ пакетов Debian).   -  person Steven Haryanto    schedule 22.11.2012
comment
Я решил свою проблему, создав дампер цветов JSON и YAML. Оказывается, мне не нужна подсветка синтаксиса (румянится). Но я благодарю советы в ответах.   -  person Steven Haryanto    schedule 22.11.2012


Ответы (5)


так как редактор уже умеет работать с ansi, довольно легко сделать снимок экрана редактора, не так ли?

script -qc "stty rows 10000
emacs -nw -visit YOURFILE.YAML -eval '(redisplay t)' -f kill-emacs
resize"

(повторное отображение необходимо только для GNU FSF Emacs)

Теперь очистите захват

perl -p0E 's/\A(?s:.*)\e\[27m\r\n
\e\[A\n((?s).*?)
(?:\e\[K\n)+
\e.*\e\[27m\r$(?s:.*)\Z/$1/mx' < typescript

если вы не хотите, чтобы процесс записи был виден на экране, вы можете обернуть его в скрытый терминал чем-то вроде Perl IO::Pty

person Nei    schedule 16.11.2012
comment
Хороший трюк! Хотя немного избыточно для рассматриваемой проблемы. Спасибо. - person Steven Haryanto; 22.11.2012

Мэтью Возниски написал скрипт под названием vimcat.sh, который делает это с помощью Vim. Его версия находится по адресу https://github.com/godlygeek/vim-files/blob/master/macros/vimcat.sh. Я внес в него несколько модификаций (если мне не изменяет память, модификации позволили ему работать в моей системе Mac OS X; я знаю, что замена /dev/fd/9 на /proc/self/fd/9 имела именно эту цель); см. мою суть на https://gist.github.com/4090959.

Я считаю, что обе версии сценария имеют проблемы с возвратом к цвету фона по умолчанию, если выделение Vim меняет фон.

person echristopherson    schedule 16.11.2012

Как и Emacs (см. ответ ataylor), Vim может отображать буфер с полной подсветкой синтаксиса в HTML; см. :help 2html.vim. Вероятно, вы могли бы повторно использовать большую часть кода плагина, который проходит через синтаксис буфера, и изменить его для рендеринга в escape-последовательности ANSI, но вам пришлось бы заново реализовать всю логику рендеринга самостоятельно.

Хотя есть некоторые плагины, которые используют Vim в качестве пейджера, я не думаю, что можно просто использовать Vim для вывода буфера с управляющими последовательностями ANSI. Ведь Vim хочет сохранить контроль над терминалом и очищает его при выходе.

Я бы посоветовал поискать другое специализированное решение за пределами Vim, хотя это означает, что вам нужно его установить.

person Ingo Karkat    schedule 16.11.2012

В Emacs есть функция htmlfontify, которая преобразует шрифтовый буфер в HTML. Вы можете использовать это в пакетном режиме с небольшим скриптом elisp для рендеринга файла как HTML. Например:

emacs -q --batch --file myfile.rb --eval '(progn (require (quote htmlfontify)) (htmlfontify-buffer) (set-buffer-modified-p t) (save-buffer))'
person ataylor    schedule 16.11.2012
comment
Спасибо. Извините, не ясно, мне нужно это в escape-последовательностях ANSI, так как я вывожу на терминал. Мой EmacsLisp-fu сильно ограничен, но вы дали мне несколько советов, чтобы поиграть. - person Steven Haryanto; 16.11.2012

Если вы не хотите следовать совету @IngoKarkat и переписать стандартный плагин для поддержки управляющей последовательности ANSI, вы можете использовать мою ссылку formatvim, он поддерживает рендеринг в управляющую последовательность ANSI с помощью

Format format csi to /path/to/file

. Изначально мой плагин представлял собой переписывание стандартного таргетинга 2html для поддержки разных форматов с простым добавлением нового формата (я потратил около 30 минут, чтобы добавить поддержку escape-последовательностей ANSI, в основном читая спецификацию этих последовательностей), но текущий код зашел слишком далеко, чтобы упоминать сходства. Известно, что он работает быстрее для больших файлов или когда вы используете один экземпляр vim для рендеринга нескольких файлов (т. е. когда этап прогрева («компиляция» и заполнение кеша) маскируется преимуществами дальнейшего запуска).

person ZyX    schedule 16.11.2012