dotremap 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 401825fbab15250619f14ea781ceff9f345819b6
4
+ data.tar.gz: 5c1630693db09459e9b23d794f509795ad8897f4
5
+ SHA512:
6
+ metadata.gz: 567031667b38d096621e099ff818b0dcdad609df05f58b326942aa26bfcf03e83589d57fe380819c8085fa5b91903ceaf961f49e9e58fd09269a50e85f6870d8
7
+ data.tar.gz: b5546f823689fd450952619f5f01c68970b9c073ebc26e60f73acc8af8eac4c803b60c0f3cb26a3074cdfe498b89e51e4b72eb80fc5e886f73004fc73179a006
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dotremap.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Takashi Kokubun
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Dotremap
2
+
3
+ Lightweight configuration DSL for [KeyRemap4MacBook](https://pqrs.org/osx/karabiner/index.html)
4
+
5
+ ## Installation
6
+
7
+ ````bash
8
+ $ gem install dotremap
9
+ ```
10
+
11
+ ## Usage
12
+ ### 1. Create ~/.remap
13
+
14
+ ```rb
15
+ # ~/.remap
16
+ item "Control+PNBF to Up/Down/Left/Right", not: "TERMINAL" do
17
+ remap "C-p", to: "Up"
18
+ remap "C-n", to: "Down"
19
+ remap "C-b", to: "Left"
20
+ remap "C-f", to: "Right"
21
+ end
22
+ ```
23
+
24
+ ### 2. Execute dotremap command
25
+
26
+ ```bash
27
+ $ dotremap
28
+ ```
29
+
30
+ It will replace KeyRemap4MacBook's private.xml with compiled ~/.remap:
31
+
32
+ ```xml
33
+ <?xml version="1.0"?>
34
+ <root>
35
+ <item>
36
+ <name>Control+PNBF to Up/Down/Left/Right</name>
37
+ <identifier>remap.control_pnbf_to_up_down_left_right</identifier>
38
+ <not>TERMINAL</not>
39
+ <autogen>__KeyToKey__ KeyCode::P, VK_CONTROL, KeyCode::CURSOR_UP</autogen>
40
+ <autogen>__KeyToKey__ KeyCode::N, VK_CONTROL, KeyCode::CURSOR_DOWN</autogen>
41
+ <autogen>__KeyToKey__ KeyCode::B, VK_CONTROL, KeyCode::CURSOR_LEFT</autogen>
42
+ <autogen>__KeyToKey__ KeyCode::F, VK_CONTROL, KeyCode::CURSOR_RIGHT</autogen>
43
+ </item>
44
+ </root>
45
+ ```
46
+
47
+ ### 3. Reload private.xml and update config
48
+
49
+ You have to reload private.xml to activate compiled configurations.
50
+
51
+ ![](https://raw.githubusercontent.com/k0kubun/dotremap/master/reload.gif)
52
+
53
+ ## Example
54
+
55
+ I'm sorry but currently this software is not well documented.
56
+ Please see [example.rb](https://github.com/k0kubun/dotremap/blob/master/example.rb) to learn how to use.
57
+
58
+ ## Contributing
59
+
60
+ 1. Fork it ( https://github.com/k0kubun/dotremap/fork )
61
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
62
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
63
+ 4. Push to the branch (`git push origin my-new-feature`)
64
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/dotremap ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.dirname(__FILE__) + "/../lib"
4
+ $:.unshift lib unless $:.include? lib
5
+
6
+ require "dotremap"
7
+
8
+ DOTREMAP_PATH = File.expand_path("~/.remap")
9
+
10
+ dotremap = Dotremap.new(DOTREMAP_PATH)
11
+ dotremap.compile
12
+ dotremap.replace_private_xml
data/dotremap.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'dotremap/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "dotremap"
8
+ spec.version = Dotremap::VERSION
9
+ spec.authors = ["Takashi Kokubun"]
10
+ spec.email = ["takashikkbn@gmail.com"]
11
+ spec.summary = %q{Configuration DSL for KeyRemap4MacBook}
12
+ spec.description = %q{Configuration DSL for KeyRemap4MacBook}
13
+ spec.homepage = "https://github.com/k0kubun/dotremap"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_dependency 'unindent', '~> 1.0'
24
+ end
data/example.rb ADDED
@@ -0,0 +1,135 @@
1
+ item "[Not Terminal] Command+O|P to Command+{|} (US)", not: "TERMINAL" do
2
+ remap "Cmd-P", to: "Cmd-Shift-]"
3
+ remap "Cmd-O", to: "Cmd-Shift-["
4
+ end
5
+
6
+ item "[Only Terminal] Command+O|P to Option+{|} (US)", only: "TERMINAL" do
7
+ remap "Cmd-P", to: "Opt-Shift-]"
8
+ remap "Cmd-O", to: "Opt-Shift-["
9
+ end
10
+
11
+ item "[Not Terminal] Command+E to Command+W", not: "TERMINAL" do
12
+ remap "Cmd-E", to: "Cmd-W"
13
+ end
14
+
15
+ item "[Only Terminal] Command+T to Option+T, Command+E to Option+E", only: "TERMINAL" do
16
+ remap "Cmd-T", to: "Opt-T"
17
+ remap "Cmd-E", to: "Opt-E"
18
+ end
19
+
20
+ # For tmux copy mode
21
+ item "[Only Terminal] Command+I to Option+I", only: "TERMINAL" do
22
+ remap "Cmd-I", to: "Opt-I"
23
+ end
24
+
25
+ item "Command_L to Control_R" do
26
+ remap "Cmd_L", to: "Ctrl_R"
27
+ end
28
+
29
+ # Change japanese input mode by Cmd_L + Space
30
+ item "Exchange Control + Space and Command + Space" do
31
+ remap "C-Space", to: "Cmd-Space"
32
+ remap "Cmd-Space", to: "C-Space"
33
+ end
34
+
35
+ item "CapsLock ON", config_not: "notsave.private_capslock_on" do
36
+ remap "Cmd-L", to: ["capslock", "VK_CONFIG_FORCE_OFF_notsave_private_capslock_on"]
37
+ end
38
+
39
+ item "CapsLock OFF", config_only: "notsave.private_capslock_on" do
40
+ remap "Cmd-L", to: ["capslock", "VK_CONFIG_FORCE_OFF_notsave_private_capslock_on"]
41
+ end
42
+
43
+ item "CapsLock Mode" do
44
+ identifier "notsave.private_capslock_on", vk_config: "true"
45
+ show_message "CapsLock"
46
+ end
47
+
48
+ item "[Not Terminal] Control+PNBF to Up/Down/Left/Right", not: "TERMINAL" do
49
+ remap "C-p", to: "Up"
50
+ remap "C-n", to: "Down"
51
+ remap "C-b", to: "Left"
52
+ remap "C-f", to: "Right"
53
+ end
54
+
55
+ # Use Cmd_R+D as M-d
56
+ item "[Not Terminal] Command+D to Option+Forward Delete", not: "TERMINAL" do
57
+ remap "Cmd-D", to: "Opt-forward_delete"
58
+ end
59
+
60
+ item "[Only Terminal] Command+D to Option+D, Command+BF to Option+BF", only: "TERMINAL" do
61
+ remap "Cmd-D", to: "M-d"
62
+ remap "Cmd-B", to: "M-b"
63
+ remap "Cmd-F", to: "M-f"
64
+ end
65
+
66
+ # Use Cmd_R+B/F as M-b/f, and Cmd_R+S as Cmd+F to avoid conflict with M-f
67
+ item "[Not Terminal] Command+B/F to Option+Left/Right, Command+S to Command+F", not: "TERMINAL" do
68
+ remap "Cmd-B", to: "Opt-Left"
69
+ remap "Cmd-B", to: "Opt-Left"
70
+ remap "Cmd-S", to: "Cmd-F"
71
+ end
72
+
73
+ item "[Not Terminal] Control+W to Option+Delete", not: "TERMINAL" do
74
+ remap "C-w", to: "Opt-delete"
75
+ end
76
+
77
+ item "Control+LeftClick to Command+LeftClick" do
78
+ autogen "__PointingButtonToPointingButton__ PointingButton::LEFT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, PointingButton::LEFT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND"
79
+ end
80
+
81
+ item "[Not Terminal] Chrome inspector Command+Control+I", not: "TERMINAL" do
82
+ remap "Cmd-Ctrl-I", to: "Cmd-Opt-i"
83
+ end
84
+
85
+ # browser reload
86
+ item "[Not Terminal] Control-R -> Command-R", not: "TERMINAL" do
87
+ remap "C-r", to: "Cmd-R"
88
+ end
89
+
90
+ # tmux prefix
91
+ item "[Only Terminal] Command-R -> Option-R", only: "TERMINAL" do
92
+ remap "Cmd-R", to: "M-r"
93
+ end
94
+
95
+ # I don't want to press shift key
96
+ item "Command semicolon to colon" do
97
+ remap "Cmd-;", to: "Shift-;"
98
+ end
99
+
100
+ item "Shift by control" do
101
+ remap "C--", to: "Shift--"
102
+ remap "C-0", to: "Shift-0"
103
+ remap "C-9", to: "Shift-9"
104
+ remap "C-8", to: "Shift-8"
105
+ remap "C-7", to: "Shift-7"
106
+ remap "C-6", to: "Shift-6"
107
+ remap "C-[", to: "Shift-["
108
+ remap "C-]", to: "Shift-]"
109
+ remap "C-;", to: "Shift-;"
110
+ remap "C-,", to: "Shift-,"
111
+ remap "C-.", to: "Shift-."
112
+ remap "C-/", to: "Shift-/"
113
+ remap "C-=", to: "Shift-="
114
+ remap "C-\\", to: "Shift-\\"
115
+ end
116
+
117
+ item "Exchange single quote and double quote" do
118
+ remap "'", to: "Shift-'"
119
+ remap "Shift-'", to: "'"
120
+ end
121
+
122
+ item "[Only Terminal] Command+A to Option+A", only: "TERMINAL" do
123
+ remap "Cmd-A", to: "M-a"
124
+ end
125
+
126
+ item "Disable Command-W" do
127
+ remap "Cmd-W", to: "w"
128
+ end
129
+
130
+ appdef "YORUFUKUROU", equal: "com.YoruFukurouProject.YoruFukurou"
131
+
132
+ item "YoruFukurou Account Change", only: "YORUFUKUROU" do
133
+ remap "Cmd-K", to: "Cmd-Opt-Up"
134
+ remap "Cmd-J", to: "Cmd-Opt-Down"
135
+ end
@@ -0,0 +1,26 @@
1
+ class Dotremap::Appdef
2
+ AVAILABLE_OPTIONS = %i(
3
+ equal
4
+ prefix
5
+ suffix
6
+ ).freeze
7
+
8
+ def initialize(appname, options)
9
+ @childs = []
10
+ @appname = appname
11
+
12
+ options.each do |option, value|
13
+ raise "Unavailable option: #{property}" unless AVAILABLE_OPTIONS.include?(option)
14
+ @childs << Dotremap::Property.new(option, value)
15
+ end
16
+ end
17
+
18
+ def to_xml
19
+ [
20
+ "<appdef>",
21
+ " <appname>#{@appname}</appname>",
22
+ @childs.map(&:to_xml).join("\n").gsub(/^/, " "),
23
+ "</appdef>",
24
+ ].join("\n")
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ require "dotremap/dsl"
2
+ require "dotremap/property"
3
+ require "dotremap/remap"
4
+
5
+ module Dotremap::DSL::Item
6
+ AVAILABLE_PROPERTIES = %i(
7
+ name
8
+ identifier
9
+ autogen
10
+ ).freeze
11
+
12
+ def remap(target, options = {})
13
+ remap = Dotremap::Remap.new(target, options[:to])
14
+ childs << remap
15
+ end
16
+
17
+ def show_message(message)
18
+ property = Dotremap::Property.new("autogen", "__ShowStatusMessage__ #{message}")
19
+ childs << property
20
+ end
21
+
22
+ private
23
+
24
+ def method_missing(property, value = '', options = {})
25
+ if AVAILABLE_PROPERTIES.include?(property)
26
+ property = Dotremap::Property.new(property, value, options)
27
+ childs << property
28
+ else
29
+ super
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ require "dotremap/appdef"
2
+ require "dotremap/dsl"
3
+ require "dotremap/item"
4
+
5
+ module Dotremap::DSL::Root
6
+ def item(name = nil, options = {}, &block)
7
+ item = Dotremap::Item.new(name, options)
8
+ item.instance_exec(&block)
9
+ childs << item
10
+ end
11
+
12
+ def appdef(appname = '', options = {})
13
+ appdef = Dotremap::Appdef.new(appname, options)
14
+ childs << appdef
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ class Dotremap
2
+ module DSL
3
+ end
4
+ end
@@ -0,0 +1,54 @@
1
+ require "dotremap/dsl/item"
2
+
3
+ class Dotremap::Item
4
+ include Dotremap::DSL::Item
5
+
6
+ AVAILABLE_OPTIONS = %i(
7
+ not
8
+ only
9
+ config_not
10
+ config_only
11
+ ).freeze
12
+
13
+ def initialize(name, options)
14
+ @childs = []
15
+
16
+ if name
17
+ @childs << Dotremap::Property.new("name", name)
18
+ end
19
+
20
+ options.each do |option, value|
21
+ raise "Unavailable option: #{option}" unless AVAILABLE_OPTIONS.include?(option)
22
+ @childs << Dotremap::Property.new(option, value)
23
+ end
24
+ end
25
+ attr_accessor :childs
26
+
27
+ def to_xml
28
+ validate_name_existence
29
+ generate_identifier
30
+
31
+ [
32
+ "<item>",
33
+ childs.map(&:to_xml).join("\n").gsub(/^/, " "),
34
+ "</item>",
35
+ ].join("\n")
36
+ end
37
+
38
+ private
39
+
40
+ def validate_name_existence
41
+ properties = childs.select { |c| c.is_a?(Dotremap::Property) }
42
+ raise "Name property does not exist" unless properties.map(&:attr).include?("name")
43
+ end
44
+
45
+ def generate_identifier
46
+ properties = childs.select { |c| c.is_a?(Dotremap::Property) }
47
+ return if properties.map(&:attr).include?("identifier")
48
+
49
+ name = properties.find { |p| p.attr == "name" }
50
+ generated_identifier = name.value.gsub(/[^a-zA-Z]/, "_").downcase
51
+ identifier = Dotremap::Property.new("identifier", "remap.#{generated_identifier}")
52
+ childs[1, 0] = identifier
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ class Dotremap::Property
2
+ def initialize(attr, value, options = {})
3
+ @attr = attr.to_s
4
+ @value = value
5
+ @options = options
6
+ end
7
+ attr_accessor :attr, :value, :options
8
+
9
+ def to_xml
10
+ open_tag = options.map { |a, v| "#{a}=\"#{v}\"" }.unshift(attr).join(" ")
11
+ "<#{open_tag}>#{value}</#{attr}>"
12
+ end
13
+ end
@@ -0,0 +1,94 @@
1
+ class Dotremap::Remap
2
+ KEYCODE_MAP = {
3
+ "0" => "KEY_0",
4
+ "1" => "KEY_1",
5
+ "2" => "KEY_2",
6
+ "3" => "KEY_3",
7
+ "4" => "KEY_4",
8
+ "5" => "KEY_5",
9
+ "6" => "KEY_6",
10
+ "7" => "KEY_7",
11
+ "8" => "KEY_8",
12
+ "9" => "KEY_9",
13
+ "Up" => "CURSOR_UP",
14
+ "Down" => "CURSOR_DOWN",
15
+ "Right" => "CURSOR_RIGHT",
16
+ "Left" => "CURSOR_LEFT",
17
+ "]" => "BRACKET_RIGHT",
18
+ "[" => "BRACKET_LEFT",
19
+ ";" => "SEMICOLON",
20
+ "-" => "MINUS",
21
+ "," => "COMMA",
22
+ "." => "DOT",
23
+ "\\" => "BACKSLASH",
24
+ "/" => "SLASH",
25
+ "=" => "EQUAL",
26
+ "'" => "QUOTE",
27
+ "Ctrl_R" => "CONTROL_R",
28
+ "Ctrl_L" => "CONTROL_L",
29
+ "Opt_R" => "OPTION_R",
30
+ "Opt_L" => "OPTION_L",
31
+ "Cmd_R" => "COMMAND_R",
32
+ "Cmd_L" => "COMMAND_L",
33
+ }.freeze
34
+ PREFIX_MAP = {
35
+ "C" => "VK_CONTROL",
36
+ "Ctrl" => "VK_CONTROL",
37
+ "Cmd" => "VK_COMMAND",
38
+ "Shift" => "VK_SHIFT",
39
+ "M" => "VK_OPTION",
40
+ "Opt" => "VK_OPTION",
41
+ }.freeze
42
+ PREFIX_EXPRESSION = "(#{PREFIX_MAP.keys.map { |k| k + '-' }.join('|')})"
43
+
44
+ def initialize(from, to)
45
+ @from = from
46
+ @to = to
47
+ end
48
+
49
+ def to_xml
50
+ "<autogen>__KeyToKey__ #{from}, #{to}</autogen>"
51
+ end
52
+
53
+ private
54
+
55
+ def from
56
+ key_combination(@from)
57
+ end
58
+
59
+ def to
60
+ [@to].flatten.map { |to| key_combination(to) }.join(", ")
61
+ end
62
+
63
+ def key_combination(raw_combination)
64
+ raw_prefixes, raw_key = split_key_combination(raw_combination)
65
+ return key_expression(raw_key) if raw_prefixes.empty?
66
+
67
+ prefixes = raw_prefixes.map { |raw_prefix| PREFIX_MAP[raw_prefix] }
68
+ "#{key_expression(raw_key)}, #{prefixes.join(' | ')}"
69
+ end
70
+
71
+ def key_expression(raw_key)
72
+ case raw_key
73
+ when /^(#{KEYCODE_MAP.keys.map { |k| Regexp.escape(k) }.join('|')})$/
74
+ "KeyCode::#{KEYCODE_MAP[raw_key]}"
75
+ else
76
+ raw_key = raw_key.upcase unless raw_key.match(/^VK_/)
77
+ "KeyCode::#{raw_key}"
78
+ end
79
+ end
80
+
81
+ def split_key_combination(raw_combination)
82
+ prefixes = []
83
+ key = raw_combination.dup
84
+
85
+ while key.match(/^#{PREFIX_EXPRESSION}/)
86
+ key.gsub!(/^#{PREFIX_EXPRESSION}/) do
87
+ prefixes << $1.gsub(/-$/, "")
88
+ ""
89
+ end
90
+ end
91
+
92
+ [prefixes, key]
93
+ end
94
+ end
@@ -0,0 +1,19 @@
1
+ require "dotremap/dsl/root"
2
+
3
+ class Dotremap::Root
4
+ include Dotremap::DSL::Root
5
+
6
+ def initialize
7
+ @childs = []
8
+ end
9
+ attr_accessor :childs
10
+
11
+ def to_xml
12
+ [
13
+ "<?xml version=\"1.0\"?>",
14
+ "<root>",
15
+ childs.map(&:to_xml).join("\n\n").gsub(/^/, " "),
16
+ "</root>",
17
+ ].join("\n")
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class Dotremap
2
+ VERSION = "0.0.1"
3
+ end
data/lib/dotremap.rb ADDED
@@ -0,0 +1,61 @@
1
+ require "dotremap/version"
2
+ require "dotremap/root"
3
+ require "unindent"
4
+ require "fileutils"
5
+
6
+ class Dotremap
7
+ OLD_XML_DIR = File.expand_path("~/Library/Application Support/KeyRemap4MacBook")
8
+ NEW_XML_DIR = File.expand_path("~/Library/Application Support/Karabiner")
9
+ XML_FILE_NAME = "private.xml"
10
+
11
+ def initialize(config_path)
12
+ @config_path = config_path
13
+ @root = Root.new
14
+ end
15
+ attr_reader :config_path, :root
16
+
17
+ def compile
18
+ validate_config_existence
19
+
20
+ config = File.read(config_path)
21
+ root.instance_eval(config)
22
+ end
23
+
24
+ def replace_private_xml
25
+ ensure_xml_dir_existence
26
+ remove_current_xml
27
+ write_new_xml
28
+ puts "Successfully generated private.xml"
29
+ end
30
+
31
+ private
32
+
33
+ def validate_config_existence
34
+ return if File.exists?(config_path)
35
+
36
+ File.write(config_path, <<-EOS.unindent)
37
+ #!/usr/bin/env ruby
38
+
39
+ # # Example
40
+ # item "Command+E to Command+W", not: "TERMINAL" do
41
+ # identifier "option.not_terminal_opt_e"
42
+ # autogen "__KeyToKey__ KeyCode::E, VK_COMMAND, KeyCode::W, ModifierFlag::COMMAND_L"
43
+ # end
44
+ EOS
45
+ end
46
+
47
+ def ensure_xml_dir_existence
48
+ FileUtils.mkdir_p(OLD_XML_DIR)
49
+ FileUtils.mkdir_p(NEW_XML_DIR)
50
+ end
51
+
52
+ def remove_current_xml
53
+ FileUtils.rm_f(File.join(OLD_XML_DIR, XML_FILE_NAME))
54
+ FileUtils.rm_f(File.join(NEW_XML_DIR, XML_FILE_NAME))
55
+ end
56
+
57
+ def write_new_xml
58
+ File.write(File.join(OLD_XML_DIR, XML_FILE_NAME), root.to_xml)
59
+ File.write(File.join(NEW_XML_DIR, XML_FILE_NAME), root.to_xml)
60
+ end
61
+ end
data/reload.gif ADDED
Binary file
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dotremap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Takashi Kokubun
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: unindent
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ description: Configuration DSL for KeyRemap4MacBook
56
+ email:
57
+ - takashikkbn@gmail.com
58
+ executables:
59
+ - dotremap
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - bin/dotremap
69
+ - dotremap.gemspec
70
+ - example.rb
71
+ - lib/dotremap.rb
72
+ - lib/dotremap/appdef.rb
73
+ - lib/dotremap/dsl.rb
74
+ - lib/dotremap/dsl/item.rb
75
+ - lib/dotremap/dsl/root.rb
76
+ - lib/dotremap/item.rb
77
+ - lib/dotremap/property.rb
78
+ - lib/dotremap/remap.rb
79
+ - lib/dotremap/root.rb
80
+ - lib/dotremap/version.rb
81
+ - reload.gif
82
+ homepage: https://github.com/k0kubun/dotremap
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.2.2
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Configuration DSL for KeyRemap4MacBook
106
+ test_files: []