web-dev-qa-db-ja.com

tputで複数行の配置は可能ですか?

カーソルを特定の行/列に置き、最初の座標に揃えられたままの複数行のファイル/コマンドを印刷したいので、

tput clear
tput cup 5 15
ping www.google.com

15番目の列に後続のすべての行を出力します。そのままでは、最初の行は正しく印刷されますが、次の行は左側にリセットされます。 tputまたは他の方法を使用することは可能ですか?

2
Radvansky

そのための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 -
_

これは端末の動作に影響を及ぼし、たとえば一時停止したときに問題を引き起こす可能性があります。

@Thorのcupベースのアプローチに対する利点は、送信する出力が少なく(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_ も参照してください。

3

簡単な答え:いいえ。

ただし、新しい行ごとにtput cupを発行することで、効果をシミュレートできます。例:

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に実装することをお勧めします。別の選択肢は Bash Simple Curses かもしれません。

0
Thor