vimamsa 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/custom_example.rb +12 -0
  3. data/lib/vimamsa/ack.rb +3 -4
  4. data/lib/vimamsa/actions.rb +1 -2
  5. data/lib/vimamsa/audio.rb +25 -1
  6. data/lib/vimamsa/buffer.rb +116 -591
  7. data/lib/vimamsa/buffer_changetext.rb +272 -0
  8. data/lib/vimamsa/buffer_cursor.rb +303 -0
  9. data/lib/vimamsa/buffer_list.rb +137 -133
  10. data/lib/vimamsa/buffer_manager.rb +15 -15
  11. data/lib/vimamsa/clipboard.rb +36 -0
  12. data/lib/vimamsa/conf.rb +136 -5
  13. data/lib/vimamsa/constants.rb +0 -10
  14. data/lib/vimamsa/debug.rb +9 -8
  15. data/lib/vimamsa/editor.rb +57 -84
  16. data/lib/vimamsa/encrypt.rb +6 -11
  17. data/lib/vimamsa/file_history.rb +0 -8
  18. data/lib/vimamsa/file_manager.rb +142 -10
  19. data/lib/vimamsa/gui.rb +106 -85
  20. data/lib/vimamsa/gui_dialog.rb +113 -0
  21. data/lib/vimamsa/gui_menu.rb +5 -1
  22. data/lib/vimamsa/gui_sourceview.rb +46 -29
  23. data/lib/vimamsa/gui_sourceview_autocomplete.rb +141 -0
  24. data/lib/vimamsa/gui_text.rb +49 -0
  25. data/lib/vimamsa/hyper_plain_text.rb +19 -5
  26. data/lib/vimamsa/key_actions.rb +41 -202
  27. data/lib/vimamsa/key_binding_tree.rb +129 -41
  28. data/lib/vimamsa/key_bindings_vimlike.rb +58 -48
  29. data/lib/vimamsa/langservp.rb +23 -3
  30. data/lib/vimamsa/macro.rb +35 -25
  31. data/lib/vimamsa/main.rb +7 -10
  32. data/lib/vimamsa/rbvma.rb +13 -11
  33. data/lib/vimamsa/search.rb +1 -1
  34. data/lib/vimamsa/search_replace.rb +106 -160
  35. data/lib/vimamsa/terminal.rb +34 -0
  36. data/lib/vimamsa/tests.rb +122 -0
  37. data/lib/vimamsa/util.rb +43 -4
  38. data/lib/vimamsa/version.rb +1 -1
  39. data/vimamsa.gemspec +5 -2
  40. metadata +59 -9
  41. /data/lib/vimamsa/{form_generator.rb → gui_form_generator.rb} +0 -0
@@ -0,0 +1,141 @@
1
+ # require "trie"
2
+ require "rambling-trie"
3
+
4
+ class Autocomplete
5
+ @@trie = Rambling::Trie.create
6
+
7
+ def self.init
8
+ vma.hook.register(:file_saved, self.method("update_index"))
9
+ end
10
+
11
+ def self.update_index(bu)
12
+ debug "self.update_index", 2
13
+ add_words bu.scan_all_words
14
+ end
15
+
16
+ def self.update_dict
17
+ for bu in vma.buffers.list
18
+ for w in bu.scan_all_words
19
+ trie << w
20
+ end
21
+ end
22
+ @@trie = trie
23
+ end
24
+
25
+ def self.add_words(words)
26
+ for w in words
27
+ @@trie << w
28
+ end
29
+ end
30
+
31
+ def self.word_list
32
+ return @@dict.keys
33
+ end
34
+
35
+ def self.matching_words(beginning)
36
+ return @@trie.scan(beginning)
37
+ end
38
+ end
39
+
40
+ class VSourceView < GtkSource::View
41
+ def hide_completions
42
+ if @acwin.class == Gtk::Popover
43
+ @acwin.hide
44
+ end
45
+ @autocp_active = false
46
+ end
47
+
48
+ def autocp_select
49
+ return if !@autocp_active
50
+ bufo.complete_current_word(@cpl_list[@autocp_selected])
51
+ autocp_exit
52
+ end
53
+
54
+ def autocp_select_previous
55
+ return if @autocp_selected <= 0
56
+ autocp_hilight(@autocp_selected)
57
+ autocp_unhilight(@autocp_selected)
58
+ @autocp_selected -= 1
59
+ autocp_hilight(@autocp_selected)
60
+ end
61
+
62
+ def autocp_hilight(id)
63
+ l = @autocp_items[id]
64
+ l.set_text("<span foreground='#00ff00' weight='ultrabold'>#{cpl_list[id]}</span>")
65
+ l.use_markup = true
66
+ end
67
+
68
+ def autocp_unhilight(id)
69
+ l = @autocp_items[id]
70
+ l.set_text("<span>#{cpl_list[id]}</span>")
71
+ l.use_markup = true
72
+ end
73
+
74
+ def autocp_select_next
75
+ return if @autocp_selected >= cpl_list.size - 1
76
+ debug "autocp_select_next", 2
77
+ autocp_unhilight(@autocp_selected)
78
+ @autocp_selected += 1
79
+ autocp_hilight(@autocp_selected)
80
+ end
81
+
82
+ def autocp_exit
83
+ @autocp_items = []
84
+ @autocp_active = true
85
+ hide_completions
86
+ end
87
+
88
+ def try_autocomplete
89
+ end
90
+
91
+ def show_completions
92
+ hide_completions
93
+ bu = vma.buf
94
+ (w, range) = bu.get_word_in_pos(bu.pos - 1, boundary: :word)
95
+ debug [w, range].to_s, 2
96
+ matches = Autocomplete.matching_words w
97
+ return if matches.empty?
98
+ @autocp_active = true
99
+ @cpl_list = cpl_list = matches
100
+ win = Gtk::Popover.new()
101
+ win.parent = self
102
+ vbox = Gtk::Grid.new()
103
+ win.set_child(vbox)
104
+
105
+ i = 0
106
+ @autocp_items = []
107
+ @autocp_selected = 0
108
+ for x in cpl_list
109
+ l = Gtk::Label.new(x)
110
+ @autocp_items << l
111
+ # numbers: left, top, width, height
112
+ vbox.attach(l, 0, i, 1, 1)
113
+ i += 1
114
+ end
115
+ autocp_hilight(0)
116
+ (x, y) = cur_pos_xy
117
+ rec = Gdk::Rectangle.new(x, y + 8, 10, 10)
118
+ win.has_arrow = false
119
+ win.set_pointing_to(rec)
120
+ win.autohide = false
121
+ win.popup
122
+ gui_remove_controllers(win)
123
+ @acwin = win
124
+ end
125
+
126
+ def start_autocomplete
127
+ return
128
+ # Roughly following these examples:
129
+ # https://stackoverflow.com/questions/52359721/howto-maintain-gtksourcecompletion-when-changing-buffers-in-a-gtksourceview
130
+ # and gedit-plugins-41.0/plugins/wordcompletion/gedit-word-completion-plugin.c
131
+ # .. but it doesn't work. So implementing using Popover.
132
+ # Keeping this for reference
133
+
134
+ cp = self.completion
135
+ prov = GtkSource::CompletionWords.new("Autocomplete") # (name,icon)
136
+ prov.register(self.buffer)
137
+ cp.add_provider(prov)
138
+ pp prov
139
+ self.show_completion
140
+ end
141
+ end
@@ -0,0 +1,49 @@
1
+ module Gui
2
+ def self.hilight_range(bf, r, color: "#aa0000ff", weight: nil, tag: nil)
3
+ vbuf = bf.view.buffer
4
+
5
+ if tag.nil?
6
+ tag = vma.gui.view.buffer.create_tag
7
+ tag.weight = weight if !weight.nil?
8
+ tag.foreground = color
9
+ end
10
+
11
+ itr = vbuf.get_iter_at(:offset => r.begin)
12
+ itr2 = vbuf.get_iter_at(:offset => r.last)
13
+ vbuf.apply_tag(tag, itr, itr2)
14
+ end
15
+
16
+ def self.highlight_match(bf, str, color: "#aa0000ff", weight: 650)
17
+ r = Regexp.new(Regexp.escape(str), Regexp::IGNORECASE)
18
+ tag = vma.gui.view.buffer.create_tag
19
+ tag.weight = weight
20
+ tag.foreground = color
21
+ ind = scan_indexes(bf, r)
22
+ ind.each { |x|
23
+ r = x..(x + str.size)
24
+ self.hilight_range(bf, r, tag: tag)
25
+ }
26
+ end
27
+
28
+ def self.highlight_match_old(bf, str, color: "#aa0000ff")
29
+ vbuf = bf.view.buffer
30
+ r = Regexp.new(Regexp.escape(str), Regexp::IGNORECASE)
31
+
32
+ hlparts = []
33
+
34
+ tt = vma.gui.view.buffer.tag_table.lookup("highlight_match_tag")
35
+ if tt.nil?
36
+ tt = vma.gui.view.buffer.create_tag("highlight_match_tag")
37
+ end
38
+
39
+ tt.weight = 650
40
+ tt.foreground = color
41
+
42
+ ind = scan_indexes(bf, r)
43
+ ind.each { |x|
44
+ itr = vbuf.get_iter_at(:offset => x)
45
+ itr2 = vbuf.get_iter_at(:offset => x + str.size)
46
+ vbuf.apply_tag(tt, itr, itr2)
47
+ }
48
+ end
49
+ end
@@ -1,9 +1,7 @@
1
1
  def hpt_check_cur_word(w)
2
2
  debug "check_cur_word(w)"
3
- m = w.match(/⟦((audio|img):)(.*)⟧/)
3
+ m = w.match(/⟦((audio|img):)?(.*)⟧/)
4
4
  if m
5
- # Ripl.start :binding => binding
6
-
7
5
  fpfx = m[3]
8
6
  if vma.buf.fname
9
7
  dn = File.dirname(vma.buf.fname)
@@ -17,8 +15,9 @@ def hpt_check_cur_word(w)
17
15
  fcands << File.expand_path("#{fpfx}.txt")
18
16
 
19
17
  fn = nil
18
+
20
19
  for fc in fcands
21
- if File.exists?(fc)
20
+ if File.exist?(fc)
22
21
  fn = fc
23
22
  break
24
23
  end
@@ -27,8 +26,12 @@ def hpt_check_cur_word(w)
27
26
  if fn
28
27
  if m[2] == "audio"
29
28
  # Thread.new { Audio.play(fn) }
30
- Audio.play(fn)
29
+ Audio.play(fn)
31
30
  else
31
+ if !file_is_text_file(fn)
32
+ message "Not text file #{fn}"
33
+ return nil
34
+ end
32
35
  message "HPT opening file #{fn}"
33
36
  return fn
34
37
  end
@@ -36,12 +39,23 @@ def hpt_check_cur_word(w)
36
39
  # return true
37
40
  else
38
41
  message "File not found: #{fpfx}"
42
+ newfn = fcands[0]
43
+ if File.extname(newfn) == ""
44
+ newfn = fcands[1]
45
+ end
46
+ Gui.confirm("File does not exist. Create a new file? \r #{newfn}",
47
+ proc{hpt_create_new_file(newfn)})
48
+
39
49
  end
40
50
  end
41
51
  end
42
52
  return nil
43
53
  end
44
54
 
55
+ def hpt_create_new_file(fn)
56
+ create_new_file(fn)
57
+ end
58
+
45
59
  def translate_path(fn, bf)
46
60
  if File.exist?(fn)
47
61
  outfn = fn
@@ -28,13 +28,18 @@ def is_visual_mode()
28
28
  return 0
29
29
  end
30
30
 
31
+ reg_act(:command_to_buf, proc { command_to_buf }, "Execute command, output to buffer")
32
+
31
33
  reg_act(:lsp_debug, proc { vma.buf.lsp_get_def }, "LSP get definition")
32
34
  reg_act(:lsp_jump_to_definition, proc { vma.buf.lsp_jump_to_def }, "LSP jump to definition")
33
35
 
34
- reg_act(:enable_debug, proc { $debug = true }, "Enable debug")
35
- reg_act(:disable_debug, proc { $debug = false }, "Disable debug")
36
+ reg_act(:enable_debug, proc { cnf.debug = true }, "Enable debug")
37
+ reg_act(:disable_debug, proc { cnf.debug = false }, "Disable debug")
36
38
 
37
39
  reg_act(:easy_jump, proc { EasyJump.start }, "Easy jump")
40
+ reg_act(:gui_ensure_cursor_visible, proc { vma.gui.view.ensure_cursor_visible }, "Scroll to current cursor position")
41
+ reg_act(:gui_refresh_cursor, proc { vma.buf.refresh_cursor }, "Refresh cursor")
42
+
38
43
  reg_act(:savedebug, "savedebug", "Save debug info", { :group => :debug })
39
44
  reg_act(:open_file_dialog, "open_file_dialog", "Open file", { :group => :file })
40
45
  reg_act(:create_new_file, "create_new_file", "Create new file", { :group => :file })
@@ -44,7 +49,7 @@ reg_act(:e_move_backward_char, "e_move_backward_char", "", { :group => [:move, :
44
49
  reg_act(:history_switch_backwards, "history_switch_backwards", "", { :group => :file })
45
50
  reg_act(:history_switch_forwards, "history_switch_forwards", "", { :group => :file })
46
51
  reg_act(:center_on_current_line, "center_on_current_line", "", { :group => :view })
47
- reg_act(:run_last_macro, proc { $macro.run_last_macro }, "Run last recorded or executed macro", { :group => :macro })
52
+ reg_act(:run_last_macro, proc { vma.macro.run_last_macro }, "Run last recorded or executed macro", { :group => :macro })
48
53
  reg_act(:jump_to_next_edit, "jump_to_next_edit", "")
49
54
  reg_act(:jump_to_last_edit, proc { buf.jump_to_last_edit }, "")
50
55
  reg_act(:jump_to_random, proc { buf.jump_to_random_pos }, "")
@@ -57,7 +62,7 @@ reg_act(:put_file_ref_to_clipboard, proc { buf.put_file_ref_to_clipboard }, "Put
57
62
  reg_act(:encrypt_file, proc { encrypt_cur_buffer }, "Set current file to encrypt on save")
58
63
  reg_act(:set_unencrypted, proc { buf.set_unencrypted }, "Set current file to save unencrypted")
59
64
  reg_act(:set_executable, proc { buf.set_executable }, "Set current file permissions to executable")
60
- reg_act(:close_all_buffers, proc { bufs.close_all_buffers() }, "Close all buffers")
65
+ # reg_act(:close_all_buffers, proc { bufs.close_all_buffers() }, "Close all buffers")
61
66
  reg_act(:close_current_buffer, proc { bufs.close_current_buffer(true) }, "Close current buffer")
62
67
  reg_act(:comment_selection, proc { buf.comment_selection }, "")
63
68
  reg_act(:delete_char_forward, proc { buf.delete(CURRENT_CHAR_FORWARD) }, "Delete char forward", { :group => [:edit, :basic] })
@@ -89,13 +94,23 @@ reg_act :update_file_index, proc { FileFinder.update_index }, "Update file index
89
94
  reg_act :delete_to_word_end, proc { buf.delete2(:to_word_end) }, "Delete to file end", { :group => [:edit, :basic] }
90
95
  reg_act :delete_to_next_word_start, proc { buf.delete2(:to_next_word) }, "Delete to start of next word", { :group => [:edit, :basic] }
91
96
  reg_act :delete_to_line_start, proc { buf.delete2(:to_line_start) }, "Delete to line start", { :group => [:edit, :basic] }
92
- reg_act :start_browse_mode, proc { $kbd.set_mode(:browse); $kbd.set_default_mode(:browse) }, "Start browse mode"
97
+
98
+ reg_act :start_browse_mode, proc {
99
+ vma.kbd.set_mode(:browse)
100
+ bufs.reset_navigation
101
+ }, "Start browse mode"
102
+ reg_act :kbd_dump_state, proc { vma.kbd.dump_state }, "Dump keyboard tree state"
103
+
93
104
  reg_act :exit_browse_mode, proc {
94
- bufs.add_current_buf_to_history(); $kbd.set_mode(:command); $kbd.set_default_mode(:command)
105
+ bufs.add_current_buf_to_history
106
+ # Load previously saved buffer specific mode stack
107
+ buf.restore_kbd_mode
95
108
  }, "Exit browse mode"
96
109
 
97
- reg_act :page_down, proc { page_down }, "Page down", :group => [:move, :basic]
98
- reg_act :page_up, proc { page_up }, "Page up", :group => [:move, :basic]
110
+ # reg_act :page_down, proc { page_down }, "Page down", :group => [:move, :basic]
111
+ reg_act :page_down, proc { vma.gui.page_down }, "Page down", :group => [:move, :basic]
112
+
113
+ reg_act :page_up, proc { vma.gui.page_up }, "Page up", :group => [:move, :basic]
99
114
  reg_act :jump_to_start_of_buffer, proc { buf.jump(START_OF_BUFFER) }, "Jump to start of buffer"
100
115
  reg_act :jump_to_end_of_buffer, proc { buf.jump(END_OF_BUFFER) }, "Jump to end of buffer"
101
116
  reg_act(:auto_indent_buffer, proc { buf.indent }, "Auto format buffer")
@@ -104,10 +119,8 @@ reg_act(:execute_current_line_in_terminal_autoclose, proc { buf.execute_current_
104
119
  reg_act(:show_images, proc { hpt_scan_images() }, "Show images inserted with ⟦img:file.png⟧ syntax")
105
120
  reg_act(:delete_current_file, proc { bufs.delete_current_buffer() }, "Delete current file")
106
121
 
107
-
108
122
  reg_act(:audio_stop, proc { Audio.stop }, "Stop audio playback")
109
123
 
110
-
111
124
  act_list = {
112
125
  # File handling
113
126
  :buf_save => { :proc => proc { buf.save },
@@ -159,7 +172,7 @@ act_list = {
159
172
  :toggle_active_window => { :proc => proc { vma.gui.toggle_active_window },
160
173
  :desc => "Toggle active window", :group => :search },
161
174
 
162
- :toggle_two_column => { :proc => proc { vma.gui.set_two_column },
175
+ :toggle_two_column => { :proc => proc { vma.gui.toggle_two_column },
163
176
  :desc => "Set two column mode", :group => :search },
164
177
 
165
178
  :content_search => { :proc => proc { FileContentSearch.start_gui },
@@ -168,199 +181,25 @@ act_list = {
168
181
  :quit => { :proc => proc { _quit },
169
182
  :desc => "Quit", :group => :app },
170
183
 
171
- }
184
+ :run_tests => { :proc => proc { run_tests },
185
+ :desc => "Run tests" },
172
186
 
173
- for k, v in act_list
174
- reg_act(k, v[:proc], v[:desc])
175
- end
187
+ :debug_buf_hex => { :proc => proc { puts "SHA256: " + (Digest::SHA2.hexdigest vma.buf.to_s) },
188
+ :desc => "Output SHA256 hex digest of curent buffer" },
176
189
 
177
- act_list_todo = {
190
+ :start_autocomplete => { :proc => proc { vma.buf.view.start_autocomplete },
191
+ :desc => "Start autocomplete" },
192
+
193
+ :show_autocomplete => { :proc => proc {
194
+ # vma.buf.view.signal_emit("show-completion")
195
+ # vma.buf.view.show_completion
196
+ vma.buf.view.show_completions
197
+ },
198
+ :desc => "Show autocomplete" },
199
+
178
200
 
179
- # Buffer handling
180
- # : => {proc => proc {bufs.switch}, :desc => "", :group => :},
181
- :buf_switch_to_last => { :proc => proc { bufs.switch_to_last_buf },
182
- :desc => "", :group => :file },
183
- # 'C , s'=> 'gui_select_buffer',
184
- :buf_revert => { :proc => proc { buf.revert },
185
- :desc => "Reload/revert file from disk", :group => :file },
186
- :buf_close => { :proc => proc { bufs.close_current_buffer },
187
- :desc => "Close current file", :group => :file },
188
- #"C , b" => '$kbd.set_mode("S");gui_select_buffer',
189
-
190
- # MOVING
191
- # 'VC h' => 'buf.move(BACKWARD_CHAR)',
192
- :m_forward_char => { :proc => proc { buf.move(FORWARD_CHAR) },
193
- :desc => "Move cursor one char forward",
194
- :group => :move },
195
- # "VC j" => "buf.move(FORWARD_LINE)",
196
- # "VC k" => "buf.move(BACKWARD_LINE)",
197
-
198
- "VC pagedown" => "page_down",
199
- "VC pageup" => "page_up",
200
-
201
- "VCI left" => "buf.move(BACKWARD_CHAR)",
202
- "VCI right" => "buf.move(FORWARD_CHAR)",
203
- "VCI down" => "buf.move(FORWARD_LINE)",
204
- "VCI up" => "buf.move(BACKWARD_LINE)",
205
-
206
- "VC w" => "buf.jump_word(FORWARD,WORD_START)",
207
- "VC b" => "buf.jump_word(BACKWARD,WORD_START)",
208
- "VC e" => "buf.jump_word(FORWARD,WORD_END)",
209
- # 'C '=> 'buf.jump_word(BACKWARD,END)',#TODO
210
- "VC f <char>" => "buf.jump_to_next_instance_of_char(<char>)",
211
- "VC F <char>" => "buf.jump_to_next_instance_of_char(<char>,BACKWARD)",
212
- "VC f space" => "buf.jump_to_next_instance_of_char(' ')",
213
- "VC F space" => "buf.jump_to_next_instance_of_char(' ',BACKWARD)",
214
-
215
- "VC /[1-9]/" => "set_next_command_count(<char>)",
216
- # 'VC number=/[0-9]/+ g'=> 'jump_to_line(<number>)',
217
- # 'VC X=/[0-9]/+ * Y=/[0-9]/+ '=> 'x_times_y(<X>,<Y>)',
218
- "VC ^" => "buf.jump(BEGINNING_OF_LINE)",
219
- "VC G($next_command_count!=nil)" => "buf.jump_to_line()",
220
- "VC 0($next_command_count!=nil)" => "set_next_command_count(<char>)",
221
- "VC 0($next_command_count==nil)" => "buf.jump(BEGINNING_OF_LINE)",
222
- # 'C 0'=> 'buf.jump(BEGINNING_OF_LINE)',
223
- "VC g g" => "buf.jump(START_OF_BUFFER)",
224
- "VC g ;" => "buf.jump_to_last_edit",
225
- "VC G" => "buf.jump(END_OF_BUFFER)",
226
- # 'VC z z' => 'center_on_current_line',
227
- "VC *" => "buf.jump_to_next_instance_of_word",
228
-
229
- # MINIBUFFER bindings
230
- "VC /" => "invoke_search",
231
- # 'VC :' => 'invoke_command', #TODO
232
- "C , e" => "invoke_command", # Currently eval
233
- "M enter" => "minibuffer_end()",
234
- # "M return" => "minibuffer_end()",
235
- "M esc" => "minibuffer_cancel()",
236
- "M backspace" => "minibuffer_delete()",
237
- "M <char>" => "minibuffer_new_char(<char>)",
238
- "M ctrl-v" => "$minibuffer.paste(BEFORE)",
239
-
240
- # READCHAR bindings
241
-
242
- "R <char>" => "readchar_new_char(<char>)",
243
-
244
- "C n" => "$search.jump_to_next()",
245
- "C N" => "$search.jump_to_previous()",
246
-
247
- # Debug
248
- "C , d r p" => "start_ripl",
249
- "C , D" => "debug_print_buffer",
250
- "C , c s" => "bufs.close_scrap_buffers",
251
- "C , d b" => "debug_print_buffer",
252
- "C , d c" => "debug_dump_clipboard",
253
- "C , d d" => "debug_dump_deltas",
254
- "VC O" => "buf.jump(END_OF_LINE)",
255
- "VC $" => "buf.jump(END_OF_LINE)",
256
-
257
- "C o" => 'buf.jump(END_OF_LINE);buf.insert_txt("\n");$kbd.set_mode(:insert)',
258
- "C X" => 'buf.jump(END_OF_LINE);buf.insert_txt("\n");',
259
- "C A" => "buf.jump(END_OF_LINE);$kbd.set_mode(:insert)",
260
- "C I" => "buf.jump(FIRST_NON_WHITESPACE);$kbd.set_mode(:insert)",
261
- "C a" => "buf.move(FORWARD_CHAR);$kbd.set_mode(:insert)",
262
- "C J" => "buf.join_lines()",
263
- "C u" => "buf.undo()",
264
-
265
- "C ^" => "buf.jump(BEGINNING_OF_LINE)",
266
- "C /[1-9]/" => "set_next_command_count(<char>)",
267
-
268
- # Command mode only:
269
- "C R" => "buf.redo()",
270
- "C v" => "buf.start_visual_mode",
271
- "C P" => "buf.paste(BEFORE)", # TODO: implement as replace for visual mode
272
- "C space <char>" => "buf.insert_txt(<char>)",
273
- "C space space" => "buf.insert_txt(' ')",
274
- "C y y" => "buf.copy_line",
275
- "C y O" => "buf.copy(:to_line_end)",
276
- "C y 0" => "buf.copy(:to_line_start)",
277
- "C y e" => "buf.copy(:to_word_end)", # TODO
278
- #### Deleting
279
- "C x" => "buf.delete(CURRENT_CHAR_FORWARD)",
280
- # 'C d k'=> 'delete_line(BACKWARD)', #TODO
281
- # 'C d j'=> 'delete_line(FORWARD)', #TODO
282
- # 'C d d'=> 'buf.delete_cur_line',
283
- "C d e" => "buf.delete2(:to_word_end)",
284
- "C d O" => "buf.delete2(:to_line_end)",
285
- "C d $" => "buf.delete2(:to_line_end)",
286
- # 'C d e'=> 'buf.delete_to_next_word_end',
287
- "C d <num> e" => "delete_next_word",
288
- "C r <char>" => "buf.replace_with_char(<char>)", # TODO
289
- "C , l b" => "load_buffer_list",
290
- "C , l l" => "save_buffer_list",
291
- "C , r <char>" => "set_register(<char>)", # TODO
292
- "C , p <char>" => "buf.paste(BEFORE,<char>)", # TODO
293
-
294
- "C ctrl-c" => "buf.comment_line()",
295
- "C ctrl-x" => "buf.comment_line(:uncomment)",
296
-
297
- # 'C 0($next_command_count==nil)'=> 'jump_to_beginning_of_line',
298
-
299
- # Visual mode only:
300
- "V esc" => "buf.end_visual_mode",
301
- "V ctrl!" => "buf.end_visual_mode",
302
- "V y" => "buf.copy_active_selection(:foo)",
303
- "V g U" => "buf.transform_selection(:upcase)",
304
- "V g u" => "buf.transform_selection(:downcase)",
305
- "V g c" => "buf.transform_selection(:capitalize)",
306
- "V g s" => "buf.transform_selection(:swapcase)",
307
- "V g r" => "buf.transform_selection(:reverse)",
308
-
309
- "V x" => "buf.delete(SELECTION)",
310
- # "V ctrl-c" => "buf.comment_selection",
311
- "V ctrl-x" => "buf.comment_selection(:uncomment)",
312
-
313
- "CI ctrl-v" => "buf.paste(BEFORE)",
314
- "CI backspace" => "buf.delete(BACKWARD_CHAR)",
315
-
316
- # Marks
317
- "CV m <char>" => "buf.mark_current_position(<char>)",
318
- 'CV \' <char>' => "buf.jump_to_mark(<char>)",
319
- # "CV ''" =>'jump_to_mark(NEXT_MARK)', #TODO
320
-
321
- "C i" => "$kbd.set_mode(:insert)",
322
- "C ctrl!" => "$kbd.set_mode(:insert)",
323
-
324
- # Macros
325
- # (experimental, may not work correctly)
326
- # "C q a" => '$macro.start_recording("a")',
327
- "VC q <char>" => "$macro.start_recording(<char>)",
328
- "VC q($macro.is_recording==true) " => "$macro.end_recording", # TODO
329
- # 'C q'=> '$macro.end_recording', #TODO
330
- "C q v" => "$macro.end_recording",
331
- # 'C v'=> '$macro.end_recording',
332
- # "C M" => '$macro.run_last_macro',
333
- "C @ <char>" => "$macro.run_macro(<char>)",
334
- "C , m S" => '$macro.save_macro("a")',
335
- "C , m s" => "$macro.save",
336
- "C , t r" => "run_tests()",
337
-
338
- "C ." => "repeat_last_action", # TODO
339
- "VC ;" => "repeat_last_find",
340
- "CV ctrl-q" => "_quit",
341
- "CV , R" => "restart_application",
342
- "I ctrl!" => "$kbd.set_mode(:command)",
343
- "C shift!" => "buf.save",
344
- "I <char>" => "buf.insert_txt(<char>)",
345
- "I esc" => "$kbd.set_mode(:command)",
346
-
347
- "I ctrl-d" => "buf.delete2(:to_word_end)",
348
-
349
- # INSERT MODE: Moving
350
- "I ctrl-a" => "buf.jump(BEGINNING_OF_LINE)",
351
- "I ctrl-b" => "buf.move(BACKWARD_CHAR)",
352
- "I ctrl-f" => "buf.move(FORWARD_CHAR)",
353
- "I ctrl-n" => "buf.move(FORWARD_LINE)",
354
- "I ctrl-p" => "buf.move(BACKWARD_LINE)",
355
- "I ctrl-e" => "buf.jump(END_OF_LINE)", # context: mode:I, buttons down: {C}
356
- "I alt-f" => "buf.jump_word(FORWARD,WORD_START)",
357
- "I alt-b" => "buf.jump_word(BACKWARD,WORD_START)",
358
-
359
- "I tab" => 'buf.insert_txt(" ")',
360
- "I space" => 'buf.insert_txt(" ")',
361
- # "I return" => 'buf.insert_new_line()',
362
201
  }
363
202
 
364
- # default_keys.each { |key, value|
365
- # bindkey(key, value)
366
- # }
203
+ for k, v in act_list
204
+ reg_act(k, v[:proc], v[:desc])
205
+ end