26

TERM環境変数をxtermまたはに設定すると、Mac OS X の Terminal.app ユーティリティはほとんどの ANSI エスケープ コードを尊重することに気付きましたxterm-256color。少なくともそれらのエスケープ コードがテキストの色の変更に関係する場合はそうです。

例えば:

echo -e "\033[0;31mERROR:\033[0m It worked"

プロデュース:

スクリーンショット

しかし、私は ANSI エスケープ コードによって提供されるカーソル位置操作機能にもっと興味があります。残念ながら、このタイプのコードは、Terminal.app ではあまりうまく機能していないようです。たとえば、私がやりたいことは次のようなものです。

echo -e "\033[sHello world\033[uG'day"

ESC[s現在のカーソル位置を保存しESC[u、最後に保存した位置を復元します。上記のスクリプトを実行した結果、カーソルの位置が変更された後、「G'day」の 5 文字が「Hello」の 5 文字を上書きし、次のようになると予想されます。

G'day world

実際、これはまさに iTerm2.app、ConEmu for Windows (MinGW または MSYS Git の bash.exe のコピーを実行) などで得られるものです。

Hello worldG'day

Terminal.app が単にこれらのコードをサポートしていないことを除けば、これには理由がありますか? この機能を有効にする方法はありますか? 何か設定が間違っている可能性はありますか?私のTERM設定?他の何か?

私はどこでも検索してきましたが、特に Terminal.app に関連するものは見つかりませんでした。ANSI エスケープ コードを介して色付きのテキストをサポートしているのに、まったく同じテクノロジを使用してカーソルの再配置をサポートしていないのは奇妙だと思います。これは、かなり明確に定義された標準のかなり恣意的なサブセットのようです。それが、Terminal.app のせいではなく、何かが間違っていると私が考える理由です...しかし、単にそれができない可能性があると思います。(おそらく、そもそも iTerm2 が存在する理由の 1 つですか?)

誰かがこの状況に光を当てることができれば、それは大歓迎です!

アップデート

それで、私はもう少し読んで実験をして、次の奇妙なことを発見しました:

以下の nm の回答を調べた後、返されたバイトをファイルに書き出してtput、通常の ANSI 命令とどのように異なるかを確認することにしました。

$ echo "$(tput sc)Hello world$(tput rc)G'day" > out.bin
$ cat -e out.bin
^[7Hello world^[8G'day$

シーケンスESC 7とを送信すると、すべてが期待どおりに機能するように見えますが、 と を送信するとESC 8そうではありません。これは、ANSI SCP コードと RCP コードのより典型的な表現であると理解しています (それぞれ、カーソル位置の保存とカーソル位置の復元)。 )。ASCII 10 進文字またはエスケープされた 8 進バイト表現の隣に配置することは不可能であるため ( != )、依存を避けるために代わりに環境変数を使用できます。ESC [sESC [u78\0337ESCtput

$ esc=$'\033'
$ csi="${esc}["
$ echo "${csi}0;31mERROR:${csi}0m It worked."
ERROR: It worked.  # Color works, as before
$ echo "${csi}sHello world${csi}uG'day"
Hello worldG'day   # No dice
$ echo "${esc}7Hello world${esc}8G'day"
G'day world        # Success

これがなぜなのかわかりません。ESC 7およびESC 8が ANSI SCP および RCP の何らかの独自のコードまたはカスタム コードであり、端末の実装ごとに異なる可能性がある場合、最初に が作成された理由を説明できますtput

残念ながら、tputbash 環境だけで作業しているわけではないため、現在取り組んでいるものには使用できません。生のバイトが端末ごとにどのように解釈されるか、より具体的には、Terminal.app に、私が試した他のすべての端末エミュレータと同じ ANSI エスケープ コードを尊重させる方法があるかどうかについて、もっと興味があります。で問題ないようです。それは可能ですか?この時点で、そうではないかもしれないと思い始めていますが、それは問題ありませんが、確実に知り、おそらくその理由も知ることができればうれしいです.

4

1 に答える 1