Skip to content

Instantly share code, notes, and snippets.

@tompng
Created October 17, 2023 10:39
Show Gist options
  • Save tompng/571959391c84087a5380be04c43d8b86 to your computer and use it in GitHub Desktop.
Save tompng/571959391c84087a5380be04c43d8b86 to your computer and use it in GitHub Desktop.
ステータス下に出すやつ
require 'io/console'
num_status_lines = 4
$SYMBOLS = Symbol.all_symbols
def status
bold = "\e[1m"
red = "\e[31m"
green = "\e[32m"
reset = "\e[m"
[
"#{bold}[#{Time.now.to_i % 1234}/#{1234}]#{reset}",
*3.times.map do |i|
"#{$$ + i}=#{[red, green].sample}mtest_#{$SYMBOLS.sample}#{reset} (#{$SYMBOLS.sample(rand 1..3).join(' ')})"
end
]
end
Thread.new do
(1..).each do |i|
print "log: #{i}#{rand < 0.8 ? ' ' : "\n"}"
sleep 0.02
end
end
# カーソルの下にステータス行分の空きを確保(ステータスの行数分改行、カーソルを上移動)
STDOUT.print "#{"\n" * num_status_lines}\e[#{num_status_lines}A"
height = nil
begin
loop do
height, width = IO.console.winsize rescue [24, 80]
# カーソルを下に移動して上に移動することで、ステータス領域にカーソルがないことを保証する(ウィンドウサイズを変えた時などにステータス行にあることがある)
output = +''
output << "\e[#{num_status_lines}B\e[#{num_status_lines}A"
output << "\e7" # カーソル位置を保存
output << "\e[1;#{height - num_status_lines}r" # スクロール範囲を設定 (winsize変わってるかもしれないので都度設定)
output << "\e[#{height - num_status_lines + 1};1H" # カーソルをステータス行に移動
output << status.map { "\e[K#{_1[0, width]}" }.join("\n")
output << "\e8" # カーソル位置を復元
STDOUT.print output # 割り込まれないように一気に出力
sleep 0.5
end
ensure
STDOUT.print "\e[r" # スクロール範囲を解除
STDOUT.print "\e[#{height}H\n" if height # 画面下にカーソルを移動しておく
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment