私はbashで遊んで、別のコマンドを実行すると、ちらつくテキストを止めることができるかどうか疑問に思いました。たとえば、echo -e '\033[5mEXAMPLE\033[0m'
点滅しているEXAMPLE
テキストが出力されますが、2番目のコマンドを実行するとテキストの点滅を停止できるかどうかを知りたいと思います。
答え1
送信<ESC>[5m
シーケンスは、これから表示される文字の点滅属性を設定するように端末に指示する。
ほとんどの端末では、<ESC>[25m
それ以降に送信される文字が点滅する宿泊施設は閉鎖されました。 、回転と<ESC>[0m
同じ<ESC>[m
みんな太字、ハイライト、色などを含む文字レンダリングプロパティがオフになります。単純な点滅はそれ以上です。
これらのシーケンスを送信しても、すでに表示されている内容は変更されません。
EXAMPLE
画面上の特定の位置が点滅を停止するには、EXAMPLE
同じ場所に新しい点滅を送信して上書きする必要があります。
たとえば、
printf '\r\33[5m%s\33[25m' EXAMPLE; sleep 5; printf '\r%s\n' EXAMPLE
点滅している文字が表示され、EXAMPLE
5秒後にカーソルを行の先頭に戻し(CRは\r
カーソルを最初の移動とも呼ばれます)、点滅しない文字で上書きされますEXAMPLE
。
一部の端末では、次のコマンドを使用して表示領域内のすべての文字のプロパティを変更することもできます。<ESC><top>;<left>;<bottom>;<right>25$r
DECCARAエスケープシーケンス、境界が指定されていない場合、デフォルトはフルスクリーンです。これDECSACE
エスケープシーケンス両方の<top>;<left>
合計<bottom>;<right>
座標が最初と最後の文字であるか、長方形の領域の角であることを確認するために送信できます。
例:
printf '\33[;;;;$r'
全画面ですべての点滅を削除します。
画面上の特定の連続テキストのちらつきを取り除くには、そのテキストの最初の文字と最後の文字の座標を知る必要があります。
エスケープシーケンスを使用してカーソル位置を照会できます<ESC>[6n
。
を使用すると、次を使用してbash
これを実行し、<ESC>[<y>;<x>R
応答を読み取ることができます。
getpos() { IFS=$'\e[;' read -rsdR -p $'\e[6n' _ _ "$2" "$1"; }
ユーザーが同時にまたは以前に何も入力しなかったとします。
p
Romptに送信されたエスケープシーケンス- 応答が画面に表示されないように無効にすることを
read
知らせます。echo
-s
- 応答はリミッタ
r
まで読み取られます。R
d
F
S
すべての<ESC>
、、文字に対して[
フィールド分割を実行し;
、結果フィールドを_
、_
および変数$2
に保存します$1
。
だからあなたはこれを行うことができます:
printf '\33[5m%s\33[25m\n' 'Some earlier blinking text'
getpos x1 y1; printf '\33[5m%s\33[25m%s' EXAMPLE; getpos x2 y2
printf ' \33[5m%s\33[25m\n' 'Some extra blinking text'
echo 'Some more text'
後でスクロールがないと仮定すると、次のようになります。
printf '\33[%s;%s;%s;%s;25$r' "$y1" "$x1" "$y2" "$x2"
上記のすべては、printf
代わりにecho
他のシェルや他のビルド/バージョン/設定で移植可能にするために使用します。printf
Bashと他のほとんどのprintf
実装に組み込まれている機能を\e
使用すると\33
。
ここで言及されている他のエスケープシーケンスよりもはるかに狭くサポートされています。また、tmux
ホスト端末でサポートしてもサポートされないことに注意してください。screen
シーケンスをホストに渡すように説得できますが、分割ウィンドウではまだ機能しません。
答え2
点滅するテキスト
tput blink
回復機能
tput sgr0
例えば
tput blink; echo This is blinking text; tput sgr0
または
blink=$(tput blink) noblink=$(tput sgr0)
printf '%s\n' "Here we go: ${blink}this blinks${noblink} and this is steady"
この機能とカーソルを上(tput cuu1
)または絶対位置(tput cup Y X
左上隅の-(0,0))に移動する機能を使用すると、点滅しないテキストで点滅するテキストを自由に上書きできます。
terminfoについてもっと読む価値があります。現在のカーソル位置を保存して新しい位置に移動してテキストを作成し、その位置を復元することもできます。端末がそれをサポートしていない場合は、$TERM
現実と一致する限り近似値に戻ります。