Class: RubyRich::LineEditor

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_rich/line_editor.rb

Constant Summary collapse

WORD_PATTERN =
/[^\s]+/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(multiline: false, history: [], history_path: nil, max_history: 200) ⇒ LineEditor

Returns a new instance of LineEditor.



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/ruby_rich/line_editor.rb', line 10

def initialize(multiline: false, history: [], history_path: nil, max_history: 200)
  @multiline = multiline
  @history_path = history_path
  @max_history = max_history
  @history = []
  @history_index = nil
  @chars = []
  @cursor = 0
  load_history
  history.each { |item| add_history(item, persist: false) }
end

Instance Attribute Details

#cursorObject (readonly)

Returns the value of attribute cursor.



7
8
9
# File 'lib/ruby_rich/line_editor.rb', line 7

def cursor
  @cursor
end

#historyObject (readonly)

Returns the value of attribute history.



7
8
9
# File 'lib/ruby_rich/line_editor.rb', line 7

def history
  @history
end

#history_pathObject

Returns the value of attribute history_path.



8
9
10
# File 'lib/ruby_rich/line_editor.rb', line 8

def history_path
  @history_path
end

#max_historyObject

Returns the value of attribute max_history.



8
9
10
# File 'lib/ruby_rich/line_editor.rb', line 8

def max_history
  @max_history
end

#multilineObject

Returns the value of attribute multiline.



8
9
10
# File 'lib/ruby_rich/line_editor.rb', line 8

def multiline
  @multiline
end

Instance Method Details

#add_history(text, persist: true) ⇒ Object



149
150
151
152
153
154
155
156
157
158
# File 'lib/ruby_rich/line_editor.rb', line 149

def add_history(text, persist: true)
  item = text.to_s
  return self if item.strip.empty?

  @history.delete(item)
  @history << item
  @history.shift while @history.length > @max_history
  persist_history if persist && @history_path
  self
end

#backspaceObject



60
61
62
63
64
65
66
# File 'lib/ruby_rich/line_editor.rb', line 60

def backspace
  return false if @cursor.zero?

  @chars.delete_at(@cursor - 1)
  @cursor -= 1
  true
end

#buffer_endObject



100
101
102
103
# File 'lib/ruby_rich/line_editor.rb', line 100

def buffer_end
  @cursor = @chars.length
  self
end

#buffer_startObject



95
96
97
98
# File 'lib/ruby_rich/line_editor.rb', line 95

def buffer_start
  @cursor = 0
  self
end

#clearObject



37
38
39
40
41
42
# File 'lib/ruby_rich/line_editor.rb', line 37

def clear
  @chars.clear
  @cursor = 0
  @history_index = nil
  self
end

#cursor_line_colObject



165
166
167
168
169
# File 'lib/ruby_rich/line_editor.rb', line 165

def cursor_line_col
  before = @chars[0...@cursor].join
  parts = before.empty? ? [""] : before.split("\n", -1)
  [parts.length - 1, parts.last.to_s.chars.length]
end

#deleteObject



68
69
70
71
72
73
# File 'lib/ruby_rich/line_editor.rb', line 68

def delete
  return false if @cursor >= @chars.length

  @chars.delete_at(@cursor)
  true
end

#empty?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/ruby_rich/line_editor.rb', line 33

def empty?
  @chars.empty?
end

#endObject



90
91
92
93
# File 'lib/ruby_rich/line_editor.rb', line 90

def end
  @cursor = current_line_end
  self
end

#homeObject



85
86
87
88
# File 'lib/ruby_rich/line_editor.rb', line 85

def home
  @cursor = current_line_start
  self
end

#insert(text) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/ruby_rich/line_editor.rb', line 44

def insert(text)
  incoming = normalize_insert_text(text)
  return self if incoming.empty?

  new_chars = incoming.chars
  @chars.insert(@cursor, *new_chars)
  @cursor += new_chars.length
  @history_index = nil
  self
end

#kill_to_endObject



117
118
119
120
121
122
# File 'lib/ruby_rich/line_editor.rb', line 117

def kill_to_end
  return false if @cursor >= @chars.length

  @chars.slice!(@cursor...current_line_end)
  true
end

#kill_to_startObject



124
125
126
127
128
129
130
131
# File 'lib/ruby_rich/line_editor.rb', line 124

def kill_to_start
  start = current_line_start
  return false if @cursor <= start

  @chars.slice!(start...@cursor)
  @cursor = start
  true
end

#kill_word_backObject



133
134
135
136
137
138
139
140
# File 'lib/ruby_rich/line_editor.rb', line 133

def kill_word_back
  return false if @cursor.zero?

  start = previous_word_start
  @chars.slice!(start...@cursor)
  @cursor = start
  true
end

#linesObject



160
161
162
163
# File 'lib/ruby_rich/line_editor.rb', line 160

def lines
  text = value
  text.empty? ? [""] : text.split("\n", -1)
end

#move_downObject



111
112
113
114
115
# File 'lib/ruby_rich/line_editor.rb', line 111

def move_down
  return history_next if !@multiline || single_empty_line? || @history_index

  move_vertical(1)
end

#move_leftObject



75
76
77
78
# File 'lib/ruby_rich/line_editor.rb', line 75

def move_left
  @cursor = [@cursor - 1, 0].max
  self
end

#move_rightObject



80
81
82
83
# File 'lib/ruby_rich/line_editor.rb', line 80

def move_right
  @cursor = [@cursor + 1, @chars.length].min
  self
end

#move_upObject



105
106
107
108
109
# File 'lib/ruby_rich/line_editor.rb', line 105

def move_up
  return history_previous if !@multiline || single_empty_line? || @history_index

  move_vertical(-1)
end

#newlineObject



55
56
57
58
# File 'lib/ruby_rich/line_editor.rb', line 55

def newline
  insert("\n") if @multiline
  self
end

#render_lines(width:, placeholder: nil, focused: true) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/ruby_rich/line_editor.rb', line 171

def render_lines(width:, placeholder: nil, focused: true)
  content = value
  return [placeholder.to_s] if content.empty? && placeholder

  rendered = []
  line_index, col = cursor_line_col
  lines.each_with_index do |line, index|
    marker_col = focused && index == line_index ? col : nil
    rendered.concat(wrap_line_with_cursor(line, width, marker_col))
  end
  rendered.empty? ? [""] : rendered
end

#submit_valueObject



142
143
144
145
146
147
# File 'lib/ruby_rich/line_editor.rb', line 142

def submit_value
   = value
  add_history() unless .strip.empty?
  clear
  
end

#valueObject



22
23
24
# File 'lib/ruby_rich/line_editor.rb', line 22

def value
  @chars.join
end

#value=(text) ⇒ Object



26
27
28
29
30
31
# File 'lib/ruby_rich/line_editor.rb', line 26

def value=(text)
  @chars = text.to_s.chars
  @cursor = @chars.length
  @history_index = nil
  self
end