JSON と YAML を吐き出すコマンドライン プログラムがあります。デフォルトでは、pygments (pygmentize) が利用可能かどうかを検出し、利用可能な場合は、出力を渡して素敵なカラー化された出力を取得します。ただし、このプログラムが実行されるほとんどのコンピューターには、既定では pygments がインストールされていません。ただし、ほとんどのコンピューターには emacs または vim が搭載されています。これらのエディターのいずれかで、ANSI エスケープ シーケンスを使用して一部のテキストを構文強調表示し、再度出力する方法はありますか?
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 のようなものを使用して非表示のターミナルにラップできます。
Matthew Wozniski は、Vim でこれを行う vimcat.sh というスクリプトを作成しました。彼のバージョンはhttps://github.com/godlygeek/vim-files/blob/master/macros/vimcat.shにあります。私はそれにいくつかの変更を加えました(メモリが機能する場合、変更により私の Mac OS X システムで実行できました。その目的のために/dev/fd/9
forを置き換えることを知って/proc/self/fd/9
います)。https://gist.github.com/4090959で私の要点を参照してください。
Vim の強調表示によって背景が変更された場合、両方のバージョンのスクリプトでデフォルトの背景色に戻るのに問題があると思います。
Emacs (cp. ataylor's answer) と同様に、Vim は完全な構文ハイライトを含むバッファーを HTML にレンダリングできます。を参照してください:help 2html.vim
。おそらく、バッファの構文を通過するプラグインのコードの多くを再利用し、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プラグインを使用できます。
Format format csi to /path/to/file
. 当初、私のプラグインは、さまざまなフォーマットをサポートするための標準の 2html ターゲティングを書き直して、新しいフォーマットを簡単に追加するものでした (ANSI エスケープ シーケンスのサポートを追加するのに約 30 分を費やし、主にこれらのシーケンスの仕様を読みました)。類似点に言及します。大きなファイルの場合、または vim の 1 つのインスタンスを使用して多数のファイルをレンダリングする場合 (つまり、ウォームアップ (「コンパイル」およびキャッシュ フィル) 段階が、さらに実行する利点によってマスクされる場合) に、より高速に動作することが知られています。