Module: Amun::Behaviours::Emacs

Included in:
MajorModes::Fundamental
Defined in:
lib/amun/behaviours/emacs.rb

Instance Method Summary collapse

Instance Method Details

#backward_charObject



41
42
43
44
# File 'lib/amun/behaviours/emacs.rb', line 41

def backward_char(*)
  buffer.point -= 1
  true
end

#backward_delete_charObject



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_wordObject

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_lineObject



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_charObject



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_lineObject



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_charObject



36
37
38
39
# File 'lib/amun/behaviours/emacs.rb', line 36

def forward_char(*)
  buffer.point += 1
  true
end

#forward_delete_charObject



95
96
97
# File 'lib/amun/behaviours/emacs.rb', line 95

def forward_delete_char(*)
  delete_char
end

#kill_lineObject

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_wordObject

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_lineObject



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_lineObject



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