Class: MiniReadline::Edit

Inherits:
Object
  • Object
show all
Defined in:
lib/mini_readline/read_line/edit.rb,
lib/mini_readline/read_line/edit/enter.rb,
lib/mini_readline/read_line/edit/cancel.rb,
lib/mini_readline/read_line/edit/go_end.rb,
lib/mini_readline/read_line/edit/go_home.rb,
lib/mini_readline/read_line/edit/go_left.rb,
lib/mini_readline/read_line/edit/go_right.rb,
lib/mini_readline/read_line/edit/unmapped.rb,
lib/mini_readline/read_line/edit/word_left.rb,
lib/mini_readline/read_line/edit/word_right.rb,
lib/mini_readline/read_line/edit/delete_left.rb,
lib/mini_readline/read_line/edit/insert_text.rb,
lib/mini_readline/read_line/edit/delete_right.rb,
lib/mini_readline/read_line/edit/end_of_input.rb,
lib/mini_readline/read_line/edit/next_history.rb,
lib/mini_readline/read_line/edit/auto_complete.rb,
lib/mini_readline/read_line/edit/delete_all_left.rb,
lib/mini_readline/read_line/edit/delete_all_right.rb,
lib/mini_readline/read_line/edit/previous_history.rb

Overview

Process :previous_history

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(history, options) ⇒ Edit

Set up the edit instance.



39
40
41
42
43
44
45
46
47
# File 'lib/mini_readline/read_line/edit.rb', line 39

def initialize(history, options)
  @options     = options
  @history     = history
  @edit_buffer = @options[:initial]
  @edit_posn   = @edit_buffer.length
  @working     = true

  @edit_window = EditWindow.new(@options)
end

Instance Attribute Details

#edit_bufferObject (readonly)

The main edit buffer



50
51
52
# File 'lib/mini_readline/read_line/edit.rb', line 50

def edit_buffer
  @edit_buffer
end

#edit_posnObject (readonly)

The current edit position



53
54
55
# File 'lib/mini_readline/read_line/edit.rb', line 53

def edit_posn
  @edit_posn
end

Instance Method Details

#auto_complete(_keyboard_args) ⇒ Object

The auto-complete command.



19
20
21
22
23
24
25
26
# File 'lib/mini_readline/read_line/edit/auto_complete.rb', line 19

def auto_complete(_keyboard_args)
  if @options[:auto_complete] && (new_buffer = auto_manager.next(auto_trim))
    @edit_buffer = new_buffer
    @edit_posn   = length
  else
    MiniTerm.beep
  end
end

#auto_managerObject

Get the auto-complete manager



34
35
36
# File 'lib/mini_readline/read_line/edit/auto_complete.rb', line 34

def auto_manager
  @_auto_manager ||= AutoManager.new{@options[:auto_source].new(@options)}
end

#auto_trimObject

Get the base part of the edit buffer.



29
30
31
# File 'lib/mini_readline/read_line/edit/auto_complete.rb', line 29

def auto_trim
  @edit_buffer[0...(@edit_posn)]
end

#cancel(_keyboard_args) ⇒ Object

All right! Scrap all of this and start over!



10
11
12
13
# File 'lib/mini_readline/read_line/edit/cancel.rb', line 10

def cancel(_keyboard_args)
  @edit_buffer = ""
  @edit_posn = 0
end

#delete_all_left(_keyboard_args) ⇒ Object

The delete to the left command



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/delete_all_left.rb', line 10

def delete_all_left(_keyboard_args)
  if @edit_posn > 0
    @edit_buffer = @edit_buffer[@edit_posn..-1]
    @edit_posn = 0
  else
    MiniTerm.beep
  end
end

#delete_all_right(_keyboard_args) ⇒ Object

The delete to the right



10
11
12
13
14
15
16
# File 'lib/mini_readline/read_line/edit/delete_all_right.rb', line 10

def delete_all_right(_keyboard_args)
  if @edit_posn < self.length
    @edit_buffer = @edit_buffer[0...@edit_posn]
  else
    MiniTerm.beep
  end
end

#delete_left(_keyboard_args) ⇒ Object

The delete to the left command



10
11
12
13
14
15
16
17
18
19
# File 'lib/mini_readline/read_line/edit/delete_left.rb', line 10

def delete_left(_keyboard_args)
  if @edit_posn > 0
    @edit_buffer = @edit_buffer[0...(@edit_posn-1)] +
                   @edit_buffer[@edit_posn..-1]

    @edit_posn -= 1
  else
    MiniTerm.beep
  end
end

#delete_right(_keyboard_args) ⇒ Object

The delete to the right



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/delete_right.rb', line 10

def delete_right(_keyboard_args)
  if @edit_posn < self.length
    @edit_buffer = @edit_buffer[0...(@edit_posn)] +
                   @edit_buffer[@edit_posn+1..-1]
  else
    MiniTerm.beep
  end
end

#edit_loopObject

The line editor processing loop.



68
69
70
71
72
73
74
75
76
# File 'lib/mini_readline/read_line/edit.rb', line 68

def edit_loop
  while @working
    @edit_window.sync_window(edit_buffer, edit_posn)
    @edit_window.sync_cursor(edit_posn)
    process_keystroke(MiniTerm.get_mapped_char)
  end

  edit_buffer
end

#edit_processObject

Interact with the user



61
62
63
64
65
# File 'lib/mini_readline/read_line/edit.rb', line 61

def edit_process
  result = edit_loop
  @history.append_history(result)
  result + (@options[:chomp] ? "" : "\n")
end

#end_of_input(_keyboard_args) ⇒ Object

We are DONE!



10
11
12
13
14
15
16
# File 'lib/mini_readline/read_line/edit/end_of_input.rb', line 10

def end_of_input(_keyboard_args)
  if @options[:eoi_detect]
    raise MiniReadlineEOI, "End of input detected."
  else
    MiniTerm.beep
  end
end

#enter(_keyboard_args) ⇒ Object

The insert_text command.



10
11
12
# File 'lib/mini_readline/read_line/edit/enter.rb', line 10

def enter(_keyboard_args)
  @working = false
end

#go_end(_keyboard_args) ⇒ Object

A lot to the right please!



10
11
12
# File 'lib/mini_readline/read_line/edit/go_end.rb', line 10

def go_end(_keyboard_args)
  @edit_posn = length
end

#go_home(_keyboard_args) ⇒ Object

A lot to the left please!



10
11
12
# File 'lib/mini_readline/read_line/edit/go_home.rb', line 10

def go_home(_keyboard_args)
  @edit_posn = 0
end

#go_left(_keyboard_args) ⇒ Object

A little to the left please!



10
11
12
13
14
15
16
# File 'lib/mini_readline/read_line/edit/go_left.rb', line 10

def go_left(_keyboard_args)
  if @edit_posn > 0
    @edit_posn -= 1
  else
    MiniTerm.beep
  end
end

#go_right(_keyboard_args) ⇒ Object

A little to the right please!



10
11
12
13
14
15
16
# File 'lib/mini_readline/read_line/edit/go_right.rb', line 10

def go_right(_keyboard_args)
  if @edit_posn < edit_buffer.length
    @edit_posn += 1
  else
    MiniTerm.beep
  end
end

#insert_text(keyboard_args) ⇒ Object

The insert_text command



10
11
12
13
14
15
16
# File 'lib/mini_readline/read_line/edit/insert_text.rb', line 10

def insert_text(keyboard_args)
  @edit_buffer = @edit_buffer[0...@edit_posn] +
                 keyboard_args[1] +
                 @edit_buffer[@edit_posn..-1]

  @edit_posn += 1
end

#lengthObject

How long is the current string?



56
57
58
# File 'lib/mini_readline/read_line/edit.rb', line 56

def length
  edit_buffer.length
end

#next_history(_keyboard_args) ⇒ Object

The insert_text command. We are DONE!



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/next_history.rb', line 10

def next_history(_keyboard_args)
  if (temp = @history.get_next_history)
    @edit_buffer = temp
    @edit_posn   = temp.length
  else
    MiniTerm.beep
  end
end

#previous_history(_keyboard_args) ⇒ Object

The insert_text command. We are DONE!



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/previous_history.rb', line 10

def previous_history(_keyboard_args)
  if (temp = @history.get_previous_history)
    @edit_buffer = temp
    @edit_posn   = temp.length
  else
    MiniTerm.beep
  end
end

#process_keystroke(key_cmd) ⇒ Object

Process a keystroke.



79
80
81
# File 'lib/mini_readline/read_line/edit.rb', line 79

def process_keystroke(key_cmd)
  send(key_cmd[0], key_cmd)
end

#unmapped(_keyboard_args) ⇒ Object

An unmapped key was pressed. Beep! :reek:UtilityFunction – Does not depend on state.



11
12
13
# File 'lib/mini_readline/read_line/edit/unmapped.rb', line 11

def unmapped(_keyboard_args)
  MiniTerm.beep
end

#word_left(_keyboard_args) ⇒ Object

A little more to the left please!



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/word_left.rb', line 10

def word_left(_keyboard_args)
  if @edit_posn > 0
    left = @edit_buffer[0...@edit_posn]
    @edit_posn = (posn = left.rindex(/\s\S/)) ? posn+1 : 0
  else
    MiniTerm.beep
  end
end

#word_right(_keyboard_args) ⇒ Object

A little more to the right please!



10
11
12
13
14
15
16
17
# File 'lib/mini_readline/read_line/edit/word_right.rb', line 10

def word_right(_keyboard_args)
  if @edit_posn < length
    right = @edit_buffer[(@edit_posn+1)..-1]
    @edit_posn = (posn = right.index(/\s\S/)) ? @edit_posn+posn+2 : length
  else
    MiniTerm.beep
  end
end