vimamsa 0.1.13 → 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 +12 -0
- data/lib/vimamsa/ack.rb +3 -4
- data/lib/vimamsa/actions.rb +1 -2
- data/lib/vimamsa/audio.rb +25 -1
- data/lib/vimamsa/buffer.rb +116 -591
- data/lib/vimamsa/buffer_changetext.rb +272 -0
- data/lib/vimamsa/buffer_cursor.rb +303 -0
- data/lib/vimamsa/buffer_list.rb +137 -133
- data/lib/vimamsa/buffer_manager.rb +15 -15
- data/lib/vimamsa/clipboard.rb +36 -0
- data/lib/vimamsa/conf.rb +136 -5
- data/lib/vimamsa/constants.rb +0 -10
- data/lib/vimamsa/debug.rb +9 -8
- data/lib/vimamsa/editor.rb +57 -84
- data/lib/vimamsa/encrypt.rb +6 -11
- data/lib/vimamsa/file_history.rb +0 -8
- data/lib/vimamsa/file_manager.rb +142 -10
- data/lib/vimamsa/gui.rb +106 -85
- data/lib/vimamsa/gui_dialog.rb +113 -0
- data/lib/vimamsa/gui_menu.rb +5 -1
- data/lib/vimamsa/gui_sourceview.rb +46 -29
- data/lib/vimamsa/gui_sourceview_autocomplete.rb +141 -0
- data/lib/vimamsa/gui_text.rb +49 -0
- data/lib/vimamsa/hyper_plain_text.rb +19 -5
- data/lib/vimamsa/key_actions.rb +41 -202
- data/lib/vimamsa/key_binding_tree.rb +129 -41
- data/lib/vimamsa/key_bindings_vimlike.rb +58 -48
- data/lib/vimamsa/langservp.rb +23 -3
- data/lib/vimamsa/macro.rb +35 -25
- data/lib/vimamsa/main.rb +7 -10
- data/lib/vimamsa/rbvma.rb +13 -11
- data/lib/vimamsa/search.rb +1 -1
- data/lib/vimamsa/search_replace.rb +106 -160
- data/lib/vimamsa/terminal.rb +34 -0
- data/lib/vimamsa/tests.rb +122 -0
- data/lib/vimamsa/util.rb +43 -4
- data/lib/vimamsa/version.rb +1 -1
- data/vimamsa.gemspec +5 -2
- metadata +59 -9
- /data/lib/vimamsa/{form_generator.rb → gui_form_generator.rb} +0 -0
@@ -18,31 +18,18 @@
|
|
18
18
|
# 'I ctrl-a'=> 'vma.buf.jump(BEGINNING_OF_LINE)',
|
19
19
|
#
|
20
20
|
|
21
|
-
$cnf = {} # TODO
|
22
|
-
|
23
|
-
def conf(id)
|
24
|
-
return $cnf[id]
|
25
|
-
end
|
26
|
-
|
27
|
-
def set_conf(id, val)
|
28
|
-
$cnf[id] = val
|
29
|
-
end
|
30
|
-
|
31
|
-
def setcnf(id, val)
|
32
|
-
set_conf(id, val)
|
33
|
-
end
|
34
|
-
|
35
21
|
setcnf :indent_based_on_last_line, true
|
36
22
|
setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc", ".php", ".sh", ".m", ".gd", ".js"]
|
37
23
|
|
38
24
|
class State
|
39
25
|
attr_accessor :key_name, :eval_rule, :children, :action, :label, :major_modes, :level, :cursor_type
|
40
|
-
attr_reader :cur_mode
|
26
|
+
attr_reader :cur_mode, :scope
|
41
27
|
|
42
|
-
def initialize(key_name, eval_rule = "", ctype = :command)
|
28
|
+
def initialize(key_name, eval_rule = "", ctype = :command, scope: :buffer)
|
43
29
|
@key_name = key_name
|
44
30
|
@eval_rule = eval_rule
|
45
31
|
@children = []
|
32
|
+
@scope = scope
|
46
33
|
@major_modes = []
|
47
34
|
@action = nil
|
48
35
|
@level = 0
|
@@ -55,18 +42,21 @@ class State
|
|
55
42
|
end
|
56
43
|
|
57
44
|
class KeyBindingTree
|
58
|
-
attr_accessor :C, :I, :cur_state, :root, :match_state, :last_action, :cur_action, :modifiers
|
59
|
-
attr_reader :mode_root_state, :state_trail, :act_bindings
|
45
|
+
attr_accessor :C, :I, :cur_state, :root, :match_state, :last_action, :cur_action, :modifiers, :next_command_count, :method_handles_repeat, :default_mode
|
46
|
+
attr_reader :mode_root_state, :state_trail, :act_bindings, :default_mode_stack
|
60
47
|
|
61
48
|
def initialize()
|
49
|
+
@next_command_count = nil
|
62
50
|
@modes = {}
|
63
51
|
@root = State.new("ROOT")
|
64
52
|
@cur_state = @root # used for building the tree
|
65
53
|
@default_mode = nil
|
54
|
+
@default_mode_stack = []
|
66
55
|
@mode_history = []
|
67
56
|
@state_trail = []
|
68
57
|
@last_action = nil
|
69
58
|
@cur_action = nil
|
59
|
+
@method_handles_repeat = false
|
70
60
|
|
71
61
|
@modifiers = { :ctrl => false, :shift => false, :alt => false } # TODO: create a queue
|
72
62
|
@last_event = [nil, nil, nil, nil, nil]
|
@@ -76,18 +66,62 @@ class KeyBindingTree
|
|
76
66
|
@act_bindings = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
|
77
67
|
end
|
78
68
|
|
79
|
-
def
|
69
|
+
def set_mode(label)
|
80
70
|
@match_state = [@modes[label]] # used for matching input
|
81
71
|
@mode_root_state = @modes[label]
|
72
|
+
# @default_mode = label
|
73
|
+
@default_mode_stack << label
|
74
|
+
|
75
|
+
__set_mode(label)
|
76
|
+
if !vma.buf.nil?
|
77
|
+
# vma.buf.mode_stack = @default_mode_stack.clone
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def set_default_mode(label)
|
82
|
+
@match_state = [@modes[label]]
|
83
|
+
@mode_root_state = @modes[label]
|
82
84
|
@default_mode = label
|
85
|
+
set_mode_stack [label]
|
86
|
+
end
|
87
|
+
|
88
|
+
def set_mode_stack(ms)
|
89
|
+
debug "set_mode_stack(#{ms})", 2
|
90
|
+
show_caller if cnf.debug? # TODO: remove
|
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]
|
83
105
|
end
|
84
106
|
|
85
107
|
def set_mode_to_default()
|
86
|
-
set_mode(@default_mode)
|
108
|
+
# set_mode(@default_mode)
|
109
|
+
set_mode_stack [@default_mode_stack[0]]
|
110
|
+
__set_mode(@default_mode_stack[0])
|
87
111
|
end
|
88
112
|
|
89
|
-
def
|
90
|
-
|
113
|
+
def to_previous_mode()
|
114
|
+
debug "to_previous_mode",2
|
115
|
+
pp @default_mode_stack
|
116
|
+
if @default_mode_stack.size > 1
|
117
|
+
@default_mode_stack.pop
|
118
|
+
end
|
119
|
+
pp @default_mode_stack
|
120
|
+
__set_mode(@default_mode_stack[-1])
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_mode(id, label, cursortype = :command, name: nil, scope: :buffer)
|
124
|
+
mode = State.new(id, "", cursortype, scope: scope)
|
91
125
|
mode.level = 1
|
92
126
|
@modes[label] = mode
|
93
127
|
@root.children << mode
|
@@ -100,6 +134,10 @@ class KeyBindingTree
|
|
100
134
|
def add_minor_mode(id, label, major_mode_label)
|
101
135
|
mode = State.new(id)
|
102
136
|
@modes[label] = mode
|
137
|
+
if @root.nil?
|
138
|
+
show_caller
|
139
|
+
Ripl.start :binding => binding
|
140
|
+
end
|
103
141
|
@root.children << mode
|
104
142
|
mode.major_modes << major_mode_label
|
105
143
|
end
|
@@ -161,7 +199,8 @@ class KeyBindingTree
|
|
161
199
|
vma.gui.statnfo.markup = "<span weight='ultrabold'>#{st}</span>"
|
162
200
|
end
|
163
201
|
|
164
|
-
def
|
202
|
+
def __set_mode(label)
|
203
|
+
debug "__set_mode(#{label})"
|
165
204
|
@mode_history << @mode_root_state
|
166
205
|
|
167
206
|
# Check if label in form :label
|
@@ -178,13 +217,19 @@ class KeyBindingTree
|
|
178
217
|
end
|
179
218
|
@cur_mode = label
|
180
219
|
|
220
|
+
if self.get_scope != :editor and !vma.buf.nil?
|
221
|
+
vma.buf.mode_stack = @default_mode_stack.clone
|
222
|
+
end
|
223
|
+
|
181
224
|
if !vma.gui.view.nil?
|
182
225
|
vma.gui.view.draw_cursor() #TODO: handle outside this class
|
183
|
-
|
184
|
-
# Ripl.start :binding => binding
|
185
226
|
end
|
186
227
|
end
|
187
228
|
|
229
|
+
def get_scope
|
230
|
+
@mode_root_state.scope
|
231
|
+
end
|
232
|
+
|
188
233
|
def cur_mode_str()
|
189
234
|
return @mode_root_state.key_name
|
190
235
|
end
|
@@ -220,6 +265,7 @@ class KeyBindingTree
|
|
220
265
|
|
221
266
|
# Print key bindings to show as documentation or for debugging
|
222
267
|
def to_s()
|
268
|
+
# return self.class.to_s
|
223
269
|
s = ""
|
224
270
|
# @cur_state = @root
|
225
271
|
stack = [[@root, ""]]
|
@@ -284,9 +330,21 @@ class KeyBindingTree
|
|
284
330
|
act_s = cstate.action.to_s if cstate.action != nil
|
285
331
|
children << " #{cstate.to_s} #{act_s}\n"
|
286
332
|
end
|
333
|
+
if !@next_command_count.nil?
|
334
|
+
s_trail << " #{@next_command_count}"
|
335
|
+
end
|
287
336
|
return [s_trail, children]
|
288
337
|
end
|
289
338
|
|
339
|
+
def set_next_command_count(num)
|
340
|
+
if @next_command_count != nil
|
341
|
+
@next_command_count = @next_command_count * 10 + num.to_i
|
342
|
+
else
|
343
|
+
@next_command_count = num.to_i
|
344
|
+
end
|
345
|
+
debug("NEXT COMMAND COUNT: #{@next_command_count}")
|
346
|
+
end
|
347
|
+
|
290
348
|
# Modifies state of key binding tree (move to new state) based on received event
|
291
349
|
# Checks child nodes of current state if they match received event
|
292
350
|
# if yes, change state to child
|
@@ -354,7 +412,7 @@ class KeyBindingTree
|
|
354
412
|
if event_type == :key_press and c != "shift"
|
355
413
|
# TODO:include other modifiers in addition to shift?
|
356
414
|
set_state_to_root
|
357
|
-
printf(", BACK TO ROOT") if
|
415
|
+
printf(", BACK TO ROOT") if cnf.debug?
|
358
416
|
end
|
359
417
|
|
360
418
|
if event_type == :key_release and c == "shift!"
|
@@ -362,10 +420,10 @@ class KeyBindingTree
|
|
362
420
|
# only on key release when no other key has been pressed
|
363
421
|
# after said modifier key (shift).
|
364
422
|
set_state_to_root
|
365
|
-
printf(", BACK TO ROOT") if
|
423
|
+
printf(", BACK TO ROOT") if cnf.debug?
|
366
424
|
end
|
367
425
|
|
368
|
-
printf("\n") if
|
426
|
+
printf("\n") if cnf.debug?
|
369
427
|
else
|
370
428
|
|
371
429
|
# Don't execute action if one of the states has children
|
@@ -394,6 +452,8 @@ class KeyBindingTree
|
|
394
452
|
|
395
453
|
def bindkey(key, action)
|
396
454
|
if key.class != Array
|
455
|
+
# Handle syntax like :
|
456
|
+
# "X esc || X ctrl!" => "vma.kbd.to_previous_mode",
|
397
457
|
key = key.split("||")
|
398
458
|
end
|
399
459
|
|
@@ -424,10 +484,19 @@ class KeyBindingTree
|
|
424
484
|
end
|
425
485
|
|
426
486
|
m = key.match(/^(\S+)\s(\S.*)$/)
|
487
|
+
# Match/split e.g. "VC , , s" to "VC" and ", , s"
|
427
488
|
if m
|
428
489
|
modetmp = m[1]
|
429
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
|
430
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.
|
431
500
|
modes = [modetmp] if modetmp.match(/^\p{Ll}+$/) # Lowercase
|
432
501
|
keydef = m[2]
|
433
502
|
else
|
@@ -440,7 +509,15 @@ class KeyBindingTree
|
|
440
509
|
}
|
441
510
|
end
|
442
511
|
|
512
|
+
# Binds a keyboard key combination to an action,
|
513
|
+
# for a given keyboard mode like insert ("I") or command ("C")
|
443
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
|
+
|
444
521
|
set_state(mode_id, "") # TODO: check is ok?
|
445
522
|
start_state = @cur_state
|
446
523
|
|
@@ -448,23 +525,32 @@ class KeyBindingTree
|
|
448
525
|
|
449
526
|
prev_state = nil
|
450
527
|
s1 = start_state
|
451
|
-
|
528
|
+
|
529
|
+
k_arr.each_with_index { |k, idx|
|
452
530
|
# check if key has rules for context like q has in
|
453
531
|
# "C q(cntx.recording_macro==true)"
|
454
|
-
|
532
|
+
last_item = false
|
533
|
+
if k_arr.size - 1 == idx
|
534
|
+
last_item = true
|
535
|
+
end
|
536
|
+
match = /(.+)\((.*)\)/.match(k)
|
455
537
|
eval_rule = ""
|
456
538
|
if match
|
457
539
|
key_name = match[1]
|
458
540
|
eval_rule = match[2]
|
459
541
|
else
|
460
|
-
key_name =
|
542
|
+
key_name = k
|
461
543
|
end
|
462
544
|
|
463
545
|
prev_state = s1
|
464
546
|
# Create a new state for key if it doesn't exist
|
465
547
|
s1 = find_state(key_name, eval_rule)
|
466
|
-
if s1 == nil
|
548
|
+
if s1 == nil or last_item
|
467
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
|
468
554
|
s1 = new_state
|
469
555
|
@cur_state.children << new_state
|
470
556
|
end
|
@@ -481,11 +567,10 @@ class KeyBindingTree
|
|
481
567
|
|
482
568
|
def handle_key_bindigs_action(action, c)
|
483
569
|
$acth << action
|
484
|
-
|
570
|
+
@method_handles_repeat = false #TODO:??
|
485
571
|
n = 1
|
486
|
-
if
|
487
|
-
n =
|
488
|
-
# $next_command_count = nil
|
572
|
+
if @next_command_count and !(action.class == String and action.include?("set_next_command_count"))
|
573
|
+
n = @next_command_count
|
489
574
|
debug("COUNT command #{n} times")
|
490
575
|
end
|
491
576
|
|
@@ -493,15 +578,18 @@ class KeyBindingTree
|
|
493
578
|
n.times do
|
494
579
|
ret = exec_action(action)
|
495
580
|
|
496
|
-
if
|
497
|
-
|
581
|
+
if vma.macro.is_recording and ret != false
|
582
|
+
debug "RECORD ACTION:#{action}", 2
|
583
|
+
vma.macro.record_action(action)
|
498
584
|
end
|
499
|
-
break if
|
585
|
+
break if @method_handles_repeat
|
500
586
|
# Some methods have specific implementation for repeat,
|
501
587
|
# like '5yy' => copy next five lines. (copy_line())
|
502
588
|
# By default the same command is just repeated n times
|
503
589
|
# like '20j' => go to next line 20 times.
|
590
|
+
# But methods can also handle the number input themselves if vma.kbd.method_handles_repeat=true is set,
|
504
591
|
end
|
592
|
+
# run_as_idle proc { vma.buf.refresh_cursor; vma.buf.refresh_cursor }, delay: 0.05
|
505
593
|
rescue SyntaxError
|
506
594
|
message("SYNTAX ERROR with eval cmd #{action}: " + $!.to_s)
|
507
595
|
# rescue NoMethodError
|
@@ -521,8 +609,8 @@ class KeyBindingTree
|
|
521
609
|
end
|
522
610
|
end
|
523
611
|
|
524
|
-
if action.class == String and
|
525
|
-
|
612
|
+
if !(action.class == String and action.include?("set_next_command_count"))
|
613
|
+
@next_command_count = nil
|
526
614
|
end
|
527
615
|
end
|
528
616
|
end
|
@@ -3,21 +3,20 @@ vma.kbd.add_mode("I", :insert, :insert)
|
|
3
3
|
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
|
-
# vma.kbd.add_mode("audio", :audio, :command)
|
7
6
|
vma.kbd.add_minor_mode("audio", :audio, :command)
|
8
|
-
vma.kbd.add_mode("B", :browse, :command)
|
7
|
+
vma.kbd.add_mode("B", :browse, :command, scope: :editor)
|
9
8
|
vma.kbd.add_mode("X", :replace, :command, name: "Replace")
|
10
9
|
vma.kbd.set_default_mode(:command)
|
11
|
-
vma.kbd.
|
12
|
-
vma.kbd.show_state_trail
|
10
|
+
vma.kbd.__set_mode(:command) #TODO:needed?
|
11
|
+
# vma.kbd.show_state_trail
|
12
|
+
|
13
13
|
|
14
14
|
bindkey ["VCB M", "B m"], :run_last_macro
|
15
15
|
|
16
16
|
bindkey "VC s", :easy_jump
|
17
|
-
bindkey "VC , m f", [:find_macro_gui, proc {
|
18
|
-
bindkey "C , m n", [:gui_name_macro, proc {
|
17
|
+
bindkey "VC , m f", [:find_macro_gui, proc { vma.macro.find_macro_gui }, "Find named macro"]
|
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
|
@@ -52,13 +51,13 @@ bindkey "C , w", :toggle_active_window
|
|
52
51
|
bindkey "C , , w", :toggle_two_column
|
53
52
|
|
54
53
|
bindkey "C , u s", :audio_stop
|
55
|
-
bindkey "C m a", "vma.kbd.set_mode(:audio)"
|
54
|
+
bindkey "C , m a", "vma.kbd.set_mode(:audio)"
|
56
55
|
bindkey "audio s", :audio_stop
|
57
|
-
bindkey "audio
|
58
|
-
bindkey "audio
|
59
|
-
|
60
|
-
|
56
|
+
bindkey "audio f || audio right", [:audio_forward, proc { Audio.seek_forward }, "Seek forward in audio stream"]
|
57
|
+
bindkey "audio left", [:audio_backward, proc { Audio.seek_forward(-5.0) }, "Seek backward in audio stream"]
|
61
58
|
|
59
|
+
bindkey "audio space", :audio_stop
|
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
|
@@ -72,14 +71,16 @@ bindkey "VC h", :e_move_backward_char
|
|
72
71
|
bindkey "C , , .", :backup_all_buffers
|
73
72
|
bindkey "C z ", :start_browse_mode
|
74
73
|
bindkey "B h", :history_switch_backwards
|
74
|
+
# bindkey "B h", [:browse_file_backwards, proc { vma.kbd.to_previous_mode; call_action(:history_switch_backwards); }, "Browse previous file"]
|
75
75
|
bindkey "B l", :history_switch_forwards
|
76
76
|
#bindkey 'B z', :center_on_current_line
|
77
77
|
bindkey "B z", "center_on_current_line();call_action(:exit_browse_mode)"
|
78
78
|
bindkey "B enter || B return || B esc || B j || B ctrl!", :exit_browse_mode
|
79
79
|
bindkey "B s", :page_up
|
80
80
|
bindkey "B d", :page_down
|
81
|
-
bindkey "B
|
82
|
-
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
|
+
|
83
84
|
bindkey "B i", :jump_to_start_of_buffer
|
84
85
|
bindkey "B o", :jump_to_end_of_buffer
|
85
86
|
bindkey "B c", :close_current_buffer
|
@@ -87,7 +88,6 @@ bindkey "B ;", "buf.jump_to_last_edit"
|
|
87
88
|
bindkey "B q", :jump_to_last_edit
|
88
89
|
bindkey "B w", :jump_to_next_edit
|
89
90
|
# bindkey "C , d", :diff_buffer
|
90
|
-
bindkey "C , g", :invoke_grep_search
|
91
91
|
#bindkey 'C , g', proc{invoke_grep_search}
|
92
92
|
bindkey "C , v", :auto_indent_buffer
|
93
93
|
bindkey "C , , d", :savedebug
|
@@ -105,12 +105,11 @@ 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,
|
112
112
|
"C , c b" => "bufs.close_current_buffer",
|
113
|
-
#"C , b" => 'vma.kbd.set_mode("S");gui_select_buffer',
|
114
113
|
"C , n b" => :buf_new,
|
115
114
|
# "C , , ." => "backup_all_buffers()",
|
116
115
|
"VC , , s" => :search_actions,
|
@@ -118,11 +117,22 @@ default_keys = {
|
|
118
117
|
# MOVING
|
119
118
|
# 'VC h' => 'buf.move(BACKWARD_CHAR)',
|
120
119
|
"VC l" => "buf.move(FORWARD_CHAR)",
|
121
|
-
"VC j" => "buf.move(FORWARD_LINE)",
|
122
|
-
"VC k" => "buf.move(BACKWARD_LINE)",
|
120
|
+
# "VC j" => "buf.move(FORWARD_LINE)",
|
121
|
+
# "VC k" => "buf.move(BACKWARD_LINE)",
|
123
122
|
|
124
|
-
"VC pagedown" =>
|
125
|
-
"VC pageup" =>
|
123
|
+
"VC pagedown" => :page_down,
|
124
|
+
"VC pageup" => :page_up,
|
125
|
+
|
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,
|
126
136
|
|
127
137
|
"VCIX left" => "buf.move(BACKWARD_CHAR)",
|
128
138
|
"VCIX right" => "buf.move(FORWARD_CHAR)",
|
@@ -138,16 +148,16 @@ default_keys = {
|
|
138
148
|
"VC f space" => "buf.jump_to_next_instance_of_char(' ')",
|
139
149
|
"VC F space" => "buf.jump_to_next_instance_of_char(' ',BACKWARD)",
|
140
150
|
|
141
|
-
"VC /[1-9]/" => "set_next_command_count(<char>)",
|
151
|
+
"VC /[1-9]/" => "vma.kbd.set_next_command_count(<char>)",
|
142
152
|
# 'VC number=/[0-9]/+ g'=> 'jump_to_line(<number>)',
|
143
153
|
# 'VC X=/[0-9]/+ * Y=/[0-9]/+ '=> 'x_times_y(<X>,<Y>)',
|
144
|
-
"VC
|
145
|
-
"VC
|
146
|
-
"VC 0(
|
147
|
-
"VC 0($next_command_count==nil)" => "buf.jump(BEGINNING_OF_LINE)",
|
154
|
+
"VC G(vma.kbd.next_command_count!=nil)" => "buf.jump_to_line()",
|
155
|
+
"VC 0(vma.kbd.next_command_count!=nil)" => "set_next_command_count(<char>)",
|
156
|
+
"VC 0(vma.kbd.next_command_count==nil)" => "buf.jump(BEGINNING_OF_LINE)",
|
148
157
|
# 'C 0'=> 'buf.jump(BEGINNING_OF_LINE)',
|
149
158
|
"VC g g" => "buf.jump(START_OF_BUFFER)",
|
150
159
|
"VC g ;" => "buf.jump_to_last_edit",
|
160
|
+
"VC ^" => "buf.jump(BEGINNING_OF_LINE)",
|
151
161
|
"VC G" => "buf.jump(END_OF_BUFFER)",
|
152
162
|
# 'VC z z' => 'center_on_current_line',
|
153
163
|
"VC *" => "buf.jump_to_next_instance_of_word",
|
@@ -173,6 +183,7 @@ default_keys = {
|
|
173
183
|
"C , d b" => "debug_print_buffer",
|
174
184
|
"C , d c" => "debug_dump_clipboard",
|
175
185
|
"C , d d" => "debug_dump_deltas",
|
186
|
+
"C , d m" => :kbd_dump_state,
|
176
187
|
|
177
188
|
"VC O" => "buf.jump(END_OF_LINE)",
|
178
189
|
"VC $" => "buf.jump(END_OF_LINE)",
|
@@ -186,11 +197,10 @@ default_keys = {
|
|
186
197
|
"C u" => "buf.undo()",
|
187
198
|
|
188
199
|
"C ^" => "buf.jump(BEGINNING_OF_LINE)",
|
189
|
-
"C /[1-9]/" => "set_next_command_count(<char>)",
|
200
|
+
# "C /[1-9]/" => "vma.kbd.set_next_command_count(<char>)",
|
190
201
|
|
191
202
|
# Command mode only:
|
192
203
|
"C ctrl-r" => "buf.redo()", # TODO:???
|
193
|
-
"C R" => "buf.redo()",
|
194
204
|
"C v" => "buf.start_visual_mode",
|
195
205
|
"C P" => "buf.paste(BEFORE)", # TODO: implement as replace for visual mode
|
196
206
|
"C space <char>" => "buf.insert_txt(<char>)",
|
@@ -213,7 +223,7 @@ default_keys = {
|
|
213
223
|
"C r <char>" => "buf.replace_with_char(<char>)", # TODO
|
214
224
|
"C , l b" => "load_buffer_list",
|
215
225
|
"C , l l" => "save_buffer_list",
|
216
|
-
"C , r <char>" => "set_register(<char>)", # TODO
|
226
|
+
"C , r <char>" => "vma.set_register(<char>)", # TODO
|
217
227
|
"C , p <char>" => "buf.paste(BEFORE,<char>)", # TODO
|
218
228
|
|
219
229
|
"C ctrl-c" => "buf.comment_line()",
|
@@ -247,30 +257,27 @@ default_keys = {
|
|
247
257
|
'CV \' <char>' => "buf.jump_to_mark(<char>)",
|
248
258
|
# "CV ''" =>'jump_to_mark(NEXT_MARK)', #TODO
|
249
259
|
|
250
|
-
# Switch to
|
260
|
+
# Switch to another mode
|
251
261
|
"C i" => "vma.kbd.set_mode(:insert)",
|
252
262
|
"C R" => "vma.kbd.set_mode(:replace)",
|
253
263
|
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
254
|
-
"C ctrl!" => "vma.kbd.set_mode(:insert)",
|
255
264
|
|
256
|
-
|
257
|
-
|
258
|
-
"X esc" => "vma.kbd.set_mode(:command)",
|
259
|
-
"X ctrl!" => "vma.kbd.set_mode(:command)",
|
265
|
+
# Replace mode
|
266
|
+
"X esc || X ctrl!" => "vma.kbd.to_previous_mode",
|
260
267
|
"X <char>" => "buf.replace_with_char(<char>);buf.move(FORWARD_CHAR)",
|
261
268
|
|
262
269
|
# Macros
|
263
270
|
# (experimental, may not work correctly)
|
264
|
-
# "C q a" => '
|
265
|
-
"VC q <char>" => "
|
266
|
-
"VC q(
|
267
|
-
# 'C q'=> '
|
268
|
-
"C q v" => "
|
269
|
-
# 'C v'=> '
|
270
|
-
# "C M" => '
|
271
|
-
"C @ <char>" => "
|
272
|
-
"C , m S" => '
|
273
|
-
"C , m s" => "
|
271
|
+
# "C q a" => 'vma.macro.start_recording("a")',
|
272
|
+
"VC q <char>" => "vma.macro.start_recording(<char>)",
|
273
|
+
"VC q(vma.macro.is_recording==true) " => "$macro.end_recording", # TODO
|
274
|
+
# 'C q'=> 'vma.macro.end_recording', #TODO
|
275
|
+
"C q v" => "vma.macro.end_recording",
|
276
|
+
# 'C v'=> 'vma.macro.end_recording',
|
277
|
+
# "C M" => 'vma.macro.run_last_macro',
|
278
|
+
"C @ <char>" => "vma.macro.run_macro(<char>)",
|
279
|
+
"C , m S" => 'vma.macro.save_macro("a")',
|
280
|
+
"C , m s" => "vma.macro.save",
|
274
281
|
"C , t r" => "run_tests()",
|
275
282
|
|
276
283
|
# "C ." => "repeat_last_action", # TODO
|
@@ -278,10 +285,10 @@ default_keys = {
|
|
278
285
|
# "CV Q" => :quit,
|
279
286
|
"CV ctrl-q" => :quit,
|
280
287
|
"CV , R" => "restart_application",
|
281
|
-
"I ctrl!" => "vma.kbd.
|
288
|
+
# "I ctrl!" => "vma.kbd.to_previous_mode",
|
282
289
|
"C shift!" => "buf.save",
|
283
290
|
"I <char>" => "buf.insert_txt(<char>)",
|
284
|
-
"I esc" => "vma.kbd.
|
291
|
+
"I esc || I ctrl!" => "vma.kbd.to_previous_mode",
|
285
292
|
|
286
293
|
"I ctrl-d" => "buf.delete2(:to_word_end)",
|
287
294
|
|
@@ -295,7 +302,10 @@ default_keys = {
|
|
295
302
|
"IX alt-f" => "buf.jump_word(FORWARD,WORD_START)",
|
296
303
|
"IX alt-b" => "buf.jump_word(BACKWARD,WORD_START)",
|
297
304
|
|
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
|
|