vimamsa 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 
     | 
    
         |