
簡単な方法でカーソル位置を保存して復元できるようにする必要があります。ANSIエスケープシーケンス
ANSIエスケープシーケンスを使用すると、画面上でカーソルを自由に移動できます。これは、シェルスクリプトで作成されたフルスクリーンユーザーインターフェースには便利ですが、プロンプトでも使用できます。モーションエスケープシーケンスは次のとおりです。
- [...]
- カーソル位置を保存:
\033[s
- カーソル位置の復元:
\033[u
ただし、このANSIシーケンスはカーソルの水平位置のみを復元するようです。たとえば、
$ printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Doing some task...
More text
done!
$
水平はdone!
正しい位置にありますが、垂直は正しくありません(修復の面では正確です)。
- 私は何を逃したことがありませんか?これを再現できますか? !
- これが予想される動作ですか?それでは、
done!
後でどのように印刷しますかtask...
? - これが発生しない場合、私の環境の何かによってこの動作が間接的に発生する可能性がありますか?
多くの質問を検索して読みましたが、私が経験したこれらの行動に関する情報を見つけることができませんでした。実際にtput
viaでも同じことが起こります。
$ printf 'Doing some task...'; tput sc; printf '\n\nMore text\n'; tput rc; printf 'done!\n\n\n'
答え1
私は何を逃したことがありませんか?これを再現できますか? !
私はターミナルの一番下にあり、コンテンツの次の行が上に移動したときに行うことができます。ただし、端末でテストを繰り返します。スクロールなし同時に。Ctrl+ L(または電話)をクリックしclear
て上部から始めます。その後、必要に応じて動作します。
これが予想される動作ですか?
そう思います。カーソル位置は画面の内容ではなく画面に基づいています。
done!
後でどのように印刷しますかtask...
?
考えられるアプローチ:6行以下で印刷し、端末が十分に大きい場合は、最初に6行の空白行を印刷して最初にスクロールし、次に意味のあるテキストを印刷する前にカーソルを上に移動します。
printf '\n\n\n\n\n\n'; printf '\033[6A'; printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
ロジックを表示するために3つの個別のsを使用しましたが、1つでもかまいませんprintf
。
答え2
私のために動作します。私は使用することを好む用語情報データベース(man 5 terminfo
)は、ハードコードされたエスケープシーケンスの代わりに使用されます。
sc=$(tput sc) rc=$(tput rc) el=$(tput el)
clear; printf 'Doing some task...%s\n' "$sc"; sleep 1; printf '%sDONE%s\n' "$rc" "$el"
現在のカーソル位置を保存/復元するよりも優れたオプションの場合は、カーソルを絶対位置(左上隅の{0,0})に移動することもできます。
tput cup 4 40; sleep 1; printf "%s\n" 'This is row 4 column 40'