vimamsa 0.1.14 → 0.1.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/custom_example.rb +9 -2
- data/lib/vimamsa/actions.rb +1 -2
- data/lib/vimamsa/buffer.rb +79 -31
- data/lib/vimamsa/buffer_changetext.rb +18 -1
- data/lib/vimamsa/buffer_list.rb +126 -139
- data/lib/vimamsa/buffer_manager.rb +11 -13
- data/lib/vimamsa/clipboard.rb +1 -0
- data/lib/vimamsa/conf.rb +6 -0
- data/lib/vimamsa/constants.rb +0 -10
- data/lib/vimamsa/debug.rb +5 -0
- data/lib/vimamsa/editor.rb +17 -7
- data/lib/vimamsa/file_history.rb +0 -8
- data/lib/vimamsa/file_manager.rb +6 -3
- data/lib/vimamsa/gui.rb +105 -55
- data/lib/vimamsa/gui_dialog.rb +1 -1
- data/lib/vimamsa/gui_menu.rb +5 -1
- data/lib/vimamsa/gui_sourceview.rb +38 -17
- data/lib/vimamsa/gui_sourceview_autocomplete.rb +141 -0
- data/lib/vimamsa/gui_text.rb +32 -2
- data/lib/vimamsa/hyper_plain_text.rb +11 -0
- data/lib/vimamsa/key_actions.rb +29 -10
- data/lib/vimamsa/key_binding_tree.rb +84 -14
- data/lib/vimamsa/key_bindings_vimlike.rb +31 -21
- data/lib/vimamsa/langservp.rb +23 -3
- data/lib/vimamsa/main.rb +4 -0
- data/lib/vimamsa/rbvma.rb +2 -0
- data/lib/vimamsa/search_replace.rb +35 -27
- data/lib/vimamsa/terminal.rb +12 -0
- data/lib/vimamsa/util.rb +11 -2
- data/lib/vimamsa/version.rb +1 -1
- data/vimamsa.gemspec +3 -2
- metadata +8 -7
data/lib/vimamsa/key_actions.rb
CHANGED
@@ -28,6 +28,8 @@ 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
|
|
@@ -38,8 +40,6 @@ reg_act(:easy_jump, proc { EasyJump.start }, "Easy jump")
|
|
38
40
|
reg_act(:gui_ensure_cursor_visible, proc { vma.gui.view.ensure_cursor_visible }, "Scroll to current cursor position")
|
39
41
|
reg_act(:gui_refresh_cursor, proc { vma.buf.refresh_cursor }, "Refresh cursor")
|
40
42
|
|
41
|
-
|
42
|
-
|
43
43
|
reg_act(:savedebug, "savedebug", "Save debug info", { :group => :debug })
|
44
44
|
reg_act(:open_file_dialog, "open_file_dialog", "Open file", { :group => :file })
|
45
45
|
reg_act(:create_new_file, "create_new_file", "Create new file", { :group => :file })
|
@@ -62,7 +62,7 @@ reg_act(:put_file_ref_to_clipboard, proc { buf.put_file_ref_to_clipboard }, "Put
|
|
62
62
|
reg_act(:encrypt_file, proc { encrypt_cur_buffer }, "Set current file to encrypt on save")
|
63
63
|
reg_act(:set_unencrypted, proc { buf.set_unencrypted }, "Set current file to save unencrypted")
|
64
64
|
reg_act(:set_executable, proc { buf.set_executable }, "Set current file permissions to executable")
|
65
|
-
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")
|
66
66
|
reg_act(:close_current_buffer, proc { bufs.close_current_buffer(true) }, "Close current buffer")
|
67
67
|
reg_act(:comment_selection, proc { buf.comment_selection }, "")
|
68
68
|
reg_act(:delete_char_forward, proc { buf.delete(CURRENT_CHAR_FORWARD) }, "Delete char forward", { :group => [:edit, :basic] })
|
@@ -94,15 +94,23 @@ reg_act :update_file_index, proc { FileFinder.update_index }, "Update file index
|
|
94
94
|
reg_act :delete_to_word_end, proc { buf.delete2(:to_word_end) }, "Delete to file end", { :group => [:edit, :basic] }
|
95
95
|
reg_act :delete_to_next_word_start, proc { buf.delete2(:to_next_word) }, "Delete to start of next word", { :group => [:edit, :basic] }
|
96
96
|
reg_act :delete_to_line_start, proc { buf.delete2(:to_line_start) }, "Delete to line start", { :group => [:edit, :basic] }
|
97
|
-
|
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
|
+
|
98
104
|
reg_act :exit_browse_mode, proc {
|
99
|
-
bufs.add_current_buf_to_history
|
100
|
-
|
101
|
-
|
105
|
+
bufs.add_current_buf_to_history
|
106
|
+
# Load previously saved buffer specific mode stack
|
107
|
+
buf.restore_kbd_mode
|
102
108
|
}, "Exit browse mode"
|
103
109
|
|
104
|
-
reg_act :page_down, proc { page_down }, "Page down", :group => [:move, :basic]
|
105
|
-
reg_act :
|
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]
|
106
114
|
reg_act :jump_to_start_of_buffer, proc { buf.jump(START_OF_BUFFER) }, "Jump to start of buffer"
|
107
115
|
reg_act :jump_to_end_of_buffer, proc { buf.jump(END_OF_BUFFER) }, "Jump to end of buffer"
|
108
116
|
reg_act(:auto_indent_buffer, proc { buf.indent }, "Auto format buffer")
|
@@ -164,7 +172,7 @@ act_list = {
|
|
164
172
|
:toggle_active_window => { :proc => proc { vma.gui.toggle_active_window },
|
165
173
|
:desc => "Toggle active window", :group => :search },
|
166
174
|
|
167
|
-
:toggle_two_column => { :proc => proc { vma.gui.
|
175
|
+
:toggle_two_column => { :proc => proc { vma.gui.toggle_two_column },
|
168
176
|
:desc => "Set two column mode", :group => :search },
|
169
177
|
|
170
178
|
:content_search => { :proc => proc { FileContentSearch.start_gui },
|
@@ -179,6 +187,17 @@ act_list = {
|
|
179
187
|
:debug_buf_hex => { :proc => proc { puts "SHA256: " + (Digest::SHA2.hexdigest vma.buf.to_s) },
|
180
188
|
:desc => "Output SHA256 hex digest of curent buffer" },
|
181
189
|
|
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
|
+
|
200
|
+
|
182
201
|
}
|
183
202
|
|
184
203
|
for k, v in act_list
|
@@ -23,12 +23,13 @@ setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc",
|
|
23
23
|
|
24
24
|
class State
|
25
25
|
attr_accessor :key_name, :eval_rule, :children, :action, :label, :major_modes, :level, :cursor_type
|
26
|
-
attr_reader :cur_mode
|
26
|
+
attr_reader :cur_mode, :scope
|
27
27
|
|
28
|
-
def initialize(key_name, eval_rule = "", ctype = :command)
|
28
|
+
def initialize(key_name, eval_rule = "", ctype = :command, scope: :buffer)
|
29
29
|
@key_name = key_name
|
30
30
|
@eval_rule = eval_rule
|
31
31
|
@children = []
|
32
|
+
@scope = scope
|
32
33
|
@major_modes = []
|
33
34
|
@action = nil
|
34
35
|
@level = 0
|
@@ -41,7 +42,7 @@ class State
|
|
41
42
|
end
|
42
43
|
|
43
44
|
class KeyBindingTree
|
44
|
-
attr_accessor :C, :I, :cur_state, :root, :match_state, :last_action, :cur_action, :modifiers, :next_command_count, :method_handles_repeat
|
45
|
+
attr_accessor :C, :I, :cur_state, :root, :match_state, :last_action, :cur_action, :modifiers, :next_command_count, :method_handles_repeat, :default_mode
|
45
46
|
attr_reader :mode_root_state, :state_trail, :act_bindings, :default_mode_stack
|
46
47
|
|
47
48
|
def initialize()
|
@@ -65,34 +66,62 @@ class KeyBindingTree
|
|
65
66
|
@act_bindings = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
|
66
67
|
end
|
67
68
|
|
68
|
-
def
|
69
|
+
def set_mode(label)
|
69
70
|
@match_state = [@modes[label]] # used for matching input
|
70
71
|
@mode_root_state = @modes[label]
|
71
|
-
@default_mode = label
|
72
|
+
# @default_mode = label
|
72
73
|
@default_mode_stack << label
|
74
|
+
|
75
|
+
__set_mode(label)
|
73
76
|
if !vma.buf.nil?
|
74
77
|
# vma.buf.mode_stack = @default_mode_stack.clone
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
81
|
+
def set_default_mode(label)
|
82
|
+
@match_state = [@modes[label]]
|
83
|
+
@mode_root_state = @modes[label]
|
84
|
+
@default_mode = label
|
85
|
+
set_mode_stack [label]
|
86
|
+
end
|
87
|
+
|
78
88
|
def set_mode_stack(ms)
|
89
|
+
debug "set_mode_stack(#{ms})", 2
|
90
|
+
show_caller if cnf.debug? # TODO: remove
|
79
91
|
@default_mode_stack = ms
|
92
|
+
label = @default_mode_stack[-1]
|
93
|
+
@match_state = [@modes[label]]
|
94
|
+
@mode_root_state = @modes[label]
|
95
|
+
end
|
96
|
+
|
97
|
+
def dump_state
|
98
|
+
debug "dump_state", 2
|
99
|
+
pp ["@default_mode_stack", @default_mode_stack]
|
100
|
+
pp ["@default_mode", @default_mode]
|
101
|
+
pp ["vma.buf.mode_stack", vma.buf.mode_stack]
|
102
|
+
pp ["scope", self.get_scope]
|
103
|
+
# pp ["@mode_root_state", @mode_root_state]
|
104
|
+
# pp ["@match_state", @match_state]
|
80
105
|
end
|
81
106
|
|
82
107
|
def set_mode_to_default()
|
83
108
|
# set_mode(@default_mode)
|
84
|
-
|
109
|
+
set_mode_stack [@default_mode_stack[0]]
|
110
|
+
__set_mode(@default_mode_stack[0])
|
85
111
|
end
|
86
112
|
|
87
113
|
def to_previous_mode()
|
114
|
+
debug "to_previous_mode",2
|
115
|
+
pp @default_mode_stack
|
88
116
|
if @default_mode_stack.size > 1
|
89
117
|
@default_mode_stack.pop
|
90
118
|
end
|
91
|
-
|
119
|
+
pp @default_mode_stack
|
120
|
+
__set_mode(@default_mode_stack[-1])
|
92
121
|
end
|
93
122
|
|
94
|
-
def add_mode(id, label, cursortype = :command, name: nil)
|
95
|
-
mode = State.new(id, "", cursortype)
|
123
|
+
def add_mode(id, label, cursortype = :command, name: nil, scope: :buffer)
|
124
|
+
mode = State.new(id, "", cursortype, scope: scope)
|
96
125
|
mode.level = 1
|
97
126
|
@modes[label] = mode
|
98
127
|
@root.children << mode
|
@@ -105,6 +134,10 @@ class KeyBindingTree
|
|
105
134
|
def add_minor_mode(id, label, major_mode_label)
|
106
135
|
mode = State.new(id)
|
107
136
|
@modes[label] = mode
|
137
|
+
if @root.nil?
|
138
|
+
show_caller
|
139
|
+
Ripl.start :binding => binding
|
140
|
+
end
|
108
141
|
@root.children << mode
|
109
142
|
mode.major_modes << major_mode_label
|
110
143
|
end
|
@@ -166,7 +199,8 @@ class KeyBindingTree
|
|
166
199
|
vma.gui.statnfo.markup = "<span weight='ultrabold'>#{st}</span>"
|
167
200
|
end
|
168
201
|
|
169
|
-
def
|
202
|
+
def __set_mode(label)
|
203
|
+
debug "__set_mode(#{label})"
|
170
204
|
@mode_history << @mode_root_state
|
171
205
|
|
172
206
|
# Check if label in form :label
|
@@ -183,11 +217,19 @@ class KeyBindingTree
|
|
183
217
|
end
|
184
218
|
@cur_mode = label
|
185
219
|
|
220
|
+
if self.get_scope != :editor and !vma.buf.nil?
|
221
|
+
vma.buf.mode_stack = @default_mode_stack.clone
|
222
|
+
end
|
223
|
+
|
186
224
|
if !vma.gui.view.nil?
|
187
225
|
vma.gui.view.draw_cursor() #TODO: handle outside this class
|
188
226
|
end
|
189
227
|
end
|
190
228
|
|
229
|
+
def get_scope
|
230
|
+
@mode_root_state.scope
|
231
|
+
end
|
232
|
+
|
191
233
|
def cur_mode_str()
|
192
234
|
return @mode_root_state.key_name
|
193
235
|
end
|
@@ -410,6 +452,8 @@ class KeyBindingTree
|
|
410
452
|
|
411
453
|
def bindkey(key, action)
|
412
454
|
if key.class != Array
|
455
|
+
# Handle syntax like :
|
456
|
+
# "X esc || X ctrl!" => "vma.kbd.to_previous_mode",
|
413
457
|
key = key.split("||")
|
414
458
|
end
|
415
459
|
|
@@ -440,10 +484,19 @@ class KeyBindingTree
|
|
440
484
|
end
|
441
485
|
|
442
486
|
m = key.match(/^(\S+)\s(\S.*)$/)
|
487
|
+
# Match/split e.g. "VC , , s" to "VC" and ", , s"
|
443
488
|
if m
|
444
489
|
modetmp = m[1]
|
445
490
|
debug [key, modetmp, m].inspect
|
491
|
+
|
492
|
+
# If all of first word are uppercase, e.g. in
|
493
|
+
# "VCIX left" => "buf.move(BACKWARD_CHAR)",
|
494
|
+
# interpret as each char representing a mode
|
446
495
|
modes = modetmp.split("") if modetmp.match(/^\p{Lu}+$/) # Uppercase
|
496
|
+
|
497
|
+
# If all of first word is down case, like in:
|
498
|
+
# bindkey "audio space", :audio_stop
|
499
|
+
# interpret as whole word representing a mode.
|
447
500
|
modes = [modetmp] if modetmp.match(/^\p{Ll}+$/) # Lowercase
|
448
501
|
keydef = m[2]
|
449
502
|
else
|
@@ -456,7 +509,15 @@ class KeyBindingTree
|
|
456
509
|
}
|
457
510
|
end
|
458
511
|
|
512
|
+
# Binds a keyboard key combination to an action,
|
513
|
+
# for a given keyboard mode like insert ("I") or command ("C")
|
459
514
|
def mode_bind_key(mode_id, keydef, action)
|
515
|
+
# debug "mode_bind_key #{mode_id.inspect}, #{keydef.inspect}, #{action.inspect}", 2
|
516
|
+
# Example:
|
517
|
+
# bindkey "C , f", :gui_file_finder
|
518
|
+
# mode_id = "C", keydef = ", f"
|
519
|
+
# and action = :gui_file_finder
|
520
|
+
|
460
521
|
set_state(mode_id, "") # TODO: check is ok?
|
461
522
|
start_state = @cur_state
|
462
523
|
|
@@ -464,23 +525,32 @@ class KeyBindingTree
|
|
464
525
|
|
465
526
|
prev_state = nil
|
466
527
|
s1 = start_state
|
467
|
-
|
528
|
+
|
529
|
+
k_arr.each_with_index { |k, idx|
|
468
530
|
# check if key has rules for context like q has in
|
469
531
|
# "C q(cntx.recording_macro==true)"
|
470
|
-
|
532
|
+
last_item = false
|
533
|
+
if k_arr.size - 1 == idx
|
534
|
+
last_item = true
|
535
|
+
end
|
536
|
+
match = /(.+)\((.*)\)/.match(k)
|
471
537
|
eval_rule = ""
|
472
538
|
if match
|
473
539
|
key_name = match[1]
|
474
540
|
eval_rule = match[2]
|
475
541
|
else
|
476
|
-
key_name =
|
542
|
+
key_name = k
|
477
543
|
end
|
478
544
|
|
479
545
|
prev_state = s1
|
480
546
|
# Create a new state for key if it doesn't exist
|
481
547
|
s1 = find_state(key_name, eval_rule)
|
482
|
-
if s1 == nil
|
548
|
+
if s1 == nil or last_item
|
483
549
|
new_state = State.new(key_name, eval_rule)
|
550
|
+
if last_item
|
551
|
+
# Override existing key definition
|
552
|
+
@cur_state.children.delete(s1)
|
553
|
+
end
|
484
554
|
s1 = new_state
|
485
555
|
@cur_state.children << new_state
|
486
556
|
end
|
@@ -4,10 +4,10 @@ vma.kbd.add_mode("V", :visual, :visual)
|
|
4
4
|
vma.kbd.add_mode("M", :minibuffer) #TODO: needed?
|
5
5
|
vma.kbd.add_mode("R", :readchar)
|
6
6
|
vma.kbd.add_minor_mode("audio", :audio, :command)
|
7
|
-
vma.kbd.add_mode("B", :browse, :command)
|
7
|
+
vma.kbd.add_mode("B", :browse, :command, scope: :editor)
|
8
8
|
vma.kbd.add_mode("X", :replace, :command, name: "Replace")
|
9
9
|
vma.kbd.set_default_mode(:command)
|
10
|
-
vma.kbd.
|
10
|
+
vma.kbd.__set_mode(:command) #TODO:needed?
|
11
11
|
# vma.kbd.show_state_trail
|
12
12
|
|
13
13
|
|
@@ -17,7 +17,6 @@ bindkey "VC s", :easy_jump
|
|
17
17
|
bindkey "VC , m f", [:find_macro_gui, proc { vma.macro.find_macro_gui }, "Find named macro"]
|
18
18
|
bindkey "C , m n", [:gui_name_macro, proc { vma.macro.gui_name_macro }, "Name last macro"]
|
19
19
|
bindkey "C , j r", :jump_to_random
|
20
|
-
bindkey "I enter", :insert_new_line
|
21
20
|
bindkey "C , ; s k", :show_key_bindings #TODO: better binding
|
22
21
|
bindkey "C , , c b", :put_file_path_to_clipboard #TODO: better binding or remove?
|
23
22
|
bindkey "C , , e", :encrypt_file #TODO: better binding
|
@@ -58,7 +57,7 @@ bindkey "audio f || audio right", [:audio_forward, proc { Audio.seek_forward },
|
|
58
57
|
bindkey "audio left", [:audio_backward, proc { Audio.seek_forward(-5.0) }, "Seek backward in audio stream"]
|
59
58
|
|
60
59
|
bindkey "audio space", :audio_stop
|
61
|
-
bindkey "audio q || audio esc", "vma.kbd.
|
60
|
+
bindkey "audio q || audio esc", "vma.kbd.to_previous_mode"
|
62
61
|
|
63
62
|
# bindkey "C , f o", :open_file_dialog
|
64
63
|
bindkey "CI ctrl-o", :open_file_dialog
|
@@ -79,8 +78,9 @@ bindkey "B z", "center_on_current_line();call_action(:exit_browse_mode)"
|
|
79
78
|
bindkey "B enter || B return || B esc || B j || B ctrl!", :exit_browse_mode
|
80
79
|
bindkey "B s", :page_up
|
81
80
|
bindkey "B d", :page_down
|
82
|
-
bindkey "B
|
83
|
-
bindkey "B
|
81
|
+
bindkey "B r", proc { vma.gui.page_down(multip:0.25)}
|
82
|
+
bindkey "B e", proc { vma.gui.page_up(multip:0.25)}
|
83
|
+
|
84
84
|
bindkey "B i", :jump_to_start_of_buffer
|
85
85
|
bindkey "B o", :jump_to_end_of_buffer
|
86
86
|
bindkey "B c", :close_current_buffer
|
@@ -105,7 +105,7 @@ default_keys = {
|
|
105
105
|
"C ctrl-s" => :buf_save,
|
106
106
|
|
107
107
|
# Buffer handling
|
108
|
-
"C B" => "bufs.switch",
|
108
|
+
# "C B" => "bufs.switch",
|
109
109
|
"C tab" => "bufs.switch_to_last_buf",
|
110
110
|
# 'C , s'=> 'gui_select_buffer',
|
111
111
|
"C , r v b" => :buf_revert,
|
@@ -117,11 +117,22 @@ default_keys = {
|
|
117
117
|
# MOVING
|
118
118
|
# 'VC h' => 'buf.move(BACKWARD_CHAR)',
|
119
119
|
"VC l" => "buf.move(FORWARD_CHAR)",
|
120
|
-
"VC j" => "buf.move(FORWARD_LINE)",
|
121
|
-
"VC k" => "buf.move(BACKWARD_LINE)",
|
120
|
+
# "VC j" => "buf.move(FORWARD_LINE)",
|
121
|
+
# "VC k" => "buf.move(BACKWARD_LINE)",
|
122
|
+
|
123
|
+
"VC pagedown" => :page_down,
|
124
|
+
"VC pageup" => :page_up,
|
122
125
|
|
123
|
-
"
|
124
|
-
"
|
126
|
+
"I down(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_next",
|
127
|
+
"I tab(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_next",
|
128
|
+
"I up(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_previous",
|
129
|
+
"I shift-tab(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_previous",
|
130
|
+
"I enter(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select",
|
131
|
+
|
132
|
+
"I tab" => 'buf.insert_tab',
|
133
|
+
"I shift-tab" => 'buf.unindent',
|
134
|
+
|
135
|
+
"I enter" => :insert_new_line,
|
125
136
|
|
126
137
|
"VCIX left" => "buf.move(BACKWARD_CHAR)",
|
127
138
|
"VCIX right" => "buf.move(FORWARD_CHAR)",
|
@@ -172,6 +183,7 @@ default_keys = {
|
|
172
183
|
"C , d b" => "debug_print_buffer",
|
173
184
|
"C , d c" => "debug_dump_clipboard",
|
174
185
|
"C , d d" => "debug_dump_deltas",
|
186
|
+
"C , d m" => :kbd_dump_state,
|
175
187
|
|
176
188
|
"VC O" => "buf.jump(END_OF_LINE)",
|
177
189
|
"VC $" => "buf.jump(END_OF_LINE)",
|
@@ -189,7 +201,6 @@ default_keys = {
|
|
189
201
|
|
190
202
|
# Command mode only:
|
191
203
|
"C ctrl-r" => "buf.redo()", # TODO:???
|
192
|
-
"C R" => "buf.redo()",
|
193
204
|
"C v" => "buf.start_visual_mode",
|
194
205
|
"C P" => "buf.paste(BEFORE)", # TODO: implement as replace for visual mode
|
195
206
|
"C space <char>" => "buf.insert_txt(<char>)",
|
@@ -246,16 +257,13 @@ default_keys = {
|
|
246
257
|
'CV \' <char>' => "buf.jump_to_mark(<char>)",
|
247
258
|
# "CV ''" =>'jump_to_mark(NEXT_MARK)', #TODO
|
248
259
|
|
249
|
-
# Switch to
|
260
|
+
# Switch to another mode
|
250
261
|
"C i" => "vma.kbd.set_mode(:insert)",
|
251
262
|
"C R" => "vma.kbd.set_mode(:replace)",
|
252
263
|
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
253
|
-
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
254
264
|
|
255
|
-
|
256
|
-
|
257
|
-
"X esc" => "vma.kbd.set_mode(:command)",
|
258
|
-
"X ctrl!" => "vma.kbd.set_mode(:command)",
|
265
|
+
# Replace mode
|
266
|
+
"X esc || X ctrl!" => "vma.kbd.to_previous_mode",
|
259
267
|
"X <char>" => "buf.replace_with_char(<char>);buf.move(FORWARD_CHAR)",
|
260
268
|
|
261
269
|
# Macros
|
@@ -280,7 +288,7 @@ default_keys = {
|
|
280
288
|
# "I ctrl!" => "vma.kbd.to_previous_mode",
|
281
289
|
"C shift!" => "buf.save",
|
282
290
|
"I <char>" => "buf.insert_txt(<char>)",
|
283
|
-
"I esc || I ctrl!" => "vma.kbd.
|
291
|
+
"I esc || I ctrl!" => "vma.kbd.to_previous_mode",
|
284
292
|
|
285
293
|
"I ctrl-d" => "buf.delete2(:to_word_end)",
|
286
294
|
|
@@ -294,8 +302,10 @@ default_keys = {
|
|
294
302
|
"IX alt-f" => "buf.jump_word(FORWARD,WORD_START)",
|
295
303
|
"IX alt-b" => "buf.jump_word(BACKWARD,WORD_START)",
|
296
304
|
|
297
|
-
"I
|
298
|
-
"I
|
305
|
+
"I ctrl-h" => :show_autocomplete,
|
306
|
+
"I ctrl-j" => "vma.buf.view.hide_completions",
|
307
|
+
|
308
|
+
|
299
309
|
"I space" => 'buf.insert_txt(" ")',
|
300
310
|
# "I return" => 'buf.insert_new_line()',
|
301
311
|
}
|
data/lib/vimamsa/langservp.rb
CHANGED
@@ -19,13 +19,31 @@ class LangSrv
|
|
19
19
|
|
20
20
|
def initialize(lang)
|
21
21
|
@error = true
|
22
|
-
clsp = conf(:custom_lsp)
|
23
22
|
|
24
23
|
# Use LSP server specified by user if available
|
25
24
|
@lang = lang
|
26
|
-
|
25
|
+
|
26
|
+
lspconf = nil
|
27
|
+
ret = cnf.lsp.server?.find { |k, v| v[:languages].include?(@lang) }
|
28
|
+
lspconf = ret[1] unless ret.nil?
|
29
|
+
|
27
30
|
if !lspconf.nil?
|
28
|
-
|
31
|
+
error = false
|
32
|
+
begin
|
33
|
+
@io = IO.popen(lspconf[:command], "r+")
|
34
|
+
rescue Errno::ENOENT => e
|
35
|
+
pp e
|
36
|
+
error = true
|
37
|
+
rescue StandardError => e
|
38
|
+
debug "StandardError @io = IO.popen(lspconf[:command] ...", 2
|
39
|
+
pp e
|
40
|
+
error = true
|
41
|
+
end
|
42
|
+
if error or @io.nil?
|
43
|
+
message("Could not start lsp server #{lspconf[:name]}")
|
44
|
+
error = true
|
45
|
+
return nil
|
46
|
+
end
|
29
47
|
else
|
30
48
|
return nil
|
31
49
|
end
|
@@ -37,6 +55,8 @@ class LangSrv
|
|
37
55
|
for c in conf(:workspace_folders)
|
38
56
|
wf << LSP::Interface::WorkspaceFolder.new(uri: c[:uri], name: c[:name])
|
39
57
|
end
|
58
|
+
debug "WORKSPACE FOLDERS", 2
|
59
|
+
debug wf.inspect, 2
|
40
60
|
|
41
61
|
pid = Process.pid
|
42
62
|
|
data/lib/vimamsa/main.rb
CHANGED
data/lib/vimamsa/rbvma.rb
CHANGED
@@ -32,6 +32,7 @@ require "vimamsa/gui_menu"
|
|
32
32
|
require "vimamsa/gui_dialog"
|
33
33
|
require "vimamsa/gui_select_window"
|
34
34
|
require "vimamsa/gui_sourceview"
|
35
|
+
require "vimamsa/gui_sourceview_autocomplete"
|
35
36
|
require "vimamsa/gui_image"
|
36
37
|
require "vimamsa/hyper_plain_text"
|
37
38
|
|
@@ -39,6 +40,7 @@ require "vimamsa/ack"
|
|
39
40
|
require "vimamsa/buffer"
|
40
41
|
require "vimamsa/buffer_cursor"
|
41
42
|
require "vimamsa/buffer_changetext"
|
43
|
+
# require "vimamsa/buffer_list"
|
42
44
|
require "vimamsa/buffer_list"
|
43
45
|
require "vimamsa/buffer_manager"
|
44
46
|
require "vimamsa/constants"
|
@@ -1,9 +1,3 @@
|
|
1
|
-
class Grep
|
2
|
-
attr_accessor :history
|
3
|
-
|
4
|
-
def initialize()
|
5
|
-
end
|
6
|
-
end
|
7
1
|
|
8
2
|
class FileSelector
|
9
3
|
def initialize()
|
@@ -85,9 +79,14 @@ class Grep
|
|
85
79
|
end
|
86
80
|
vma.kbd.add_minor_mode("bmgr", :buf_mgr, :command)
|
87
81
|
reg_act(:grep_buffer, proc { Grep.new.run }, "Grep current buffer")
|
82
|
+
reg_act(:grep_refresh, proc {
|
83
|
+
if vma.buf.module.class == Grep
|
84
|
+
vma.buf.module.refresh
|
85
|
+
end
|
86
|
+
}, "Refresh current Grep buffer")
|
88
87
|
|
89
88
|
bindkey "C , g", :grep_buffer
|
90
|
-
|
89
|
+
bindkey "grep ctrl-r", :grep_refresh
|
91
90
|
end
|
92
91
|
|
93
92
|
def apply_changes()
|
@@ -114,45 +113,54 @@ class Grep
|
|
114
113
|
@line_to_id = {}
|
115
114
|
end
|
116
115
|
|
117
|
-
def
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
res_str = ""
|
116
|
+
def refresh
|
117
|
+
set_buf_contents
|
118
|
+
end
|
119
|
+
|
120
|
+
def set_buf_contents()
|
121
|
+
lines = @orig_buf.split("\n")
|
124
122
|
|
125
|
-
hlparts = []
|
126
123
|
@grep_matches = []
|
124
|
+
|
125
|
+
res_str = ""
|
127
126
|
lines.each_with_index { |l, i|
|
128
|
-
if r.match(l)
|
127
|
+
if @r.match(l)
|
129
128
|
res_str << "#{i + 1}:"
|
130
129
|
# ind = scan_indexes(l, r)
|
131
130
|
res_str << "#{l}\n"
|
132
131
|
@grep_matches << i + 1 # Lines start from index 1
|
133
132
|
end
|
134
133
|
}
|
135
|
-
|
134
|
+
|
135
|
+
@buf.set_content(res_str)
|
136
|
+
|
137
|
+
Gui.highlight_match(@buf, @search_str, color: cnf.match.highlight.color!)
|
138
|
+
end
|
139
|
+
|
140
|
+
def callback(search_str, b = nil)
|
141
|
+
debug "grep_cur_buffer(search_str)"
|
142
|
+
@r = Regexp.new(Regexp.escape(search_str), Regexp::IGNORECASE)
|
143
|
+
fpath = ""
|
144
|
+
fpath = vma.buf.pathname.expand_path.to_s + ":" if vma.buf.pathname
|
145
|
+
|
146
|
+
@search_str = search_str
|
136
147
|
@orig_buf = vma.buf
|
137
|
-
|
138
|
-
vbuf = vma.gui.view.buffer
|
148
|
+
@buf = create_new_buffer("", "grep")
|
139
149
|
|
140
|
-
|
141
|
-
|
142
|
-
b.module = self
|
150
|
+
@buf.default_mode = :grep
|
151
|
+
@buf.module = self
|
143
152
|
|
144
|
-
vma.kbd.set_mode(:grep)
|
145
|
-
|
146
|
-
b.line_action_handler = proc { |lineno|
|
153
|
+
vma.kbd.set_mode(:grep)
|
154
|
+
@buf.line_action_handler = proc { |lineno|
|
147
155
|
debug "GREP HANDLER:#{lineno}"
|
148
156
|
jumpto = @grep_matches[lineno]
|
149
157
|
if jumpto.class == Integer
|
150
|
-
# vma.buffers.set_current_buffer($grep_bufid, update_history = true)
|
151
|
-
# buf.jump_to_line(jumpto)
|
152
158
|
vma.buffers.set_current_buffer_by_id(@orig_buf.id)
|
153
159
|
@orig_buf.jump_to_line(jumpto)
|
154
160
|
end
|
155
161
|
}
|
162
|
+
|
163
|
+
set_buf_contents
|
156
164
|
end
|
157
165
|
|
158
166
|
def run()
|
data/lib/vimamsa/terminal.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
def exec_in_terminal(cmd, autoclose = false)
|
2
3
|
# debug "CMD:#{cmd}"
|
3
4
|
|
@@ -19,4 +20,15 @@ def exec_in_terminal(cmd, autoclose = false)
|
|
19
20
|
fork { exec "gnome-terminal", "--tab", "--", "bash", "-i", $initf.path, "-c", "exec bash" }
|
20
21
|
end
|
21
22
|
|
23
|
+
def command_to_buf_callback(cmd)
|
24
|
+
require "open3"
|
25
|
+
stdout, stderr, status = Open3.capture3(cmd)
|
26
|
+
b = create_new_buffer(stdout, cmd)
|
27
|
+
end
|
28
|
+
|
22
29
|
|
30
|
+
load "terminal_extra.rb" if File.exist?("terminal_extra.rb")
|
31
|
+
def command_to_buf
|
32
|
+
callback = method("command_to_buf_callback")
|
33
|
+
gui_one_input_action("Execute command in shell, output to buffer", "Command:", "Execute", callback)
|
34
|
+
end
|
data/lib/vimamsa/util.rb
CHANGED
@@ -23,8 +23,17 @@ def file_is_text_file(fpath)
|
|
23
23
|
debug "file_is_text_file(#{fpath})"
|
24
24
|
fpath = File.expand_path(fpath)
|
25
25
|
return false if !File.exist?(fpath)
|
26
|
+
return false if !File.file?(fpath)
|
27
|
+
|
28
|
+
if File.size(fpath) < 1000e3 #smaler than 1MB
|
29
|
+
str = IO.read(fpath)
|
30
|
+
str.force_encoding("UTF-8")
|
31
|
+
debug "Small file with valid utf-8"
|
32
|
+
return true if str.valid_encoding?
|
33
|
+
end
|
34
|
+
|
35
|
+
#TODO: not sure if needed
|
26
36
|
r = exec_cmd("file", fpath)
|
27
|
-
debug "DEBUG:#{r}"
|
28
37
|
return true if r.match(/UTF-8.*text/)
|
29
38
|
return true if r.match(/ASCII.*text/)
|
30
39
|
return false
|
@@ -101,7 +110,7 @@ class HSafe
|
|
101
110
|
hh = @h
|
102
111
|
while !b.empty?
|
103
112
|
x = b.pop
|
104
|
-
|
113
|
+
debug "x=#{x}"
|
105
114
|
pp b
|
106
115
|
ok = false
|
107
116
|
if hh.class == Hash or hh.class == Array
|
data/lib/vimamsa/version.rb
CHANGED
data/vimamsa.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.require_paths = ["lib","ext"]
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 2.4.21"
|
24
|
-
spec.add_development_dependency "rake", "~> 13.0"
|
24
|
+
spec.add_development_dependency "rake", "~> 13.1.0"
|
25
25
|
|
26
26
|
spec.add_runtime_dependency 'rufo', '~> 0.16.2'
|
27
27
|
|
@@ -29,7 +29,8 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_runtime_dependency 'ripl-multi_line', '~> 0.3.1'
|
30
30
|
spec.add_runtime_dependency 'gdk4', '~> 4.2.0'
|
31
31
|
spec.add_runtime_dependency 'gtk4', '~> 4.2.0'
|
32
|
-
spec.add_runtime_dependency '
|
32
|
+
spec.add_runtime_dependency 'rambling-trie', '~> 2.3.1'
|
33
|
+
|
33
34
|
spec.add_runtime_dependency 'differ', '~> 0.1.2'
|
34
35
|
spec.add_runtime_dependency 'gtksourceview5', '~> 4.2.0'
|
35
36
|
spec.add_runtime_dependency 'parallel', '~> 1.14' #TODO: update?
|