特定の行/列にカーソルを置き、最初の座標と整列したままの複数行のファイル/コマンドを印刷したいと思います。
tput clear
tput cup 5 15
ping www.google.com
列15の全ての後続行が出力される。実際、最初の行は正しく印刷されますが、後続の行は左にリセットされます。使用tput
や他の方法は可能ですか?
答え1
1つの方法は、その位置にタップストップを設定することです。
trap 'tabs -8' EXIT INT TERM # restore to default tab stops every 8 columns
# upon exit or signal
tput tbc # clear tab stops
tput cup 5 15
tput hts # set one and only tab stop
printf '\r' # move back to the beginning of the line
printf '\t%s\n' foo bar baz
ping www.google.com | paste /dev/null -
これは端末の動作に影響を及ぼし、例えば一時停止された場合に問題を引き起こす可能性がある。
@Thorcup
ベースのアプローチと比較して、利点は少ない出力を送信することです(300ボードの衛星リンクを使用しない限り実際には問題ありません)。 syslogのような他のプロセスも端末にテキストを書き込むと、その動作はよりエレガントになります。
各行を位置15から始める別の方法は、各行の接頭辞を付けることです\r$(tput cuf 15)
。
tput cup 5 15
ping www.google.com | PREFIX=$(tput cr; tput cuf 15) awk '
{print ENVIRON["PREFIX"] $0}'
csr
スクロールエリア設定機能も参照してください。
使用されている場合は、zsh
その項目も参照してください。zcurses builtin
答え2
はい。
...問題のプログラム出力を事後処理する必要はなく、(一部のプログラムのように)ターミナル文字デバイスではなくパイプと通信すると考えるため、動作を変更させる必要もありません。
tput
必要な機能を提供するterminfo関数がないため、これを行うことはできません。さらに、この機能は特定特定クラスの端末、つまり DEC VT シリーズ端末にある複数の制御シーケンスを実装する端末です。
しかしそれははい可能。
端末数が少ないですね。端末エミュレータでは、DEC VT及び対応する制御シーケンスをエミュレートすることが広く使用されている。しかしながら、全ての端末エミュレータが、これに必要な特定のDEC VT制御シーケンスを理解し実施するわけではない。以下が含まれます:
console-terminal-emulator
存在するNoshツールセット- Xタム
- 地上波の用語
これらの端末には設定可能なDEC VTの概念があります。余裕。マージンは、通常の出力のスクロールと自動マージンのラップ動作を制御します。端末にはDEC VTの概念も適用されています。原産地モード。これはモード設定設定時存在する、収益を生み出す返品CUP および HVP 制御シーケンスを使用して、絶対カーソル位置決めを制御します。最後に、彼らは実装します。みんな最新のDEC VTモデルで提供される新しいマージンを含むマージン。
したがって、プログラムが開始または継続されるとき:
- DECSTBM 制御シーケンスを実行して、上下の余白を設定します。
- DECLRMM モードをオンにして、左右のマージンメカニズムを有効にします。存在する。
- DECSLRM 制御シーケンスを実行して、左右のマージンを設定します。
- DECOMモードオン存在する。
- 原点モードをオンにしたときに余白から外れた場合に備えてカーソルを配置し、原点モードをオンにしたときにカーソルが自動的に移動しません。
プログラムが終了、一時停止、または終了したら、反対の操作を実行して画面を元に戻します。また、カーソルアドレッシングモードを使用するプログラムがフルスクリーンのサイズではなくマージン領域のサイズを知ることができるように、ラインルールに保存されている端末のサイズに関する情報を正しく維持する必要があります。
最初はこんな感じ
printf '\e[%d;%dr\e[?69h\e[%d;%ds\e[?6h\e[H'')] 5 20 5 65 stty 行 15 列 60 ping www.google.com printf '\e[?6l\e[s\e[?69l\e[r'] stty 行 25 列 80スクリプトの終了時にクリーンアップの動作を大幅に改善し、行ルールの行と列を復元する方が賢明です。正しい(簡潔さのために私がしたように間違った仮定をする代わりに)。
より少ない機能のために、これらの端末エミュレータは上下の余白を尊重しますが、ここで特に必要な左右の余白メカニズムはありません。
- UrxVT
- 戻る
- 用語
- パテ
メイン画面バッファとバックアップ画面バッファの余白を別々に設定する必要があります。したがって、カーソルアドレッシングモードに切り替えるときに代替画面バッファに切り替えるプログラムはこれに影響されません。このグループには、NeoVIM などのプログラムと少数のプログラムが含まれます。カーソルアドレス指定プログラムいいえただし、代替画面バッファに切り替えられます。後者のグループには、Z シェルの ZLE などの項目が含まれます。
追加読書
- VT420プログラマリファレンスマニュアル。 EK-VT420-RM-002. 1992年2月。数字。
- VT520/VT525 ビデオ端末プログラマ情報。 EK-VT520-RM。 1994年7月。数字。
- 文字セットエンコーディングのための制御機能.ECMA-48。 1991年。 ECMAインターナショナル。
- 情報技術 - ODA(オープンドキュメントアーキテクチャ)と交換フォーマット:ドキュメント構造。 T.412。 ITU。
- 情報技術 - ODA(オープンドキュメントアーキテクチャ)と交換形式:文字コンテンツアーキテクチャ。 T.416。 ITU。
- 情報技術 - ODA(オープンドキュメントアーキテクチャ)と交換形式:文字コンテンツアーキテクチャ。 ISO/IEC 8613-6:1994。国際標準化機構
- https://unix.stackexchange.com/a/289871/5132
- https://unix.stackexchange.com/a/243320/5132
答え3
短い答え:いいえ。
tput cup
ただし、各新しい行の前に1つをエクスポートすると、効果をシミュレートできます。たとえば、次のようになります。
i=5
tput clear
tput cup $i 15
ping google.com |
while read; do
tput cup $((++i)) 15
echo "$REPLY"
done
または単一の「コマンド」として:
i=5; tput clear; tput cup $i 15; ping google.com |
while read; do tput cup $((++i)) 15; echo "$REPLY"; done
カーソル操作の複雑さに応じてこれを行うこともできますncurses
。バッシュシンプルな呪い。