問題タブ [ansi-escape]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
shell - Emacs シェルの実行時に表示される ANSI エスケープ シーケンス (これらは ANSI カラーではありません)
Emacs でシェル コマンドを実行すると、ANSI コードのようなコードが表示されることがよくあります。それらは、シェル プロセスが新しいプロセスを生成するときに発生するようです。
Emacs シェルで Stata を実行する例を次に示します。ANSI コード (これがそのコードの場合) は下部に表示されます。
注: ANSI カラー エスケープ シーケンスに関する同様の SO の質問が多数あります。これは私の問題ではありません!ansi-color
、 、ansi-color-for-comint-mode-on
、および ANSI カラーが既に必要です。また、ansi-term を使用するとこの問題は解決しますが、私は標準シェルのバッファーのような特性をはるかに好みます。eshell の方がわずかに優れていますが、それでもいくつかのエスケープ コードが表示されます。
私の推測では、これらは画面モード/カーソル移動コードですが、emacs にそれらを無視または処理させる方法がわかりません。TERM は xterm-256color に設定されています。
更新: h および l コードが端末/表示モードの設定に使用されることを知りました。これは、Emacs では処理できないと思われます。それらが表示されないようにする方法はありますか?
c++ - ANSI エスケープ コード C++ を使用したスクロール
C++ で ANSI エスケープ コードを使用して画面をスクロールしようとしていますが、問題があります。私のコードは
プログラムを実行すると、カーソルが最後の行に移動するまで下矢印を押してから左矢印を押すと、画面が下にスクロールします(それで問題ありません)。しかし、上矢印でカーソルを上に移動してから右矢印を押すと、「ESCを押して終了します」という書き込みが再び表示されません。画面を前の行までスクロールするにはどうすればよいですか?
terminal - ANSI エスケープ コード ESC[0E が期待どおりに機能しない
この回答のサンプルコードを試していました。
予想される動作は、次のようなプログレス バーでした。
これは同じ行で 3 回更新され、次のようになります。
3秒後。
各進行状況バーは期待どおりに消去されますが、次の進行状況バーは、予想していたのと同じ行ではなく、1 行下に描画されます。
回答にリンクされているドキュメント(ウィキペディア)には、CSI n E
(ESC[nE
)がn
整数であると書かれています:
カーソルを n (デフォルトは 1) 行下の行の先頭に移動します。
CSI 0 E
したがって、 ( ESC[0E
) はカーソルを現在の行の先頭 (行を下に移動) に移動することを期待します0
。
なぜそうしないのですか?また、どうすれば意図した動作を実現できますか?
Terminal.app
このプログラムを実行するために OS X を使用しています。
python - 端末の行と行
端末エミュレーターには行と行の概念があるようですが、それについてもっと知りたいです。
行と行の意味のデモンストレーション
以下の Python スクリプトは、3 行の「a」を表示して待機し、次に 3 行の「b」を表示します。
この休憩中に端末ウィンドウの幅を 1 文字狭くすると、次のように表示されます。
これはかなり妥当なようです。各行は個別にラップされています。もう一度エンターを押してb
s を印刷すると、
すべてが期待どおりに機能します。私は絶対カーソル位置を使用し、以前に書き込んだのと同じ行に書き込みました - もちろん、すべての a を上書きするわけではありません。それらの多くは他の行にあるからです。
ただし、ウィンドウをさらに 1 文字狭めると、ラッピングの動作が異なります。
2 番目と 3 番目の行がb
折り返されたのはなぜa
ですか? また、' の最後の行が b の最初の行と結合したのはなぜですか? 上の表示されている行に理由のヒントがあります - 2 つa
の が表示されているのは、これらの 2 つの行がまだリンクされているためです - もちろん、ウィンドウを再度移動すると、その 1 つの行は同じように折り返されます。これは、行全体を置き換えた行でも発生しているようです。
以前に折り返されていた行が、対応する親行にリンクされていることがわかります。ターミナルを大きく広げると、それらが同じ論理行に属していることがより明白になります。
私の質問
実際には、私の質問は、この行が行に結合されるのをどのように防止または予測するかです。画面全体をクリアするとこの動作はなくなりますが、アプリケーションを大幅に高速化する行ごとのキャッシュを保持できるように、可能であればこれを必要とする個々の行に対してのみこれを行うとよいでしょう。行の最後までクリアすると、その行はその下の行からリンク解除されますが、行の先頭までクリアしても、その行からその行のリンクは解除されません。
私は興味があります - これらの行のものは何ですか? それらについてどこで読むことができますか?どの行が同じ行の一部であるかを調べることはできますか?
私は、tmux の有無にかかわらず、terminal.app と iterm でこの動作を観察しました。仕様がなくても、これらのいずれかにソースダイブすると答えが得られると思いますが、どこかに仕様があると思います!
背景: ユーザーがウィンドウの幅を狭めた場合に端末の折り返しが発生する方法を予測できる端末ユーザー インターフェイスを作成したいと考えています。tput smcup
行の折り返しを防ぐために機能するフルスクリーンモード( 、または'、ncursesが使用するもの)のようなものは知ってpython -c 'print "\x1b[?1049h"
いますが、ここでは使用したくありません。
編集:スクリプトの上書き動作をすでに理解していることをより明確にし、ラッピング動作の説明が必要です。
macos - ANSIエスケープコードを尊重するようにTerminal.appを作成できますか?
TERM
環境変数をxterm
またはに設定すると、Mac OS X の Terminal.app ユーティリティはほとんどの ANSI エスケープ コードを尊重することに気付きましたxterm-256color
。少なくともそれらのエスケープ コードがテキストの色の変更に関係する場合はそうです。
例えば:
プロデュース:
しかし、私は ANSI エスケープ コードによって提供されるカーソル位置操作機能にもっと興味があります。残念ながら、このタイプのコードは、Terminal.app ではあまりうまく機能していないようです。たとえば、私がやりたいことは次のようなものです。
ESC[s
現在のカーソル位置を保存しESC[u
、最後に保存した位置を復元します。上記のスクリプトを実行した結果、カーソルの位置が変更された後、「G'day」の 5 文字が「Hello」の 5 文字を上書きし、次のようになると予想されます。
実際、これはまさに iTerm2.app、ConEmu for Windows (MinGW または MSYS Git の bash.exe のコピーを実行) などで得られるものです。
Terminal.app が単にこれらのコードをサポートしていないことを除けば、これには理由がありますか? この機能を有効にする方法はありますか? 何か設定が間違っている可能性はありますか?私のTERM設定?他の何か?
私はどこでも検索してきましたが、特に Terminal.app に関連するものは見つかりませんでした。ANSI エスケープ コードを介して色付きのテキストをサポートしているのに、まったく同じテクノロジを使用してカーソルの再配置をサポートしていないのは奇妙だと思います。これは、かなり明確に定義された標準のかなり恣意的なサブセットのようです。それが、Terminal.app のせいではなく、何かが間違っていると私が考える理由です...しかし、単にそれができない可能性があると思います。(おそらく、そもそも iTerm2 が存在する理由の 1 つですか?)
誰かがこの状況に光を当てることができれば、それは大歓迎です!
アップデート
それで、私はもう少し読んで実験をして、次の奇妙なことを発見しました:
以下の nm の回答を調べた後、返されたバイトをファイルに書き出してtput
、通常の ANSI 命令とどのように異なるかを確認することにしました。
シーケンスESC
7
とを送信すると、すべてが期待どおりに機能するように見えますが、 と を送信するとESC
8
そうではありません。これは、ANSI SCP コードと RCP コードのより典型的な表現であると理解しています (それぞれ、カーソル位置の保存とカーソル位置の復元)。 )。ASCII 10 進文字またはエスケープされた 8 進バイト表現の隣に配置することは不可能であるため ( != )、依存を避けるために代わりに環境変数を使用できます。ESC
[s
ESC
[u
7
8
\0337
ESC
tput
これがなぜなのかわかりません。ESC
7
およびESC
8
が ANSI SCP および RCP の何らかの独自のコードまたはカスタム コードであり、端末の実装ごとに異なる可能性がある場合、最初に が作成された理由を説明できますtput
。
残念ながら、tput
bash 環境だけで作業しているわけではないため、現在取り組んでいるものには使用できません。生のバイトが端末ごとにどのように解釈されるか、より具体的には、Terminal.app に、私が試した他のすべての端末エミュレータと同じ ANSI エスケープ コードを尊重させる方法があるかどうかについて、もっと興味があります。で問題ないようです。それは可能ですか?この時点で、そうではないかもしれないと思い始めていますが、それは問題ありませんが、確実に知り、おそらくその理由も知ることができればうれしいです.