class TTY::Reader::History

A class responsible for storing a history of all lines entered by user when interacting with shell prompt.

@api private

Constants

DEFAULT_EXCLUDE

Default exclude

DEFAULT_SIZE

Default maximum size

Attributes

cycle[RW]

Decides whether or not to allow cycling through stored lines.

@return [Boolean]

@api public

duplicates[RW]

Decides wether or not duplicate lines are stored.

@return [Boolean]

@api public

exclude[RW]

Dictates which lines are stored.

@return [Proc]

@public

index[R]

The current index

@return [Integer]

@api private

max_size[RW]

Set and retrieve the maximum size of the buffer

Public Class Methods

new(max_size = DEFAULT_SIZE, duplicates: true, cycle: false, exclude: DEFAULT_EXCLUDE) { |self| ... } click to toggle source

Create a History buffer

@param [Integer] max_size

the maximum size for history buffer

@param [Boolean] cycle

whether or not the history should cycle, false by default

@param [Boolean] duplicates

whether or not to store duplicates, true by default

@param [Boolean] exclude

a Proc to exclude items from storing in history

@api public

# File lib/tty/reader/history.rb, line 66
def initialize(max_size = DEFAULT_SIZE, duplicates: true, cycle: false,
               exclude: DEFAULT_EXCLUDE)
  @max_size   = max_size
  @index      = nil
  @history    = []
  @duplicates = duplicates
  @exclude    = exclude
  @cycle      = cycle

  yield self if block_given?
end

Public Instance Methods

<<(line)
Alias for: push
[](index) click to toggle source

Return line at the specified index

@raise [IndexError] index out of range

@api public

# File lib/tty/reader/history.rb, line 143
def [](index)
  if index < 0
    index += @history.size if index < 0
  end
  line = @history[index]
  if line.nil?
    raise IndexError, "invalid index"
  end
  line.dup
end
clear() click to toggle source

Empty all history lines

@api public

# File lib/tty/reader/history.rb, line 166
def clear
  @history.clear
  @index = 0
end
each(&block) click to toggle source

Iterates over history lines

@api public

# File lib/tty/reader/history.rb, line 81
def each(&block)
  if block_given?
    @history.each(&block)
  else
    @history.to_enum
  end
end
get() click to toggle source

Get current line

@api public

# File lib/tty/reader/history.rb, line 157
def get
  return if size.zero?

  self[@index]
end
next() click to toggle source

Move the pointer to the next line in the history

@api public

# File lib/tty/reader/history.rb, line 109
def next
  return if size.zero?

  if @index == size - 1
    @index = 0 if @cycle
  else
    @index += 1
  end
end
next?() click to toggle source
# File lib/tty/reader/history.rb, line 119
def next?
  size > 0 && !(@index == size - 1 && !@cycle)
end
previous() click to toggle source

Move the pointer to the previous line in the history

# File lib/tty/reader/history.rb, line 124
def previous
  return if size.zero?

  if @index.zero?
    @index = size - 1 if @cycle
  else
    @index -= 1
  end
end
previous?() click to toggle source
# File lib/tty/reader/history.rb, line 134
def previous?
  size > 0 && !(@index < 0 && !@cycle)
end
push(line) click to toggle source

Add the last typed line to history buffer

@param [String] line

@api public

# File lib/tty/reader/history.rb, line 94
def push(line)
  @history.delete(line) unless @duplicates
  return if line.to_s.empty? || @exclude[line]

  @history.shift if size >= max_size
  @history << line
  @index = @history.size - 1

  self
end
Also aliased as: <<