Module: Amun::Behaviours::Emacs
- Included in:
- MajorModes::Fundamental
- Defined in:
- lib/amun/behaviours/emacs.rb
Instance Method Summary collapse
- #backward_char ⇒ Object
- #backward_delete_char ⇒ Object
-
#backward_kill_word ⇒ Object
This should be bound to M-BACKSPACE or M-DEL but I think the terminal doesn’t send it So the implementation will remain there until we find a way to catch this key.
- #beginning_of_line ⇒ Object
- #delete_char ⇒ Object
- #emacs_behaviour_initialize(event_manager) ⇒ Object
- #end_of_line ⇒ Object
- #forward_char ⇒ Object
- #forward_delete_char ⇒ Object
-
#kill_line ⇒ Object
TODO should move text to kill ring.
-
#kill_word ⇒ Object
TODO should move text to kill ring.
- #next_line ⇒ Object
- #previous_line ⇒ Object
Instance Method Details
#backward_char ⇒ Object
41 42 43 44 |
# File 'lib/amun/behaviours/emacs.rb', line 41 def backward_char(*) buffer.point -= 1 true end |
#backward_delete_char ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/amun/behaviours/emacs.rb', line 87 def backward_delete_char(*) return true if buffer.point.zero? buffer.point -= 1 buffer.text.slice!(buffer.point) true end |
#backward_kill_word ⇒ Object
This should be bound to M-BACKSPACE or M-DEL but I think the terminal doesn’t send it So the implementation will remain there until we find a way to catch this key
TODO should move text to kill ring
123 124 125 126 127 128 |
# File 'lib/amun/behaviours/emacs.rb', line 123 def backward_kill_word(*) first_letter_backward = buffer.text.rindex(/\p{L}/, buffer.point) || 0 first_non_letter_before_word = buffer.text.rindex(/\P{L}/, first_letter_backward) || -1 buffer.text.slice!(first_non_letter_before_word + 1 .. buffer.point) true end |
#beginning_of_line ⇒ Object
63 64 65 66 67 68 69 70 71 |
# File 'lib/amun/behaviours/emacs.rb', line 63 def beginning_of_line(*) point = buffer.point return true if point.zero? return true if buffer.text[point - 1] == "\n" line_start = buffer.text.rindex("\n", point - 1) buffer.point = line_start.nil? ? 0 : line_start + 1 true end |
#delete_char ⇒ Object
82 83 84 85 |
# File 'lib/amun/behaviours/emacs.rb', line 82 def delete_char(*) buffer.text.slice!(buffer.point) true end |
#emacs_behaviour_initialize(event_manager) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/amun/behaviours/emacs.rb', line 7 def emacs_behaviour_initialize(event_manager) event_manager.bind "\C-f", self, :forward_char event_manager.bind Curses::KEY_RIGHT.to_s, self, :forward_char event_manager.bind "\C-b", self, :backward_char event_manager.bind Curses::KEY_LEFT.to_s, self, :backward_char event_manager.bind "\C-n", self, :next_line event_manager.bind Curses::KEY_DOWN.to_s, self, :next_line event_manager.bind "\C-p", self, :previous_line event_manager.bind Curses::KEY_UP.to_s, self, :previous_line event_manager.bind "\C-a", self, :beginning_of_line event_manager.bind Curses::KEY_HOME.to_s, self, :beginning_of_line event_manager.bind "\C-e", self, :end_of_line event_manager.bind Curses::KEY_END.to_s, self, :end_of_line event_manager.bind "\C-d", self, :delete_char event_manager.bind Curses::Key::BACKSPACE.to_s, self, :backward_delete_char # this doesn't work, check linux event_manager.bind "\C-?", self, :backward_delete_char # C-? is backspace on mac terminal for some reason event_manager.bind Curses::Key::DC.to_s, self, :forward_delete_char event_manager.bind "\C-k", self, :kill_line event_manager.bind "\M-d", self, :kill_word end |
#end_of_line ⇒ Object
73 74 75 76 77 78 79 80 |
# File 'lib/amun/behaviours/emacs.rb', line 73 def end_of_line(*) point = buffer.point return true if buffer.text[point] == "\n" line_end = buffer.text.index("\n", point) buffer.point = line_end || buffer.text.length true end |
#forward_char ⇒ Object
36 37 38 39 |
# File 'lib/amun/behaviours/emacs.rb', line 36 def forward_char(*) buffer.point += 1 true end |
#forward_delete_char ⇒ Object
95 96 97 |
# File 'lib/amun/behaviours/emacs.rb', line 95 def forward_delete_char(*) delete_char end |
#kill_line ⇒ Object
TODO should move text to kill ring
100 101 102 103 104 105 106 107 108 109 |
# File 'lib/amun/behaviours/emacs.rb', line 100 def kill_line(*) if buffer.text[buffer.point] == "\n" buffer.text.slice!(buffer.point) return true end line_end = buffer.text.index(/$/, buffer.point) buffer.text.slice!(buffer.point...line_end) true end |
#kill_word ⇒ Object
TODO should move text to kill ring
112 113 114 115 116 117 |
# File 'lib/amun/behaviours/emacs.rb', line 112 def kill_word(*) first_non_letter = buffer.text.index(/\P{L}/, buffer.point) || buffer.text.size word_beginning = buffer.text.index(/\p{L}/, first_non_letter) || buffer.text.size buffer.text.slice!(buffer.point...word_beginning) true end |
#next_line ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/amun/behaviours/emacs.rb', line 46 def next_line(*) line_begin = buffer.text.rindex("\n", buffer.point) || 0 line_end = buffer.text.index("\n", buffer.point + 1) || buffer.text.size + 1 next_line_end = buffer.text.index("\n", line_end + 1) || buffer.text.size + 1 point_offset = buffer.point - line_begin buffer.point = [line_end + point_offset, next_line_end].min true end |
#previous_line ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/amun/behaviours/emacs.rb', line 55 def previous_line(*) line_begin = buffer.text.rindex("\n", buffer.point) || 0 previous_line_begin = buffer.text.rindex("\n", line_begin - 1) || 0 point_offset = buffer.point - line_begin buffer.point = [previous_line_begin + point_offset, line_begin - 1].min true end |