4

OS X アプリGeekToolを使用して、色付きのテキスト出力をデスクトップに印刷しようとしています。GeekTool を使用すると、「geeklets」と呼ばれる小さなウィンドウをデスクトップに配置できます。Geeklet の 1 つは、シェル コマンドの出力を表示します。

目的の出力は、Ruby スクリプトで解析しているテキスト ファイルから取得する必要があります。ruby gem colorizeを使用して、Ruby の文字列の周りに ANSI エスケープ シーケンスを追加しています。私の目標は、これらの文字列を Geektool に出力し、色付きのテキストを表示することです。

ターミナルで Ruby スクリプトを実行すると (Terminal と iTerm2 の両方で、zsh と bash の両方を使用)、出力は完全に適切に色付けされます。しかし、GeekTool でスクリプトを実行すると、そうではありません。エスケープ シーケンスは出力に表示されませんが、色はありません。このシェル コマンドを実行すると、GeekTool が ANSI エスケープ シーケンスをサポートしていることはわかっています。

printf "\e[0;35;49mabcd\e[0m"

カラー化された GeekTool 出力が得られます。 echo $SHELLまた、GeekTool は私が普段使用しているのと同じ zsh 実行可能ファイルを使用していることもわかります。しかし、何らかの理由で、私の Ruby スクリプトはカラー化された出力を印刷しません。代わりに、単色の出力が表示されますが、エスケープ シーケンスは取り除かれています。

私のスクリプトは Ruby を使用しputsて、エスケープ シーケンスを含む文字列を出力します。に切り替えてみましたp。ターミナルで実行すると、エスケープ シーケンスがそのままの状態で色付けされていない出力が生成されます。GeekTool で実行すると、色付けされていない出力も得られますが、エスケープ シーケンスは再び消えてしまいました。

私のエスケープシーケンスがどこに行くのか知っている人はいますか?

4

1 に答える 1

4

この問題の回避策を見つけました。色付きの宝石をドロップし、エスケープ シーケンスを「ダブル エスケープ」する必要がありました。以下のような文字列で文字列をラップして、文字列に色を付けました。

"\\e[0;36;49m"  # example color
"\\e[0m"        # clear

これらのエスケープ シーケンスの多くを含む 1 つの大きな文字列を作成した後、

command = "printf \"#{mystring}\n\""  # The trailing \n is needed to prevent Geektool from displaying [m at the end for some reason
exec(command)

これでうまくいきました。どうやらGeektoolへの出力で文字列が2回処理されていたようです。最初のパスでエスケープが消費されないようにするために、エスケープの前に二重のバックスラッシュ\\eが必要です。

于 2012-08-17T04:47:54.830 に答える