カーソル位置を保存して端末から復元

カーソル位置を保存して端末から復元

非同期プロンプト出力を生成するためにいくつかの端末機能を使用していますbash。私は次のようなものを取得したいと思います。から文字列を出力するときはPROMPT_COMMAND、ターミナルカーソルの位置を保存し、putを印刷し、...別の操作(たとえば、他の情報を印刷する)を実行してからしばらくしてください。帰る場所を覚えて新しいものを印刷してください。PS1設計された方法は、コマンド自体を改行文字に配置して、非同期出力が端末のテキストになるようにすることです。

私はcupterminfoエントリがカーソルを特定の位置に移動し、現在の位置を取得するためのエスケープコードがあることを発見しました(例を参照)。この問題)。しかし、私が見るにはすべて、端末バッファの位置ではなく、画面上のカーソル位置を使用しているようです。これは、新しい行を追加した後に私が覚えている場所が間違っていることを意味します。

ターミナルカーソル位置を使用してバッファ位置に基づいてカーソル位置を保存および復元する方法はありますか?記憶された位置がまだバッファの可視部分にあると仮定できますが(実際にはカーソルをそこに置くことができます)、数行上に上がることができます。今、私たちは競争条件を考慮していません。そうでない場合は、他のヒントを探してみましょう。

実際には、非同期プロンプトをサポートするシェルがありますが、zshユーザーが出力する前に[新しい行に移動]をクリックすると、機能するかどうかはEnter実際にはわかりません。

答え1

利用可能なほとんどの端末は、カーソル位置を保存および復元するためにエスケープシーケンスを実装します。これは、端末記述のsc(カーソル保存)および(カーソル復元)機能であり、次のように使用できます。rctputcup

tput sc
tput cup 50 10
echo some stuff
echo more stuff
tput rc

ただし、プログラムがスクロールを強制するのに十分なテキストを作成している場合、復元された場所はまだ端末画面の同じ場所にあります。スクロールするテキストと一緒に移動しません。

ちなみに、POSIX文書のみ部分tputこれは実際には他の標準であるX / Open Cursesの一部であるためです。これは以下に要約されています。移植性マニュアルページの一部。

質問に戻る:追跡されていないエスケープシーケンスバッファー位置(スクロールを考慮)。これを行うには、アプリケーションが画面に送信された内容を追跡する必要があります。この種の問題を解決することは、呪いライブラリの目的です。一般的なコマンドラインアプリケーションではできることはあまりありません。

関連情報