Module: Terminal

Defined in:
lib/terminal.rb,
lib/terminal/ansi.rb,
lib/terminal/text.rb,
lib/terminal/input.rb,
lib/terminal/shell.rb,
lib/terminal/detect.rb,
lib/terminal/output.rb,
lib/terminal/version.rb,
lib/terminal/input/ansi.rb,
lib/terminal/input/dumb.rb,
lib/terminal/output/ansi.rb,
lib/terminal/output/dumb.rb,
lib/terminal/input/key_event.rb,
lib/terminal/text/char_width.rb,
lib/terminal/ansi/named_colors.rb

Overview

Terminal access with support for ANSI control codes and BBCode-like embedded text attribute syntax (see Ansi.bbcode). It automagically detects whether your terminal supports ANSI features, like coloring (see Terminal.colors) or the CSIu protocol support (see Terminal.read_key_event, Terminal.on_key_event and Terminal.input_mode). It calculates the display width for Unicode chars (see Text.width) and help you to display text with word-wise line breaks (see Text.each_line).

Defined Under Namespace

Modules: Ansi, Text Classes: KeyEvent

Constant Summary collapse

VERSION =

The version number of the gem.

'0.20.0'

Attributes collapse

Output attributes collapse

Tool methods collapse

Input methods collapse

Output methods collapse

Output helper methods collapse

Class Attribute Details

.ansi?true, false (readonly)

Returns whether ANSI control codes are supported for output.

See Also:



# File 'lib/terminal/output.rb', line 41


.applicationSymbol? (readonly)

Terminal application identifier.

The detection supports a wide range of terminal emulators but may return nil if an unsupported terminal was found. These are the supported application IDs: :alacritty, :amiga, :code_edit, :dg_unix, :docker, :fluent, :hpterm, :hyper, :iterm, :macos, :mintty, :ms_terminal, :ncr260, :nsterm, :terminator, :terminology, :termite, :vt100, :warp, :wezterm, :wyse, :xnuppc



34
# File 'lib/terminal.rb', line 34

def application = (@application ||= Detect.application)

.colorsInteger (readonly)

Number of supported colors. The detection checks various conditions to find the correct value. The most common values are

  • 16_777_216 for 24-bit encoding (true_color? return true)
  • 256 for 8-Bit encoding
  • 52 for some Unix terminals with an extended color palette
  • 8 for 3-/4-bit encoding
  • 2 if ANSI is not supported in general (ansi? return false)


# File 'lib/terminal/output.rb', line 49


.columnsInteger

Screen column count. See size for support and detection details.



79
80
81
# File 'lib/terminal/output.rb', line 79

def columns = size[1]
#
# @attribute [w] columns

.input_mode:csi_u, ... (readonly)

Supported input mode.



# File 'lib/terminal/input.rb', line 8


.output_mode:ansi, ... (readonly)

Supported output mode.



# File 'lib/terminal/output.rb', line 22


.pos[Integer, Integer]?

Current cursor position. This is only available when ANSI is supported (ansi? return true).



# File 'lib/terminal/output.rb', line 94


.rowsInteger

Screen row count. See size for support and detection details.



90
91
92
# File 'lib/terminal/output.rb', line 90

def rows = size[0]
#
# @attribute [w] rows

.size[Integer, Integer]

Screen size as a tuple of rows and columns.

If the terminal does not support the report of it's dimension or ANSI is not supported in general then environment variables COLUMNS and LINES will be used. If this failed [25, 80] will be returned as default.

Setting the terminal size is not widely supported.

See Also:



# File 'lib/terminal/output.rb', line 106


.true_color?true, false (readonly)

Returns whether true colors are supported.

See Also:



70
# File 'lib/terminal/output.rb', line 70

def true_color? = (colors == 16_777_216)

.tui?true, false (readonly)

Return true if the current terminal supports ANSI control codes for input and output. In this case not only all output methods (<<, print, puts) will forward ANSI control codes to the terminal and translate BBCode (see Terminal::Ansi.bbcode). But also the input methods read_key_event and on_key_event will support extended key codes, mouse and focus events.

See Also:



# File 'lib/terminal/output.rb', line 7


Class Method Details

.<<(object) ⇒ Terminal

Writes the given object to the terminal. Interprets embedded BBCode (see Terminal::Ansi.bbcode).



# File 'lib/terminal/output.rb', line 129


.hide_alt_screenTerminal

Hide the alternate screen. Will not send the control code if the alternate screen is not used.

When you called show_alt_screen n-times you need to call hide_alt_screen n-times to show the default screen again.



# File 'lib/terminal/output.rb', line 193


.hide_cursorTerminal

Hide the cursor. Will not send the control code if the cursor is already hidden.

When you called hide_cursor n-times you need to call show_cursor n-times to show the cursor again.



# File 'lib/terminal/output.rb', line 163


.on_key_event(mouse: false, mouse_move: false, focus: false) {|event| ... } ⇒ true, ...

Event loop for key and mouse events.

Yield Parameters:

Yield Returns:

  • (true, false)

    whether the loop should be continued



# File 'lib/terminal/input.rb', line 32


.on_resize(&block) ⇒ Terminal

Define callback executed when terminal is resized



206
207
208
209
# File 'lib/terminal/output.rb', line 206

def on_resize(&block)
  block ? @on_resize = block : @on_resize&.call
  self
end

Writes the given objects to the terminal. Optionally interprets embedded BBCode (see Terminal::Ansi.bbcode).



# File 'lib/terminal/output.rb', line 137


.puts(*objects, bbcode: true) ⇒ nil

Writes the given objects to the terminal. Writes a newline after each object that does not already end with a newline sequence in it's String represenation. If called without any arguments, writes a newline only.

Optionally interprets embedded BBCode (see Terminal::Ansi.bbcode).



# File 'lib/terminal/output.rb', line 146


.read_key_eventKeyEvent?

Read next KeyEvent from standard input.



# File 'lib/terminal/input.rb', line 26


.sh(*cmd, **options) ⇒ [Process::Status, output, error]? .sh(*cmd, **options) {|line, type| ... } ⇒ Process::Status?

Execute a command and report command output line by line or capture the output.

Examples:

Execute a command wih arguments

ret, out, = Terminal.sh('curl', '--version')
raise('command not found - curl') unless ret
puts out

Execute shell commands and print error

ret, _, err = Terminal.sh("mkdir '/test' && cd '/test'")
raise('unable to execute') unless ret
puts("error #{ret.exitstatus}: #{err.join}") unless ret.success?

Copy a file content to clipboard

command = ENV.fetch('CLIP_COPY', 'pbcopy')
File.open(__FILE__) do |file|
  ret, = Terminal.sh(*command, input: file)
  raise("command not found - #{command}") unless ret
end

Overloads:

  • .sh(*cmd, **options) {|line, type| ... } ⇒ Process::Status?

    Yield Parameters:

    • line (String)

      next received line from the process

    • type (:output, :error)

      whether the received line is standard output or error

Options Hash (**options):

  • :env (Hash<String,String>)

    key/value pairs added to the ENV of the process; with option :unsetenv_others set to true it replaces the ENV

  • :shell (true, false)

    whether to create a seperate shell or not

  • :input (#readpartial, #to_io, Array, #each, #to_a, #to_s)

    piped to the command as input

Raises:

  • (ArgumentError)

    when command is missing



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/terminal.rb', line 91

def sh(*cmd, **options, &block)
  raise(ArgumentError, 'command expected') if cmd.empty?
  return Shell.exec(cmd, **options, &block) if block_given?
  out = []
  err = []
  [
    Shell.exec(cmd, **options) do |line, type|
      (type == :error ? err : out) << line
    end,
    out,
    err
  ]
end

.show_alt_screenTerminal

Show the alternate screen. Will not send the control code if the alternate screen is already used.

When you called show_alt_screen n-times you need to call hide_alt_screen n-times to show the default screen again.



# File 'lib/terminal/output.rb', line 183


.show_cursorTerminal

Show the cursor. Will not send the control code if the cursor is not hidden.

When you called hide_cursor n-times you need to call show_cursor n-times to show the cursor again.



# File 'lib/terminal/output.rb', line 173