Termisu v0.0.2 🍮

Hello again :waving_hand:!

Quick update on Termisu. It’s grown up a bit since my intro post. Just shipped v0.0.2!

Little screen capture:
termisu-ball-demo

What you get:

  • Cell-based rendering with double buffering and smart diffing
  • Async events via fibers + channels (keyboard, mouse, resize, timers)
  • Colors - ANSI 8/256, RGB, grayscale (Color.red, Color.rgb(255, 100, 50))
  • Attributes - bold, dim, italic, underline, blink, reverse
  • Input - full key detection with modifiers, case-insensitive helpers (key.q?, key.ctrl?)

code example:

termisu = Termisu.new

begin
  termisu.enable_timer(16.milliseconds) # ~60fps
  attr = Termisu::Attribute::Bold | Termisu::Attribute::Underline
  termisu.set_cell(0, 0, 'H', fg: Termisu::Color.red, attr: attr)
  termisu.set_cell(1, 0, 'i', fg: Termisu::Color.green, attr: attr)

  termisu.set_cursor(3, 0)

  termisu.render

  termisu.each_event do |event|
    case event
    when Termisu::Event::Key
      break if event.key.q? || event.ctrl_c?
    when Termisu::Event::Mouse
      termisu.set_cell(event.x - 1, event.y - 1, '*', fg: Termisu::Color.yellow)
      termisu.render
    when Termisu::Event::Resize
      termisu.sync
    when Termisu::Event::Tick
      # animate stuff ✨
    end
  end
ensure
  termisu.close
end

zero dependencies beyond stdlib.

Source: GitHub - omarluq/termisu: A minimalistic API for writing text-based user interfaces in pure Crystal
Docs: termisu main-dev

Would love feedback. What would make this useful for your projects?

10 Likes