vimamsa 0.1.14 → 0.1.16
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 +34 -23
- 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 +7 -1
- data/lib/vimamsa/gui_sourceview.rb +58 -18
- 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 +44 -23
- 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 +40 -2
- data/lib/vimamsa/version.rb +1 -1
- data/vimamsa.gemspec +3 -2
- metadata +8 -7
data/lib/vimamsa/gui_text.rb
CHANGED
@@ -1,11 +1,41 @@
|
|
1
1
|
module Gui
|
2
|
-
def self.
|
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")
|
3
29
|
vbuf = bf.view.buffer
|
4
30
|
r = Regexp.new(Regexp.escape(str), Regexp::IGNORECASE)
|
5
31
|
|
6
32
|
hlparts = []
|
7
33
|
|
8
|
-
tt = vma.gui.view.buffer.
|
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
|
+
|
9
39
|
tt.weight = 650
|
10
40
|
tt.foreground = color
|
11
41
|
|
@@ -39,12 +39,23 @@ def hpt_check_cur_word(w)
|
|
39
39
|
# return true
|
40
40
|
else
|
41
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
|
+
|
42
49
|
end
|
43
50
|
end
|
44
51
|
end
|
45
52
|
return nil
|
46
53
|
end
|
47
54
|
|
55
|
+
def hpt_create_new_file(fn)
|
56
|
+
create_new_file(fn)
|
57
|
+
end
|
58
|
+
|
48
59
|
def translate_path(fn, bf)
|
49
60
|
if File.exist?(fn)
|
50
61
|
outfn = fn
|
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
|
+
debug @default_mode_stack
|
88
116
|
if @default_mode_stack.size > 1
|
89
117
|
@default_mode_stack.pop
|
90
118
|
end
|
91
|
-
|
119
|
+
debug @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,20 +4,27 @@ 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, :
|
8
|
-
vma.kbd.add_mode("X", :replace, :
|
7
|
+
vma.kbd.add_mode("B", :browse, :browse, scope: :editor)
|
8
|
+
vma.kbd.add_mode("X", :replace, :replace, name: "Replace")
|
9
9
|
vma.kbd.set_default_mode(:command)
|
10
|
-
vma.kbd.
|
10
|
+
vma.kbd.__set_mode(:command) #TODO:needed?
|
11
|
+
# cnf.mode.command.cursor.background = "#fc6f03"
|
12
|
+
cnf.mode.command.cursor.background = "#05c5a0"
|
13
|
+
cnf.mode.default.cursor.background = "#03fcca"
|
14
|
+
# cnf.mode.visual.cursor.background = "#10bd8e"
|
15
|
+
# cnf.mode.visual.cursor.background = "#e95420"
|
16
|
+
# cnf.mode.visual.cursor.background = "#cb3804"
|
17
|
+
cnf.mode.visual.cursor.background = "#bc6040"
|
18
|
+
cnf.mode.replace.cursor.background = "#fc0331"
|
19
|
+
cnf.mode.browse.cursor.background = "#f803fc"
|
11
20
|
# vma.kbd.show_state_trail
|
12
21
|
|
13
|
-
|
14
22
|
bindkey ["VCB M", "B m"], :run_last_macro
|
15
23
|
|
16
24
|
bindkey "VC s", :easy_jump
|
17
25
|
bindkey "VC , m f", [:find_macro_gui, proc { vma.macro.find_macro_gui }, "Find named macro"]
|
18
26
|
bindkey "C , m n", [:gui_name_macro, proc { vma.macro.gui_name_macro }, "Name last macro"]
|
19
27
|
bindkey "C , j r", :jump_to_random
|
20
|
-
bindkey "I enter", :insert_new_line
|
21
28
|
bindkey "C , ; s k", :show_key_bindings #TODO: better binding
|
22
29
|
bindkey "C , , c b", :put_file_path_to_clipboard #TODO: better binding or remove?
|
23
30
|
bindkey "C , , e", :encrypt_file #TODO: better binding
|
@@ -58,7 +65,7 @@ bindkey "audio f || audio right", [:audio_forward, proc { Audio.seek_forward },
|
|
58
65
|
bindkey "audio left", [:audio_backward, proc { Audio.seek_forward(-5.0) }, "Seek backward in audio stream"]
|
59
66
|
|
60
67
|
bindkey "audio space", :audio_stop
|
61
|
-
bindkey "audio q || audio esc", "vma.kbd.
|
68
|
+
bindkey "audio q || audio esc", "vma.kbd.to_previous_mode"
|
62
69
|
|
63
70
|
# bindkey "C , f o", :open_file_dialog
|
64
71
|
bindkey "CI ctrl-o", :open_file_dialog
|
@@ -79,8 +86,9 @@ bindkey "B z", "center_on_current_line();call_action(:exit_browse_mode)"
|
|
79
86
|
bindkey "B enter || B return || B esc || B j || B ctrl!", :exit_browse_mode
|
80
87
|
bindkey "B s", :page_up
|
81
88
|
bindkey "B d", :page_down
|
82
|
-
bindkey "B
|
83
|
-
bindkey "B
|
89
|
+
bindkey "B r", proc { vma.gui.page_down(multip:0.25)}
|
90
|
+
bindkey "B e", proc { vma.gui.page_up(multip:0.25)}
|
91
|
+
|
84
92
|
bindkey "B i", :jump_to_start_of_buffer
|
85
93
|
bindkey "B o", :jump_to_end_of_buffer
|
86
94
|
bindkey "B c", :close_current_buffer
|
@@ -105,7 +113,7 @@ default_keys = {
|
|
105
113
|
"C ctrl-s" => :buf_save,
|
106
114
|
|
107
115
|
# Buffer handling
|
108
|
-
"C B" => "bufs.switch",
|
116
|
+
# "C B" => "bufs.switch",
|
109
117
|
"C tab" => "bufs.switch_to_last_buf",
|
110
118
|
# 'C , s'=> 'gui_select_buffer',
|
111
119
|
"C , r v b" => :buf_revert,
|
@@ -117,11 +125,22 @@ default_keys = {
|
|
117
125
|
# MOVING
|
118
126
|
# 'VC h' => 'buf.move(BACKWARD_CHAR)',
|
119
127
|
"VC l" => "buf.move(FORWARD_CHAR)",
|
120
|
-
"VC j" => "buf.move(FORWARD_LINE)",
|
121
|
-
"VC k" => "buf.move(BACKWARD_LINE)",
|
128
|
+
# "VC j" => "buf.move(FORWARD_LINE)",
|
129
|
+
# "VC k" => "buf.move(BACKWARD_LINE)",
|
130
|
+
|
131
|
+
"VC pagedown" => :page_down,
|
132
|
+
"VC pageup" => :page_up,
|
122
133
|
|
123
|
-
"
|
124
|
-
"
|
134
|
+
"I down(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_next",
|
135
|
+
"I tab(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_next",
|
136
|
+
"I up(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_previous",
|
137
|
+
"I shift-tab(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select_previous",
|
138
|
+
"I enter(vma.buf.view.autocp_active)" => "vma.buf.view.autocp_select",
|
139
|
+
|
140
|
+
"I tab" => 'buf.insert_tab',
|
141
|
+
"I shift-tab" => 'buf.unindent',
|
142
|
+
|
143
|
+
"I enter" => :insert_new_line,
|
125
144
|
|
126
145
|
"VCIX left" => "buf.move(BACKWARD_CHAR)",
|
127
146
|
"VCIX right" => "buf.move(FORWARD_CHAR)",
|
@@ -172,6 +191,7 @@ default_keys = {
|
|
172
191
|
"C , d b" => "debug_print_buffer",
|
173
192
|
"C , d c" => "debug_dump_clipboard",
|
174
193
|
"C , d d" => "debug_dump_deltas",
|
194
|
+
"C , d m" => :kbd_dump_state,
|
175
195
|
|
176
196
|
"VC O" => "buf.jump(END_OF_LINE)",
|
177
197
|
"VC $" => "buf.jump(END_OF_LINE)",
|
@@ -189,7 +209,6 @@ default_keys = {
|
|
189
209
|
|
190
210
|
# Command mode only:
|
191
211
|
"C ctrl-r" => "buf.redo()", # TODO:???
|
192
|
-
"C R" => "buf.redo()",
|
193
212
|
"C v" => "buf.start_visual_mode",
|
194
213
|
"C P" => "buf.paste(BEFORE)", # TODO: implement as replace for visual mode
|
195
214
|
"C space <char>" => "buf.insert_txt(<char>)",
|
@@ -246,16 +265,13 @@ default_keys = {
|
|
246
265
|
'CV \' <char>' => "buf.jump_to_mark(<char>)",
|
247
266
|
# "CV ''" =>'jump_to_mark(NEXT_MARK)', #TODO
|
248
267
|
|
249
|
-
# Switch to
|
268
|
+
# Switch to another mode
|
250
269
|
"C i" => "vma.kbd.set_mode(:insert)",
|
251
270
|
"C R" => "vma.kbd.set_mode(:replace)",
|
252
271
|
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
253
|
-
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
254
272
|
|
255
|
-
|
256
|
-
|
257
|
-
"X esc" => "vma.kbd.set_mode(:command)",
|
258
|
-
"X ctrl!" => "vma.kbd.set_mode(:command)",
|
273
|
+
# Replace mode
|
274
|
+
"X esc || X ctrl!" => "vma.kbd.to_previous_mode",
|
259
275
|
"X <char>" => "buf.replace_with_char(<char>);buf.move(FORWARD_CHAR)",
|
260
276
|
|
261
277
|
# Macros
|
@@ -280,7 +296,7 @@ default_keys = {
|
|
280
296
|
# "I ctrl!" => "vma.kbd.to_previous_mode",
|
281
297
|
"C shift!" => "buf.save",
|
282
298
|
"I <char>" => "buf.insert_txt(<char>)",
|
283
|
-
"I esc || I ctrl!" => "vma.kbd.
|
299
|
+
"I esc || I ctrl!" => "vma.kbd.to_previous_mode",
|
284
300
|
|
285
301
|
"I ctrl-d" => "buf.delete2(:to_word_end)",
|
286
302
|
|
@@ -294,12 +310,17 @@ default_keys = {
|
|
294
310
|
"IX alt-f" => "buf.jump_word(FORWARD,WORD_START)",
|
295
311
|
"IX alt-b" => "buf.jump_word(BACKWARD,WORD_START)",
|
296
312
|
|
297
|
-
"I
|
298
|
-
"I
|
313
|
+
"I ctrl-h" => :show_autocomplete,
|
314
|
+
"I ctrl-j" => "vma.buf.view.hide_completions",
|
315
|
+
|
316
|
+
|
299
317
|
"I space" => 'buf.insert_txt(" ")',
|
300
318
|
# "I return" => 'buf.insert_new_line()',
|
301
319
|
}
|
302
320
|
|
321
|
+
bindkey "C , i p", "generate_password_to_buf(15)"
|
322
|
+
|
323
|
+
|
303
324
|
default_keys.each { |key, value|
|
304
325
|
bindkey(key, value)
|
305
326
|
}
|
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"
|