У меня есть программа командной строки, которая извергает JSON и YAML. По умолчанию он определяет, доступны ли пигменты (pygmentize), и если это так, передает вывод через него, чтобы получить хороший раскрашенный вывод. Однако pygments не устанавливается по умолчанию на большинстве компьютеров, на которых будет работать эта программа. Но на большинстве компьютеров есть либо emacs, либо vim. Есть ли способ заставить один из этих редакторов выделять синтаксис некоторого текста с помощью управляющих последовательностей ANSI, а затем снова выводить его?
Использование подсветки синтаксиса emacs или vim для программы командной строки?
Ответы (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
Мэтью Возниски написал скрипт под названием 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 меняет фон.
Как и Emacs (см. ответ ataylor), Vim может отображать буфер с полной подсветкой синтаксиса в HTML; см. :help 2html.vim
. Вероятно, вы могли бы повторно использовать большую часть кода плагина, который проходит через синтаксис буфера, и изменить его для рендеринга в escape-последовательности ANSI, но вам пришлось бы заново реализовать всю логику рендеринга самостоятельно.
Хотя есть некоторые плагины, которые используют Vim в качестве пейджера, я не думаю, что можно просто использовать Vim для вывода буфера с управляющими последовательностями ANSI. Ведь Vim хочет сохранить контроль над терминалом и очищает его при выходе.
Я бы посоветовал поискать другое специализированное решение за пределами Vim, хотя это означает, что вам нужно его установить.
В 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))'
Если вы не хотите следовать совету @IngoKarkat и переписать стандартный плагин для поддержки управляющей последовательности ANSI, вы можете использовать мою ссылку formatvim, он поддерживает рендеринг в управляющую последовательность ANSI с помощью
Format format csi to /path/to/file
. Изначально мой плагин представлял собой переписывание стандартного таргетинга 2html для поддержки разных форматов с простым добавлением нового формата (я потратил около 30 минут, чтобы добавить поддержку escape-последовательностей ANSI, в основном читая спецификацию этих последовательностей), но текущий код зашел слишком далеко, чтобы упоминать сходства. Известно, что он работает быстрее для больших файлов или когда вы используете один экземпляр vim для рендеринга нескольких файлов (т. е. когда этап прогрева («компиляция» и заполнение кеша) маскируется преимуществами дальнейшего запуска).