class SublimeDSL::SublimeText::Keyboard::DSLReader

Attributes

_keyboard[R]

Public Class Methods

new(file) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 543
def initialize(file)
  @_keyboard = nil
  @in_definition = false
  instance_eval ::File.read(file, encoding: 'utf-8'), file
end

Public Instance Methods

add_keys(spec, options={}) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 581
def add_keys(spec, options={})
  ensure_context __method__
  keys = parse_key_list(spec)

  st_spec = options.delete(:st_keys)
  if st_spec
    st_keys = parse_key_list(st_spec)
    keys.length == st_keys.length or
      raise Error, "st_keys: got #{st_keys.length} keys, expected #{keys.length}"
  end
  options.empty? or warn "extraneous arguments ignored: #{options.inspect}"

  keys.each_with_index do |name, i|
    _keyboard.add_key name
    if st_spec
      _keyboard.map_key name, st_keys[i]
    # done automatically when registering key events of new keystrokes:
    # elsif Keyboard.sublime.key(name)
    #   _keyboard.map_key name, name
    end
  end

end
add_modifiers(spec) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 567
def add_modifiers(spec)
  ensure_context __method__
  spec.split(/\s/).each { |name| _keyboard.add_modifier name }
end
keyboard(name) { |self| ... } click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 553
def keyboard(name)
  @_keyboard and raise Error, 'only one keyboard definition per file'
  @in_definition and raise Error, "'keyboard' blocks cannot be nested"
  @_keyboard = Keyboard.new(name)
  @in_definition = true
  yield self
  @in_definition = false
end
map_char(options={}) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 614
def map_char(options={})
  spec = options.keys.first
  spec or raise Error, 'missing argument'
  char = options.delete(spec)
  dead = options.delete(:dead)
  options.empty? or warn "extraneous arguments ignored: #{options.inspect}"
  char.length == 1 or raise Error, "map_dead: expected a character, got #{char.inspect}"
  ks = _keyboard.ensure_keystroke(spec)
  ks.chr_event = char
  ks.chr_dead = true if dead
end
map_key(options={}) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 605
def map_key(options={})
  ensure_context __method__
  name = options.keys.first
  name or raise Error, 'missing argument'
  st_name = options.delete(name)
  options.empty? or warn "extraneous arguments ignored: #{options.inspect}"
  _keyboard.map_key name, st_name
end
map_modifier(options={}) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 572
def map_modifier(options={})
  ensure_context __method__
  name = options.keys.first
  name or raise Error, 'missing argument'
  st_name = options.delete(name)
  options.empty? or warn "extraneous arguments ignored: #{options.inspect}"
  _keyboard.map_modifier name, st_name
end
method_missing(sym, *args, &block) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 549
def method_missing(sym, *args, &block)
  raise Error, "'#{sym}' is not a keyboard DSL statement"
end
os(value) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 562
def os(value)
  ensure_context __method__
  _keyboard.os = value
end
os_action(options={}) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 626
def os_action(options={})
  spec = options.keys.first
  spec or raise Error, 'missing argument'
  action = options.delete(spec)
  key_event = options.delete(:key_event)
  options.empty? or warn "extraneous arguments ignored: #{options.inspect}"
  ks = _keyboard.ensure_keystroke(spec)
  ks.os_action = action
  ks.key_event = nil unless key_event
end

Private Instance Methods

ensure_context(method) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 639
def ensure_context(method)
  _keyboard or raise Error, "'#{method}' is invalid outside of a 'keyboard' block"
end
parse_key_list(string) click to toggle source
# File lib/sublime_dsl/sublime_text/keyboard.rb, line 643
def parse_key_list(string)
  specs = string.split(/\s/)
  specs.flat_map do |spec|
    if spec =~ /^([a-z]*)(\d+)-\1(\d+)$/
      stem = $1
      start = $2.to_i
      stop = $3.to_i
      (start..stop).map { |i| "#{stem}#{i}" }
    else
      spec
    end
  end
end