Class: RuVim::KeymapManager

Inherits:
Object
  • Object
show all
Defined in:
lib/ruvim/keymap_manager.rb

Defined Under Namespace

Classes: BindingEntry, Match

Instance Method Summary collapse

Constructor Details

#initializeKeymapManager

Returns a new instance of KeymapManager.



8
9
10
11
12
13
# File 'lib/ruvim/keymap_manager.rb', line 8

def initialize
  @mode_maps = Hash.new { |h, k| h[k] = {} }
  @global_map = {}
  @buffer_maps = Hash.new { |h, k| h[k] = {} }
  @filetype_maps = Hash.new { |h, k| h[k] = Hash.new { |hh, m| hh[m] = {} } }
end

Instance Method Details

#bind(mode, seq, id, argv: [], kwargs: {}, bang: false) ⇒ Object



15
16
17
18
# File 'lib/ruvim/keymap_manager.rb', line 15

def bind(mode, seq, id, argv: [], kwargs: {}, bang: false)
  tokens = normalize_seq(seq)
  @mode_maps[mode][tokens] = build_invocation(id, argv:, kwargs:, bang:, tokens:)
end

#bind_buffer(buffer_id, seq, id, argv: [], kwargs: {}, bang: false) ⇒ Object



25
26
27
28
# File 'lib/ruvim/keymap_manager.rb', line 25

def bind_buffer(buffer_id, seq, id, argv: [], kwargs: {}, bang: false)
  tokens = normalize_seq(seq)
  @buffer_maps[buffer_id][tokens] = build_invocation(id, argv:, kwargs:, bang:, tokens:)
end

#bind_filetype(filetype, seq, id, mode: :normal, argv: [], kwargs: {}, bang: false) ⇒ Object



30
31
32
33
# File 'lib/ruvim/keymap_manager.rb', line 30

def bind_filetype(filetype, seq, id, mode: :normal, argv: [], kwargs: {}, bang: false)
  tokens = normalize_seq(seq)
  @filetype_maps[filetype.to_s][mode][tokens] = build_invocation(id, argv:, kwargs:, bang:, tokens:)
end

#bind_global(seq, id, argv: [], kwargs: {}, bang: false) ⇒ Object



20
21
22
23
# File 'lib/ruvim/keymap_manager.rb', line 20

def bind_global(seq, id, argv: [], kwargs: {}, bang: false)
  tokens = normalize_seq(seq)
  @global_map[tokens] = build_invocation(id, argv:, kwargs:, bang:, tokens:)
end

#binding_entries_for_context(editor, mode: nil) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ruvim/keymap_manager.rb', line 50

def binding_entries_for_context(editor, mode: nil)
  buffer = editor.current_buffer
  filetype = detect_filetype(buffer)
  modes = normalized_mode_filter(mode)
  entries = []

  entries.concat(snapshot_plain_layer(@buffer_maps[buffer.id], layer: :buffer))

  if filetype && @filetype_maps.key?(filetype)
    ft_modes = @filetype_maps[filetype]
    entries.concat(snapshot_mode_layers(ft_modes, layer: :filetype, modes:))
  end

  entries.concat(snapshot_mode_layers(@mode_maps, layer: :app, modes:, scope: :mode))
  entries.concat(snapshot_plain_layer(@global_map, layer: :app, scope: :global))

  entries
end

#resolve(mode, pending_tokens) ⇒ Object



35
36
37
# File 'lib/ruvim/keymap_manager.rb', line 35

def resolve(mode, pending_tokens)
  resolve_layers([@mode_maps[mode]], pending_tokens)
end

#resolve_with_context(mode, pending_tokens, editor:) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/ruvim/keymap_manager.rb', line 39

def resolve_with_context(mode, pending_tokens, editor:)
  buffer = editor.current_buffer
  filetype = detect_filetype(buffer)
  layers = []
  layers << @filetype_maps[filetype][mode] if filetype && @filetype_maps.key?(filetype)
  layers << @buffer_maps[buffer.id] if @buffer_maps.key?(buffer.id)
  layers << @mode_maps[mode]
  layers << @global_map
  resolve_layers(layers, pending_tokens)
end