Bashにテキストのちらつきを止めることはできますか?

Bashにテキストのちらつきを止めることはできますか?

私は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

点滅している文字が表示され、EXAMPLE5秒後にカーソルを行の先頭に戻し(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"; }

ユーザーが同時にまたは以前に何も入力しなかったとします。

  • pRomptに送信されたエスケープシーケンス
  • 応答が画面に表示されないように無効にすることをread知らせます。echo-s
  • 応答はリミッタrまで読み取られます。R d
  • FSすべての<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他のシェルや他のビルド/バージョン/設定で移植可能にするために使用します。printfBashと他のほとんどのprintf実装に組み込まれている機能を\e使用すると\33


ここで言及されている他のエスケープシーケンスよりもはるかに狭くサポートされています。また、tmuxホスト端末でサポートしてもサポートされないことに注意してください。screenシーケンスをホストに渡すように説得できますが、分割ウィンドウではまだ機能しません。

おすすめ記事