vimamsa 0.1.8 → 0.1.9

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.
@@ -35,25 +35,46 @@ def hpt_check_cur_word(w)
35
35
  return nil
36
36
  end
37
37
 
38
+ def translate_path(fn, bf)
39
+ if File.exist?(fn)
40
+ outfn = fn
41
+ elsif fn[0] == "$"
42
+ outfn = ppath(fn[1..-1]) # Path to source location
43
+ elsif fn[0] == "~"
44
+ outfn = File.expand_path(fn)
45
+ elsif !bf.fname.nil?
46
+ pd = File.dirname(bf.fname)
47
+ outfn = "#{pd}/#{fn}"
48
+ else
49
+ outfn = File.expand_path(fn)
50
+ end
51
+ return outfn
52
+ end
53
+
38
54
  # Scan images inserted with ⟦img:filepath⟧ syntax
39
- def hpt_scan_images()
40
- return if !buf.fname
41
- return if !buf.fname.match(/.*txt$/)
42
- imgpos = scan_indexes(buf, /⟦img:.+?⟧/)
43
- imgtags = buf.scan(/(⟦img:(.+?)⟧)/)
55
+ def hpt_scan_images(bf = nil)
56
+ bf = buf() if bf.nil?
57
+ return if bf.nil?
58
+ return if !bf.fname
59
+ return if !bf.fname.match(/.*txt$/)
60
+ imgpos = scan_indexes(bf, /⟦img:.+?⟧/)
61
+ imgtags = bf.scan(/(⟦img:(.+?)⟧)/)
44
62
  c = 0
45
63
  imgpos.each.with_index { |x, i|
46
64
  a = imgpos[i]
47
65
  t = imgtags[i]
48
66
  insert_pos = a + t[0].size + c
49
- imgfn = File.expand_path(t[1])
67
+ fn = t[1]
68
+ imgfn = translate_path(fn, bf)
50
69
  next if !File.exist?(imgfn)
51
70
  # Show as image in gui, handle as empty space in txt file
52
- if buf[insert_pos..(insert_pos + 2)] != "\n \n"
53
- buf.insert_txt_at("\n \n", insert_pos)
54
- buf.view.handle_deltas
71
+
72
+ if bf[insert_pos..(insert_pos + 2)] != "\n \n"
73
+ bf.insert_txt_at("\n \n", insert_pos)
74
+ bf.view.handle_deltas
55
75
  c += 3
56
76
  end
57
- buf.add_image(imgfn, insert_pos + 1)
77
+ bf.add_image(imgfn, insert_pos + 1)
58
78
  }
79
+ vma.gui.delex.run
59
80
  end
@@ -28,17 +28,16 @@ def is_visual_mode()
28
28
  return 0
29
29
  end
30
30
 
31
-
32
- reg_act(:enable_debug, proc { $debug=true }, "Enable debug")
33
- reg_act(:disable_debug, proc {$debug=false }, "Disable debug")
31
+ reg_act(:enable_debug, proc { $debug = true }, "Enable debug")
32
+ reg_act(:disable_debug, proc { $debug = false }, "Disable debug")
34
33
 
35
34
  reg_act(:easy_jump, proc { EasyJump.start }, "Easy jump")
36
35
  reg_act(:savedebug, "savedebug", "Save debug info", { :group => :debug })
37
36
  reg_act(:open_file_dialog, "open_file_dialog", "Open file", { :group => :file })
38
37
  reg_act(:create_new_file, "create_new_file", "Create new file", { :group => :file })
39
- reg_act(:backup_all_buffers, proc{backup_all_buffers}, "Backup all buffers", { :group => :file })
40
- reg_act(:e_move_forward_char, "e_move_forward_char", "", { :group => :move })
41
- reg_act(:e_move_backward_char, "e_move_backward_char", "", { :group => :move })
38
+ reg_act(:backup_all_buffers, proc { backup_all_buffers }, "Backup all buffers", { :group => :file })
39
+ reg_act(:e_move_forward_char, "e_move_forward_char", "", { :group => [:move, :basic] })
40
+ reg_act(:e_move_backward_char, "e_move_backward_char", "", { :group => [:move, :basic] })
42
41
  reg_act(:history_switch_backwards, "history_switch_backwards", "", { :group => :file })
43
42
  reg_act(:history_switch_forwards, "history_switch_forwards", "", { :group => :file })
44
43
  reg_act(:center_on_current_line, "center_on_current_line", "", { :group => :view })
@@ -56,7 +55,7 @@ reg_act(:set_executable, proc { buf.set_executable }, "Set current file permissi
56
55
  reg_act(:close_all_buffers, proc { bufs.close_all_buffers() }, "Close all buffers")
57
56
  reg_act(:close_current_buffer, proc { bufs.close_current_buffer(true) }, "Close current buffer")
58
57
  reg_act(:comment_selection, proc { buf.comment_selection }, "")
59
- reg_act(:delete_char_forward, proc { buf.delete(CURRENT_CHAR_FORWARD) }, "Delete char forward")
58
+ reg_act(:delete_char_forward, proc { buf.delete(CURRENT_CHAR_FORWARD) }, "Delete char forward", { :group => [:edit, :basic] })
60
59
  reg_act(:load_theme, proc { load_theme }, "Load theme")
61
60
  reg_act(:gui_file_finder, proc { vma.FileFinder.start_gui }, "Fuzzy file finder")
62
61
  reg_act(:gui_file_history_finder, proc { vma.FileHistory.start_gui }, "Fuzzy file history finder")
@@ -82,19 +81,19 @@ reg_act(:diff_buffer, "diff_buffer", "")
82
81
  reg_act(:invoke_grep_search, proc { gui_grep }, "Grep current buffer")
83
82
  reg_act(:ack_search, proc { gui_ack }, "") #invoke_ack_search
84
83
  reg_act :update_file_index, proc { update_file_index }, "Update file index"
85
- reg_act :delete_to_word_end, proc { buf.delete2(:to_word_end) }, "Delete to file end"
86
- reg_act :delete_to_line_start, proc { buf.delete2(:to_line_start) }, "Delete to line start"
84
+ reg_act :delete_to_word_end, proc { buf.delete2(:to_word_end) }, "Delete to file end", { :group => [:edit, :basic] }
85
+ reg_act :delete_to_line_start, proc { buf.delete2(:to_line_start) }, "Delete to line start", { :group => [:edit, :basic] }
87
86
  reg_act :start_browse_mode, proc { $kbd.set_mode(:browse); $kbd.set_default_mode(:browse) }, "Start browse mode"
88
87
  reg_act :exit_browse_mode, proc {
89
88
  bufs.add_current_buf_to_history(); $kbd.set_mode(:command); $kbd.set_default_mode(:command)
90
89
  }, "Exit browse mode"
91
90
 
92
- reg_act :page_down, proc { page_down }
93
- reg_act :page_up, proc { page_up }
91
+ reg_act :page_down, proc { page_down }, "Page down", :group => [:move, :basic]
92
+ reg_act :page_up, proc { page_up }, "Page up", :group => [:move, :basic]
94
93
  reg_act :jump_to_start_of_buffer, proc { buf.jump(START_OF_BUFFER) }, "Jump to start of buffer"
95
94
  reg_act :jump_to_end_of_buffer, proc { buf.jump(END_OF_BUFFER) }, "Jump to end of buffer"
96
95
  reg_act(:auto_indent_buffer, proc { buf.indent }, "Auto format buffer")
97
- reg_act(:execute_current_line_in_terminal, proc { buf.execute_current_line_in_terminal }, "Execute current line in terminalL")
96
+ reg_act(:execute_current_line_in_terminal, proc { buf.execute_current_line_in_terminal }, "Execute current line in terminal")
98
97
  reg_act(:execute_current_line_in_terminal_autoclose, proc { buf.execute_current_line_in_terminal(true) }, "Execute current line in terminal. Close after execution.")
99
98
  reg_act(:show_images, proc { hpt_scan_images() }, "Show images inserted with ⟦img:file.png⟧ syntax")
100
99
  reg_act(:delete_current_file, proc { bufs.delete_current_buffer() }, "Delete current file")
@@ -118,8 +117,28 @@ act_list = {
118
117
  :desc => "Undo edit", :group => :edit },
119
118
 
120
119
  :find_in_buffer => { :proc => proc { invoke_search },
121
- :desc => "Find", :group => :edit },
120
+ :desc => "Find", :group => :edit },
121
+
122
+ :selection_upcase => { :proc => proc { buf.transform_selection(:upcase) },
123
+ :desc => "Transform text: upcase", :group => :edit },
124
+
125
+ :selection_downcase => { :proc => proc { buf.transform_selection(:downcase) },
126
+ :desc => "Transform text: downcase", :group => :edit },
127
+
128
+ :selection_capitalize => { :proc => proc { buf.transform_selection(:capitalize) },
129
+ :desc => "Transform text: capitalize", :group => :edit },
130
+
131
+ :selection_swapcase => { :proc => proc { buf.transform_selection(:swapcase) },
132
+ :desc => "Transform text: swapcase", :group => :edit },
122
133
 
134
+ :selection_reverse => { :proc => proc { buf.transform_selection(:reverse) },
135
+ :desc => "Transform text: reverse", :group => :edit },
136
+
137
+ :forward_line => { :proc => proc { buf.move(FORWARD_LINE) },
138
+ :desc => "Move one line forward", :group => [:move, :basic] },
139
+
140
+ :backward_line => { :proc => proc { buf.move(BACKWARD_LINE) },
141
+ :desc => "Move one line backward", :group => [:move, :basic] },
123
142
 
124
143
  # { :proc => proc { },
125
144
  # :desc => "", :group => : },
@@ -127,6 +146,9 @@ act_list = {
127
146
  :search_actions => { :proc => proc { search_actions },
128
147
  :desc => "Search actions", :group => :search },
129
148
 
149
+ :content_search => { :proc => proc { FileContentSearch.start_gui },
150
+ :desc => "Search content of files", :group => :search },
151
+
130
152
  :quit => { :proc => proc { _quit },
131
153
  :desc => "Quit", :group => :app },
132
154
 
@@ -149,14 +171,13 @@ act_list_todo = {
149
171
  :desc => "Close current file", :group => :file },
150
172
  #"C , b" => '$kbd.set_mode("S");gui_select_buffer',
151
173
 
152
-
153
174
  # MOVING
154
175
  # 'VC h' => 'buf.move(BACKWARD_CHAR)',
155
176
  :m_forward_char => { :proc => proc { buf.move(FORWARD_CHAR) },
156
177
  :desc => "Move cursor one char forward",
157
178
  :group => :move },
158
- "VC j" => "buf.move(FORWARD_LINE)",
159
- "VC k" => "buf.move(BACKWARD_LINE)",
179
+ # "VC j" => "buf.move(FORWARD_LINE)",
180
+ # "VC k" => "buf.move(BACKWARD_LINE)",
160
181
 
161
182
  "VC pagedown" => "page_down",
162
183
  "VC pageup" => "page_up",
@@ -36,7 +36,7 @@ setcnf :indent_based_on_last_line, true
36
36
  setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc", ".php", ".sh", ".m", ".gd", ".js"]
37
37
 
38
38
  class State
39
- attr_accessor :key_name, :eval_rule, :children, :action, :label, :major_modes
39
+ attr_accessor :key_name, :eval_rule, :children, :action, :label, :major_modes, :level
40
40
 
41
41
  def initialize(key_name, eval_rule = "")
42
42
  @key_name = key_name
@@ -44,6 +44,7 @@ class State
44
44
  @children = []
45
45
  @major_modes = []
46
46
  @action = nil
47
+ @level = 0
47
48
  end
48
49
 
49
50
  def to_s()
@@ -86,6 +87,7 @@ class KeyBindingTree
86
87
  # $kbd.add_mode("I", :insert)
87
88
  def add_mode(id, label)
88
89
  mode = State.new(id)
90
+ mode.level = 1
89
91
  @modes[label] = mode
90
92
  @root.children << mode
91
93
  if @default_mode == nil
@@ -142,7 +144,6 @@ class KeyBindingTree
142
144
  }
143
145
  }
144
146
 
145
-
146
147
  if new_state.any? # Match found
147
148
  @match_state = new_state
148
149
  return new_state
@@ -153,6 +154,11 @@ class KeyBindingTree
153
154
  end
154
155
  end
155
156
 
157
+ def show_state_trail
158
+ (st, children) = get_state_trail_str()
159
+ vma.gui.statnfo.markup = "<span weight='ultrabold'>#{st}</span>"
160
+ end
161
+
156
162
  def set_mode(label)
157
163
  @mode_history << @mode_root_state
158
164
 
@@ -205,6 +211,7 @@ class KeyBindingTree
205
211
  # @cur_state = @root
206
212
  stack = [[@root, ""]]
207
213
  lines = []
214
+
208
215
  while stack.any?
209
216
  t, p = *stack.pop # t = current state, p = current path
210
217
  if t.children.any?
@@ -212,14 +219,27 @@ class KeyBindingTree
212
219
  if c.eval_rule.size > 0
213
220
  new_p = "#{p} #{c.key_name}(#{c.eval_rule})"
214
221
  else
215
- new_p = "#{p} #{c.key_name}"
222
+ if c.level == 1
223
+ new_p = "#{p} [#{c.key_name}]"
224
+ else
225
+ new_p = "#{p} #{c.key_name}"
226
+ end
216
227
  end
217
228
  stack << [c, new_p]
218
229
  }
219
230
  # stack.concat[t.children]
220
231
  else
221
- # s += p + " : #{t.action}\n"
222
- lines << p + " : #{t.action}"
232
+ method_desc = t.action
233
+ if t.action.class == Symbol
234
+ if !$actions[t.action].nil?
235
+ a = $actions[t.action].method_name
236
+ if !a.nil? and !a.empty?
237
+ method_desc = a
238
+ end
239
+ end
240
+ end
241
+
242
+ lines << p + " : #{method_desc}"
223
243
  end
224
244
  end
225
245
  s = lines.sort.join("\n")
@@ -227,21 +247,26 @@ class KeyBindingTree
227
247
  end
228
248
 
229
249
  def get_state_trail_str
230
- s = ""
231
250
  s_trail = ""
232
251
  last_state = @state_trail.last
233
252
  last_state = last_state[0] if last_state.class == Array
253
+ first = true
234
254
  for st in @state_trail
235
255
  st = st[0] if st.class == Array
236
- s_trail << " #{st.to_s}"
256
+ if first
257
+ s_trail << "[#{st.to_s}]"
258
+ else
259
+ s_trail << " #{st.to_s}"
260
+ end
261
+ first = false
237
262
  end
238
- s << "CUR STATE: #{s_trail}\n"
263
+ children = ""
239
264
  for cstate in last_state.children
240
265
  act_s = "..."
241
266
  act_s = cstate.action.to_s if cstate.action != nil
242
- s << " #{cstate.to_s} #{act_s}\n"
267
+ children << " #{cstate.to_s} #{act_s}\n"
243
268
  end
244
- return s
269
+ return [s_trail, children]
245
270
  end
246
271
 
247
272
  # Modifies state of key binding tree (move to new state) based on received event
@@ -305,20 +330,6 @@ class KeyBindingTree
305
330
 
306
331
  if new_state != nil
307
332
  @state_trail << new_state
308
- debug get_state_trail_str()
309
- # # debug "CUR STATE: #{@state_trail.collect{|x| x.to_s}.join}"
310
- # s_trail = ""
311
- # for st in @state_trail
312
- # st = st[0] if st.class == Array
313
- # s_trail << " #{st.to_s}"
314
- # end
315
- # debug "CUR STATE: #{s_trail}"
316
- # for cstate in new_state[0].children
317
- # act_s = "..."
318
- # act_s = cstate.action.to_s if cstate.action != nil
319
- # debug " #{cstate.to_s} #{act_s}"
320
- # end
321
- # new_state[0].children.collect{|x|x.to_s}
322
333
  end
323
334
 
324
335
  if new_state == nil
@@ -359,96 +370,9 @@ class KeyBindingTree
359
370
  end
360
371
  end
361
372
 
362
- return true
363
- end
364
-
365
- # Receive keyboard event from Qt
366
- def handle_key_event(event)
367
- start_profiler
368
- # debug "GOT KEY EVENT: #{key.inspect}"
369
- debug "GOT KEY EVENT:: #{event} #{event[2]}"
370
- debug "|#{event.inspect}|"
371
- $debuginfo["cur_event"] = event
372
-
373
- t1 = Time.now
374
-
375
- keycode = event[0]
376
- event_type = event[1]
377
- modifierinfo = event[4]
378
-
379
- event[3] = event[2]
380
- # String representation of received key
381
- key_str = event[2]
382
-
383
- @modifiers.delete(Qt::Key_Alt) if event[4] & ALTMODIFIER == 0
384
- @modifiers.delete(Qt::Key_Control) if event[4] & CONTROLMODIFIER == 0
385
- @modifiers.delete(Qt::Key_Shift) if event[4] & SHIFTMODIFIER == 0
386
-
387
- # Add as modifier if ctrl, alt or shift
388
- if modifierinfo & ALTMODIFIER != 0 or modifierinfo & CONTROLMODIFIER != 0 or modifierinfo & SHIFTMODIFIER != 0
389
- # And keypress and not already a modifier
390
- if event_type == KEY_PRESS and !@modifiers.include?(keycode)
391
- @modifiers << keycode
392
- end
393
- end
394
-
395
- # debug "----D------------"
396
- # debug @modifiers.inspect
397
- # debug event.inspect
398
- # debug event[4] & ALTMODIFIER
399
- # debug "-----------------"
400
-
401
- @modifiers.delete(keycode) if event_type == KEY_RELEASE
402
-
403
- # uval = keyval_to_unicode(event[0])
404
- # event[3] = [uval].pack('c*').force_encoding('UTF-8') #TODO: 32bit?
405
- # debug("key_code_to_uval: uval: #{uval} uchar:#{event[3]}")
406
-
407
- if $event_keysym_translate_table.include?(keycode)
408
- key_str = $event_keysym_translate_table[keycode]
409
- end
410
-
411
- # Prefix string representation with modifiers, e.g. ctrl-shift-a
412
- key_prefix = ""
413
- @modifiers.each { |pressed_key|
414
- if $event_keysym_translate_table[pressed_key]
415
- key_prefix += $event_keysym_translate_table[pressed_key] + "-"
416
- end
417
- }
418
-
419
- # Get char based on keycode
420
- # to produce prefixed_key_str "shift-ctrl-a" instead of "shift-ctrl-\x01"
421
- key_str2 = key_str
422
- if $translate_table.include?(keycode)
423
- key_str2 = $translate_table[keycode].downcase
424
- end
425
- # debug "key_str=|#{key_str}| key_str=|#{key_str.inspect}| key_str2=|#{key_str2}|"
426
- prefixed_key_str = key_prefix + key_str2
427
-
428
- # Space is only key in $event_keysym_translate_table
429
- # which is representable by single char
430
- key_str = " " if key_str == "space" # HACK
373
+ show_state_trail #TODO: check if changed
431
374
 
432
- # if keycode == @last_event[0] and event_type == KEY_RELEASE
433
- # debug "KEY! key_str=|#{key_str}| prefixed_key_str=|#{prefixed_key_str}|"
434
- # end
435
-
436
- if key_str != "" or prefixed_key_str != ""
437
- if keycode == @last_event[0] and event_type == KEY_RELEASE
438
- # If key is released immediately after pressed with no other events between
439
- match_key_conf(key_str + "!", prefixed_key_str + "!", event_type)
440
- elsif event_type == KEY_PRESS
441
- match_key_conf(key_str, prefixed_key_str, event_type)
442
- end
443
- @last_event = event #TODO: outside if?
444
- end
445
-
446
- # gui_refresh_cursor
447
-
448
- event_handle_time = Time.now - t1
449
- debug "RB key event handle time: #{event_handle_time}" if event_handle_time > 1 / 40.0
450
- render_buffer($buffer)
451
- end_profiler
375
+ return true
452
376
  end
453
377
 
454
378
  def bindkey(key, action)
@@ -1,9 +1,8 @@
1
-
2
- bindkey ["VCB M","B m"], :run_last_macro
1
+ bindkey ["VCB M", "B m"], :run_last_macro
3
2
 
4
3
  bindkey "VC s", :easy_jump
5
- bindkey "VC , m f", [:find_macro_gui, proc{$macro.find_macro_gui}, "Find named macro"]
6
- bindkey "C , m n", [:gui_name_macro, proc{$macro.gui_name_macro}, "Name last macro"]
4
+ bindkey "VC , m f", [:find_macro_gui, proc { $macro.find_macro_gui }, "Find named macro"]
5
+ bindkey "C , m n", [:gui_name_macro, proc { $macro.gui_name_macro }, "Name last macro"]
7
6
  bindkey "C , j r", :jump_to_random
8
7
  bindkey "I enter", :insert_new_line
9
8
  bindkey "C , ; s k", :show_key_bindings #TODO: better binding
@@ -35,8 +34,8 @@ bindkey "C , b", :start_buf_manager
35
34
  bindkey "CI ctrl-o", :open_file_dialog
36
35
  # bindkey "M enter", :minibuffer_end
37
36
  bindkey "C , a", :ack_search
38
- bindkey "C d w", :delete_to_word_end
39
- bindkey "C d 0", :delete_to_line_start
37
+ bindkey "C d w", :delete_to_word_end
38
+ bindkey "C d 0", :delete_to_line_start
40
39
  bindkey "C , , f", :file_finder
41
40
  bindkey "VC h", :e_move_backward_char
42
41
  bindkey "C , , .", :backup_all_buffers
@@ -62,11 +61,11 @@ bindkey "C , g", :invoke_grep_search
62
61
  bindkey "C , v", :auto_indent_buffer
63
62
  bindkey "C , , d", :savedebug
64
63
  bindkey "C , , u", :update_file_index
65
- bindkey "C , s a", :buf_save_as
66
- bindkey "C d d", [:delete_line, proc{buf.delete_line}, "Delete current line"]
67
- bindkey "C enter || C return", [:line_action,proc{buf.handle_line_action()}, "Line action"]
68
- bindkey "C p" , [:paste_after,proc{buf.paste(AFTER)},""] # TODO: implement as replace for visual mode
69
- bindkey "V d" , [:delete_selection,proc{buf.delete(SELECTION)},""]
64
+ bindkey "C , s a", :buf_save_as
65
+ bindkey "C d d", [:delete_line, proc { buf.delete_line }, "Delete current line"]
66
+ bindkey "C enter || C return", [:line_action, proc { buf.handle_line_action() }, "Line action"]
67
+ bindkey "C p", [:paste_after, proc { buf.paste(AFTER) }, ""] # TODO: implement as replace for visual mode
68
+ bindkey "V d", [:delete_selection, proc { buf.delete(SELECTION) }, ""]
70
69
 
71
70
  default_keys = {
72
71
 
@@ -84,7 +83,6 @@ default_keys = {
84
83
  # "C , , ." => "backup_all_buffers()",
85
84
  "VC , , s" => :search_actions,
86
85
 
87
-
88
86
  # MOVING
89
87
  # 'VC h' => 'buf.move(BACKWARD_CHAR)',
90
88
  "VC l" => "buf.move(FORWARD_CHAR)",
@@ -107,7 +105,7 @@ default_keys = {
107
105
  "VC F <char>" => "buf.jump_to_next_instance_of_char(<char>,BACKWARD)",
108
106
  "VC f space" => "buf.jump_to_next_instance_of_char(' ')",
109
107
  "VC F space" => "buf.jump_to_next_instance_of_char(' ',BACKWARD)",
110
-
108
+
111
109
  "VC /[1-9]/" => "set_next_command_count(<char>)",
112
110
  # 'VC number=/[0-9]/+ g'=> 'jump_to_line(<number>)',
113
111
  # 'VC X=/[0-9]/+ * Y=/[0-9]/+ '=> 'x_times_y(<X>,<Y>)',
@@ -133,6 +131,9 @@ default_keys = {
133
131
  "C n" => "$search.jump_to_next()",
134
132
  "C N" => "$search.jump_to_previous()",
135
133
 
134
+
135
+ "C C" => :content_search,
136
+
136
137
  # Debug
137
138
  "C , d r p" => "start_ripl",
138
139
  "C , D" => "debug_print_buffer",
@@ -191,11 +192,14 @@ default_keys = {
191
192
  "V ctrl!" => "buf.end_visual_mode",
192
193
  "V y" => "buf.copy_active_selection()",
193
194
  "V a y" => "buf.copy_active_selection(:append)",
194
- "V g U" => "buf.transform_selection(:upcase)",
195
- "V g u" => "buf.transform_selection(:downcase)",
196
- "V g c" => "buf.transform_selection(:capitalize)",
197
- "V g s" => "buf.transform_selection(:swapcase)",
198
- "V g r" => "buf.transform_selection(:reverse)",
195
+ "V g U" => :selection_upcase,
196
+ "V g u" => :selection_downcase,
197
+ "V g c" => :selection_capitalize,
198
+ "V g s" => :selection_swapcase,
199
+ "V g r" => :selection_reverse,
200
+
201
+ "VC j" => :forward_line,
202
+ "VC k" => :backward_line,
199
203
 
200
204
  "V x" => "buf.delete(SELECTION)",
201
205
  # "V ctrl-c" => "buf.comment_selection",
@@ -215,15 +219,15 @@ default_keys = {
215
219
  # Macros
216
220
  # (experimental, may not work correctly)
217
221
  # "C q a" => '$macro.start_recording("a")',
218
- "VC q <char>" => '$macro.start_recording(<char>)',
222
+ "VC q <char>" => "$macro.start_recording(<char>)",
219
223
  "VC q($macro.is_recording==true) " => "$macro.end_recording", # TODO
220
224
  # 'C q'=> '$macro.end_recording', #TODO
221
225
  "C q v" => "$macro.end_recording",
222
226
  # 'C v'=> '$macro.end_recording',
223
227
  # "C M" => '$macro.run_last_macro',
224
- "C @ <char>" => '$macro.run_macro(<char>)',
228
+ "C @ <char>" => "$macro.run_macro(<char>)",
225
229
  "C , m S" => '$macro.save_macro("a")',
226
- "C , m s" => '$macro.save',
230
+ "C , m s" => "$macro.save",
227
231
  "C , t r" => "run_tests()",
228
232
 
229
233
  # "C ." => "repeat_last_action", # TODO
@@ -256,5 +260,3 @@ default_keys = {
256
260
  default_keys.each { |key, value|
257
261
  bindkey(key, value)
258
262
  }
259
-
260
-
data/lib/vimamsa/rbvma.rb CHANGED
@@ -1,13 +1,15 @@
1
- require "gtk3"
2
- require "gtksourceview3"
3
1
  #require "gtksourceview4"
4
- require "ripl"
5
- require "fileutils"
6
- require "pathname"
7
2
  require "date"
8
- require "ripl/multi_line"
3
+ require "fileutils"
4
+ require "gtk3"
5
+ require "gtksourceview4"
9
6
  require "json"
10
7
  require "listen"
8
+ require "pathname"
9
+ require "ripl"
10
+ require "ripl/multi_line"
11
+ require "shellwords"
12
+ require "cgi"
11
13
 
12
14
  require "vimamsa/util"
13
15
  require "vimamsa/main"
@@ -16,11 +18,13 @@ require "vimamsa/actions"
16
18
  require "vimamsa/key_binding_tree"
17
19
  require "vimamsa/key_actions"
18
20
 
19
-
21
+ # Graphical stuff:
20
22
  require "vimamsa/gui"
21
23
  require "vimamsa/gui_menu"
22
24
  require "vimamsa/gui_select_window"
23
25
  require "vimamsa/gui_sourceview"
26
+ require "vimamsa/gui_image"
27
+ require "vimamsa/hyper_plain_text"
24
28
 
25
29
  require "vimamsa/ack"
26
30
  require "vimamsa/buffer"
@@ -33,7 +37,6 @@ require "vimamsa/encrypt"
33
37
  require "vimamsa/file_finder"
34
38
  require "vimamsa/file_manager"
35
39
  require "vimamsa/hook"
36
- require "vimamsa/hyper_plain_text"
37
40
  require "vimamsa/macro"
38
41
  require "vimamsa/search"
39
42
  require "vimamsa/search_replace"
@@ -57,7 +60,7 @@ $debug = false
57
60
 
58
61
  def scan_indexes(txt, regex)
59
62
  # indexes = txt.enum_for(:scan, regex).map { Regexp.last_match.begin(0) + 1 }
60
- indexes = txt.enum_for(:scan, regex).map { Regexp.last_match.begin(0) }
63
+ indexes = txt.enum_for(:scan, regex).map { Regexp.last_match.begin(0) }
61
64
  return indexes
62
65
  end
63
66
 
@@ -52,7 +52,7 @@ class FileSelector
52
52
  if File.directory?(fn)
53
53
  debug "CHDIR: #{fn}"
54
54
  dir_to_buf(fn)
55
- # elsif vma.can_open_extension?(fn) #TODO: remove this check?
55
+ # elsif vma.can_open_extension?(fn) #TODO: remove this check?
56
56
  # jump_to_file(fn)
57
57
  elsif file_is_text_file(fn)
58
58
  jump_to_file(fn)
@@ -103,8 +103,8 @@ def invoke_grep_search()
103
103
  start_minibuffer_cmd("", "", :grep_cur_buffer)
104
104
  end
105
105
 
106
- def gui_one_input_action(title, field_label, button_title, callback)
107
- a = OneInputAction.new(nil, title, field_label, button_title, callback)
106
+ def gui_one_input_action(title, field_label, button_title, callback,opt={})
107
+ a = OneInputAction.new(nil, title, field_label, button_title, callback,opt)
108
108
  a.run
109
109
  return
110
110
  end
@@ -262,7 +262,7 @@ class PopupFormGenerator
262
262
  end
263
263
 
264
264
  class OneInputAction
265
- def initialize(main_window, title, field_label, button_title, callback)
265
+ def initialize(main_window, title, field_label, button_title, callback, opt = {})
266
266
  @window = Gtk::Window.new(:toplevel)
267
267
  # @window.screen = main_window.screen
268
268
  # @window.title = title
@@ -291,6 +291,10 @@ class OneInputAction
291
291
 
292
292
  @entry1 = Gtk::Entry.new
293
293
 
294
+ if opt[:hide]
295
+ @entry1.visibility = false
296
+ end
297
+
294
298
  button.signal_connect "clicked" do
295
299
  callback.call(@entry1.text)
296
300
  @window.destroy
@@ -30,3 +30,5 @@ Converter.new(lambda { |x|
30
30
  x + "\n" + nums.join("+") + "=#{sum}"
31
31
  }, :lambda, :sum_of_numbers)
32
32
 
33
+ c = Converter.new(lambda { |x| x.scan(/[\w\.]+@[\w\.]+/).join("\n") }, :lambda, :get_emails)
34
+
data/lib/vimamsa/util.rb CHANGED
@@ -3,6 +3,40 @@
3
3
  # Cross-platform way of finding an executable in the $PATH.
4
4
  #
5
5
  # which('ruby') #=> /usr/bin/ruby
6
+
7
+
8
+ # Execute proc after wait_time seconds after last .run call.
9
+ # Used for image scaling after window resize
10
+ class DelayExecutioner
11
+ def initialize(wait_time, _proc)
12
+ @wait_time = wait_time
13
+ @proc = _proc
14
+ @lastt = Time.now
15
+ @thread_running = false
16
+ end
17
+
18
+ def start_thread
19
+ Thread.new {
20
+ while true
21
+ sleep 0.1
22
+ if Time.now - @lastt > @wait_time
23
+ @proc.call
24
+ @thread_running = false
25
+ break
26
+ end
27
+ end
28
+ }
29
+ end
30
+
31
+ def run()
32
+ @lastt = Time.now
33
+ if @thread_running == false
34
+ @thread_running = true
35
+ start_thread
36
+ end
37
+ end
38
+ end
39
+
6
40
  def which(cmd)
7
41
  exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
8
42
  ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
@@ -1,3 +1,3 @@
1
1
  module Vimamsa
2
- VERSION = "0.1.8"
2
+ VERSION = "0.1.9"
3
3
  end
data/lib/vimamsa.rb CHANGED
@@ -1,4 +1,9 @@
1
1
  require "vimamsa/version"
2
+
3
+ require "gtk3"
4
+ require "gtksourceview4"
5
+ test1 = Gtk::TextView.new
6
+
2
7
  require "vmaext"
3
8
 
4
9
  require "vimamsa/rbvma"
data/sheep.jpg ADDED
Binary file