twiddling 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.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.mdl_rules.rb +2 -0
  4. data/.mdlrc +2 -0
  5. data/.quiet_quality.yml +9 -0
  6. data/.rspec +1 -0
  7. data/.rubocop.yml +21 -0
  8. data/.standard.yml +3 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE +21 -0
  11. data/README.md +116 -0
  12. data/bin/cfg2tw7 +13 -0
  13. data/bin/tw72cfg +9 -0
  14. data/bin/twiddling +9 -0
  15. data/configs/v7/default.cfg +0 -0
  16. data/configs/v7/default.tw7 +168 -0
  17. data/configs/v7/ericspace2.cfg +0 -0
  18. data/configs/v7/ericspace2.tw7 +203 -0
  19. data/fixtures/v7/README.md +31 -0
  20. data/fixtures/v7/button-mode-keyboard.cfg +0 -0
  21. data/fixtures/v7/button-mode-keyboard.tw7 +16 -0
  22. data/fixtures/v7/cycle-config-chord.cfg +0 -0
  23. data/fixtures/v7/cycle-config-chord.tw7 +12 -0
  24. data/fixtures/v7/empty.cfg +0 -0
  25. data/fixtures/v7/empty.tw7 +10 -0
  26. data/fixtures/v7/haptic-feedback-off.cfg +0 -0
  27. data/fixtures/v7/haptic-feedback-off.tw7 +16 -0
  28. data/fixtures/v7/idle-time-8m.cfg +0 -0
  29. data/fixtures/v7/idle-time-8m.tw7 +12 -0
  30. data/fixtures/v7/key-repeat-1020.cfg +0 -0
  31. data/fixtures/v7/key-repeat-1020.tw7 +12 -0
  32. data/fixtures/v7/key-repeat-disabled.cfg +0 -0
  33. data/fixtures/v7/key-repeat-disabled.tw7 +12 -0
  34. data/fixtures/v7/large.cfg +0 -0
  35. data/fixtures/v7/large.tw7 +142 -0
  36. data/fixtures/v7/mini-buttons.cfg +0 -0
  37. data/fixtures/v7/mini-buttons.tw7 +14 -0
  38. data/fixtures/v7/modifier-key.cfg +0 -0
  39. data/fixtures/v7/modifier-key.tw7 +12 -0
  40. data/fixtures/v7/multi-char.cfg +0 -0
  41. data/fixtures/v7/multi-char.tw7 +12 -0
  42. data/fixtures/v7/nav-invert-x-axis.cfg +0 -0
  43. data/fixtures/v7/nav-invert-x-axis.tw7 +16 -0
  44. data/fixtures/v7/nav-sensitivity-lowered.cfg +0 -0
  45. data/fixtures/v7/nav-sensitivity-lowered.tw7 +12 -0
  46. data/fixtures/v7/nav-up-east.cfg +0 -0
  47. data/fixtures/v7/nav-up-east.tw7 +12 -0
  48. data/fixtures/v7/no-right-mouse-button.cfg +0 -0
  49. data/fixtures/v7/no-right-mouse-button.tw7 +12 -0
  50. data/fixtures/v7/no-t0-dedicated.cfg +0 -0
  51. data/fixtures/v7/no-t0-dedicated.tw7 +12 -0
  52. data/fixtures/v7/shifted-key.cfg +0 -0
  53. data/fixtures/v7/shifted-key.tw7 +12 -0
  54. data/fixtures/v7/single-unmodified-key.cfg +0 -0
  55. data/fixtures/v7/single-unmodified-key.tw7 +12 -0
  56. data/formats/tw7.md +222 -0
  57. data/formats/v7-cfg.md +272 -0
  58. data/lib/twiddling/cli/convert.rb +70 -0
  59. data/lib/twiddling/cli/diff.rb +192 -0
  60. data/lib/twiddling/cli/help.rb +26 -0
  61. data/lib/twiddling/cli/read.rb +56 -0
  62. data/lib/twiddling/cli/search.rb +131 -0
  63. data/lib/twiddling/cli/twiddling.rb +33 -0
  64. data/lib/twiddling/cli.rb +8 -0
  65. data/lib/twiddling/v7/chord.rb +48 -0
  66. data/lib/twiddling/v7/chord_constants.rb +82 -0
  67. data/lib/twiddling/v7/config.rb +102 -0
  68. data/lib/twiddling/v7/config_constants.rb +30 -0
  69. data/lib/twiddling/v7/data/default_base.cfg +0 -0
  70. data/lib/twiddling/v7/reader/chord.rb +49 -0
  71. data/lib/twiddling/v7/reader/config.rb +64 -0
  72. data/lib/twiddling/v7/reader/settings.rb +26 -0
  73. data/lib/twiddling/v7/reader/string_table.rb +69 -0
  74. data/lib/twiddling/v7/settings.rb +21 -0
  75. data/lib/twiddling/v7/string_table.rb +21 -0
  76. data/lib/twiddling/v7/string_table_entry.rb +14 -0
  77. data/lib/twiddling/v7/tw7/button_formatter.rb +63 -0
  78. data/lib/twiddling/v7/tw7/button_parser.rb +78 -0
  79. data/lib/twiddling/v7/tw7/effect_formatter.rb +78 -0
  80. data/lib/twiddling/v7/tw7/effect_parser.rb +121 -0
  81. data/lib/twiddling/v7/tw7/parser.rb +133 -0
  82. data/lib/twiddling/v7/tw7/printer.rb +105 -0
  83. data/lib/twiddling/v7/tw7/settings_formatter.rb +96 -0
  84. data/lib/twiddling/v7/tw7/settings_parser.rb +97 -0
  85. data/lib/twiddling/v7/validator.rb +93 -0
  86. data/lib/twiddling/v7/writer/chord.rb +36 -0
  87. data/lib/twiddling/v7/writer/config.rb +79 -0
  88. data/lib/twiddling/v7/writer/settings.rb +19 -0
  89. data/lib/twiddling/v7/writer/string_table.rb +40 -0
  90. data/lib/twiddling/v7.rb +34 -0
  91. data/lib/twiddling/version.rb +3 -0
  92. data/lib/twiddling.rb +8 -0
  93. data/tmp/.gitkeep +0 -0
  94. data/twiddling.gemspec +46 -0
  95. metadata +284 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 100f1bce7fb108f29712c2a203f41abf3073ff2c45d73bbee561d2127c9dc646
4
+ data.tar.gz: 8fc0d6aa7adca0c9e66c998044643b6ba91c81fceaffe6053afca1fa9bec4313
5
+ SHA512:
6
+ metadata.gz: d6bc2545b64960e2604856d51ba4223230826309f466ffd4626a87f8ee3f3138bfbabcef5292747d11d7b07f0ad470565030c94feeec2969b6c8344935867837
7
+ data.tar.gz: 38c8a2390ff5ef6eb9c15071e10a8138f9f250ae160d6023c0fbead51e7c2f21320ae046265cb4fab6c6c091f245509eba7b4adf99be8c2e30d192d0d6764b91
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ .ruby-version
2
+ .ruby-gemset
3
+ Gemfile.lock
4
+ *.gem
5
+ coverage/
6
+ tmp/*
7
+ .DS_Store
data/.mdl_rules.rb ADDED
@@ -0,0 +1,2 @@
1
+ all
2
+ rule "MD013", ignore_code_blocks: true
data/.mdlrc ADDED
@@ -0,0 +1,2 @@
1
+ style File.expand_path("../.mdl_rules.rb", __FILE__)
2
+ git_recurse true
@@ -0,0 +1,9 @@
1
+ ---
2
+ default_tools: ["standardrb", "rubocop", "markdown_lint"]
3
+ executor: concurrent
4
+ comparison_branch: main
5
+ changed_files: false
6
+ filter_messages: false
7
+ logging: light
8
+ colorize: true
9
+ message_format: "%lcyan10tool| [%myellow40rule] %bred60loc %e-90body"
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,21 @@
1
+ ---
2
+ AllCops:
3
+ SuggestExtensions: false
4
+ DisabledByDefault: true
5
+
6
+ Metrics/AbcSize:
7
+ Max: 15
8
+ Metrics/CyclomaticComplexity:
9
+ Max: 8
10
+ Metrics/PerceivedComplexity:
11
+ Max: 7
12
+
13
+ Metrics/ClassLength:
14
+ CountComments: false
15
+ Max: 150
16
+ Metrics/MethodLength:
17
+ CountComments: false
18
+ Max: 15
19
+ Metrics/ParameterLists:
20
+ Max: 5
21
+ CountKeywordArgs: true
data/.standard.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ format: progress
3
+ ruby_version: 3.3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Mueller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # Twiddling
2
+
3
+ CLI tools for managing Twiddler 4 (v7) configuration files as
4
+ human-readable text instead of using the online tuner.
5
+
6
+ ## Installation
7
+
8
+ ```sh
9
+ bundle install
10
+ ```
11
+
12
+ Requires Ruby >= 3.3.8.
13
+
14
+ ## The .tw7 format
15
+
16
+ Twiddling uses a text format (`.tw7`) for editing configs. It has an
17
+ optional settings section and a chords section separated by `=====`.
18
+ See [formats/tw7.md](formats/tw7.md) for a fuller specification.
19
+
20
+ ```text
21
+ idle_time: 480
22
+ haptic: false
23
+ =====
24
+ 1R: backspace
25
+ 1M: space
26
+ 1L: tab
27
+
28
+ T2::
29
+ 2R: ctrl+d
30
+ 2M: ctrl+c
31
+
32
+ [MOUSEMODE]::
33
+ 1R: left_click
34
+ 1M: middle_click
35
+ ```
36
+
37
+ ## Commands
38
+
39
+ ### twiddling read
40
+
41
+ Print a `.cfg` or `.tw7` file as text:
42
+
43
+ ```sh
44
+ bin/twiddling read my_config.cfg
45
+ bin/twiddling read layout.tw7
46
+ ```
47
+
48
+ ### twiddling convert
49
+
50
+ Convert between `.cfg` and `.tw7` formats:
51
+
52
+ ```sh
53
+ bin/twiddling convert my_config.cfg layout.tw7
54
+ bin/twiddling convert layout.tw7 my_config.cfg
55
+ ```
56
+
57
+ ### twiddling search
58
+
59
+ Search for chords by button combination or output:
60
+
61
+ ```sh
62
+ bin/twiddling search my.cfg --chord "T4 1M"
63
+ bin/twiddling search my.tw7 --result "@"
64
+ bin/twiddling search my.cfg --button T4 --button 0M
65
+ ```
66
+
67
+ All filters are combined as AND conditions.
68
+
69
+ ### twiddling diff
70
+
71
+ Compare two configs, showing changed settings and chords:
72
+
73
+ ```sh
74
+ bin/twiddling diff old.cfg new.cfg
75
+ bin/twiddling diff base.tw7 mine.tw7 --no-color
76
+ ```
77
+
78
+ Output is colorized by default (red=removed, yellow=changed,
79
+ green=added).
80
+
81
+ ### Standalone conversion scripts
82
+
83
+ These are really necessary (and I recommend `twiddling convert`
84
+ most of the time). But simple coversion tools can be more convenient
85
+ sometimes.
86
+
87
+ ```sh
88
+ bin/cfg2tw7 input.cfg output.tw7
89
+ bin/cfg2tw7 input.cfg # prints to stdout
90
+ bin/tw72cfg input.tw7 output.cfg
91
+ ```
92
+
93
+ ## Binary format
94
+
95
+ Config files use a binary format documented in
96
+ [formats/v7-cfg.md](formats/v7-cfg.md). Files should be named `1.cfg`,
97
+ `2.cfg`, or `3.cfg` when placed on the device.
98
+
99
+ Note that I have not fully explored the possible chords/settings; I assume
100
+ there are some things that are no converted correctly or currently
101
+ representable in the tw7 format. Feel free to submit PRs, or include a tuner-
102
+ generated .cfg file with minimal chords in your Issue and explain what those
103
+ chords actually do (I personally only use keys, modified keys, and short
104
+ multi-character strings).
105
+
106
+ ## Config Collection
107
+
108
+ There are a few full configurations in `configs/v7/`. Feel free to submit
109
+ additional configs, either as PRs or issues; if you use it as your primary
110
+ configuration (or if it's a community standard), I'm happy to include it!
111
+
112
+ ## Credits
113
+
114
+ The v7 binary format was originally reverse-engineered by the
115
+ [nchorder](https://github.com/GlassOnTin/nchorder) project, though
116
+ we've departed from their interpretation pretty substantially.
data/bin/cfg2tw7 ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/twiddling"
4
+
5
+ input, output = ARGV
6
+ abort "Usage: cfg2tw7 <input.cfg> [output.tw7]" unless input
7
+
8
+ config = Twiddling::V7::Config.from_file(input)
9
+ if output
10
+ File.open(output, "w") { |f| Twiddling::V7::Tw7::Printer.new(config, io: f).print }
11
+ else
12
+ Twiddling::V7::Tw7::Printer.new(config).print
13
+ end
data/bin/tw72cfg ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/twiddling"
4
+
5
+ input, output = ARGV
6
+ abort "Usage: tw72cfg <input.tw7> <output.cfg>" unless input && output
7
+
8
+ config = Twiddling::V7::Tw7::Parser.new(File.read(input)).parse
9
+ config.write(output)
data/bin/twiddling ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/twiddling"
4
+
5
+ begin
6
+ Twiddling::Cli::Twiddling.new(argv: ARGV).run
7
+ rescue Twiddling::Cli::ExitException => e
8
+ abort e.message
9
+ end
Binary file
@@ -0,0 +1,168 @@
1
+ 1R: a
2
+ 1M: e
3
+ 1L: space
4
+ 2R: b
5
+ 1R 2R: .
6
+ 1M 2R: r
7
+ 1L 2R: i
8
+ 2M: f
9
+ 1R 2M: '
10
+ 1M 2M: u
11
+ 1L 2M: l
12
+ 2L: delete
13
+ 1R 2L: /
14
+ 1M 2L: x
15
+ 1L 2L: o
16
+ 3R: c
17
+ 1R 3R: ,
18
+ 1M 3R: s
19
+ 1L 3R: j
20
+ 2R 3R: "the "
21
+ 1R 2R 3R: esc
22
+ 2M 3R: up
23
+ 2L 3R: 4
24
+ 3M: g
25
+ 1R 3M: '
26
+ 1M 3M: v
27
+ 1L 3M: m
28
+ 2R 3M: "of "
29
+ 2M 3M: left
30
+ 1M 2M 3M: /
31
+ 3L: backspace
32
+ 1R 3L: !
33
+ 1M 3L: y
34
+ 1L 3L: p
35
+ 2R 3L: 0
36
+ 2M 3L: down
37
+ 2L 3L: 9
38
+ 1L 2L 3L: \
39
+ 4R: d
40
+ 1R 4R: ;
41
+ 1M 4R: t
42
+ 1L 4R: k
43
+ 2R 4R: "to "
44
+ 2M 4R: "ed "
45
+ 3R 4R: page_up
46
+ 1R 3R 4R: "ant "
47
+ 2R 3R 4R: home
48
+ 1R 2R 3R 4R: caps_lock
49
+ 3M 4R: =
50
+ 3L 4R: @
51
+ 4M: h
52
+ 1R 4M: "and "
53
+ 1M 4M: w
54
+ 1L 4M: n
55
+ 2R 4M: "in"
56
+ 2M 4M: right
57
+ 1M 2M 4M: tab
58
+ 2L 4M: "ion "
59
+ 3R 4M: 5
60
+ 3M 4M: "ing "
61
+ 1M 3M 4M: "ent "
62
+ 1M 2M 3M 4M: num_lock
63
+ 3L 4M: 8
64
+ 4L: enter
65
+ 1R 4L: -
66
+ 1M 4L: z
67
+ 1L 4L: q
68
+ 2R 4L: -
69
+ 2M 4L: 3
70
+ 2L 4L: 7
71
+ 3R 4L: :
72
+ 3M 4L: =
73
+ 3L 4L: page_down
74
+ 2L 3L 4L: end
75
+
76
+ T1::
77
+ 1R: 1
78
+ 1M: 5
79
+ 1L: 9
80
+ 2R: 2
81
+ 2M: 6
82
+ 1R 2M: [
83
+ 1L 2M: ^
84
+ 2L: 0
85
+ 3R: 3
86
+ 1R 3R: >
87
+ 1L 2L 3R: |
88
+ 3M: 7
89
+ 1L 2L 3M: ~
90
+ 1R 3L: `
91
+ 4R: 4
92
+ 1L 2L 4R: }
93
+ 4M: 8
94
+ 1R 4M: ]
95
+ 4L: enter
96
+ 1R 4L: {
97
+ 1M 4L: <
98
+
99
+ T3::
100
+ 1R: ctrl+a
101
+ 1M: ctrl+e
102
+ 2R: ctrl+b
103
+ 1M 2R: ctrl+r
104
+ 1L 2R: ctrl+i
105
+ 2M: ctrl+f
106
+ 1M 2M: ctrl+u
107
+ 1L 2M: ctrl+l
108
+ 1M 2L: ctrl+x
109
+ 1L 2L: ctrl+o
110
+ 3R: ctrl+c
111
+ 1M 3R: ctrl+s
112
+ 1L 3R: ctrl+j
113
+ 3M: ctrl+g
114
+ 1M 3M: ctrl+v
115
+ 1L 3M: ctrl+m
116
+ 1L 2L 3M: insert
117
+ 1M 3L: ctrl+y
118
+ 1L 3L: ctrl+p
119
+ 4R: ctrl+d
120
+ 1M 4R: ctrl+t
121
+ 1L 4R: ctrl+k
122
+ 4M: ctrl+h
123
+ 1M 4M: ctrl+w
124
+ 1L 4M: ctrl+n
125
+ 1M 4L: ctrl+z
126
+ 1L 4L: ctrl+q
127
+
128
+ T4::
129
+ 1M 2M 4M: tab
130
+ 4L: enter
131
+
132
+ T12::
133
+ 1R: f1
134
+ 1M: f5
135
+ 1L: f9
136
+ 2R: f2
137
+ 1L 2R: alt+f1
138
+ 2M: f6
139
+ 1L 2M: alt+f4
140
+ 2L: f10
141
+ 1L 2L: alt+f7
142
+ 3R: f3
143
+ 1L 3R: alt+f2
144
+ 2L 3R: alt+f10
145
+ 3M: f7
146
+ 1L 3M: alt+f5
147
+ 2L 3M: alt+f12
148
+ 3L: f11
149
+ 1L 3L: alt+f8
150
+ 4R: f4
151
+ 1L 4R: alt+f3
152
+ 2L 4R: alt+f11
153
+ 4M: f8
154
+ 1L 4M: alt+f6
155
+ 4L: f12
156
+ 1L 4L: alt+f9
157
+ 1L 2L 4L: 0x0047
158
+
159
+ T14 4R: speed_cycle
160
+
161
+ [MOUSEMODE]::
162
+ 1R: left_click
163
+ 1M: middle_click
164
+ 1L: right_click
165
+ T23: mouse_toggle
166
+ 4R: speed_decrease
167
+ 4M: scroll_toggle
168
+ 4L: speed_increase
Binary file
@@ -0,0 +1,203 @@
1
+ key_repeat: false
2
+ haptic: false
3
+ nav_direction: 1
4
+ t1_modifier: l_command
5
+ t2_modifier: none
6
+ t3_modifier: l_shift
7
+ t4_modifier: none
8
+ f0l_dedicated: none
9
+ f0m_dedicated: none
10
+ f0r_dedicated: none
11
+ t0_dedicated: none
12
+ =====
13
+
14
+ # The primary bindings here are based on the tabspace layout - see
15
+ # https://rhodesmill.org/brandon/projects/tabspace-guide.pdf for
16
+ # details. I have departed in several places, but the general idea
17
+ # is to dedicate the 1-row to chord bases (index finger is most
18
+ # capable of isolated control).
19
+
20
+ 1R: backspace
21
+ 1M: space
22
+ 1L: tab
23
+
24
+ # -------- letters ------------------------------
25
+ 2R: i
26
+ 2M: e
27
+ 2L: o
28
+ 3R: n
29
+ 3M: t
30
+ 3L: r
31
+ 4R: a
32
+ 4M: h
33
+ 4L: s
34
+
35
+ 1M::
36
+ # -- Secondary letters (chorded on space/1M)
37
+ 2R: c
38
+ 2M: d
39
+ 2L: u
40
+ 3R: f
41
+ 3M: l
42
+ 3L: w
43
+ 4R: g
44
+ 4M: m
45
+ 4L: y
46
+
47
+ # -- Tertiary letters (adjacent pairs chorded on space/1M)
48
+ 2R 3R: b
49
+ 2M 3M: p
50
+ 3M 4M: k
51
+ 2L 3L: v
52
+ 3L 4L: x
53
+ 3R 4R: j
54
+
55
+ # -- Rare letters (adjacent triples chorded on space/1M)
56
+ 2R 3R 4R: z
57
+ 2M 3M 4M: q
58
+ # Note that 1M 2L3L4L is in the next section (as ESC)
59
+
60
+ # -------- whole hand chords --------------------
61
+ 1R 2R 3R 4R: enter
62
+ 1M 2L 3L 4L: esc
63
+
64
+ # -------- numerics -----------------------------
65
+ 1R::
66
+ # numbers
67
+ 2R: 1
68
+ 3R: 2
69
+ 4R: 3
70
+ 2M: 4
71
+ 3M: 5
72
+ 4M: 6
73
+ 2L: 7
74
+ 3L: 8
75
+ 4L: 9
76
+ 2R 3R: 0 # (three adjacent)
77
+
78
+ 3R 4R: .
79
+ 3M 4M: ,
80
+ 2L 3L: ^
81
+
82
+ 3L 4L: ~
83
+ 2L 3L 4L: %
84
+
85
+ # -------- calculation glyphs ------------------------------
86
+ 1R2R::
87
+ # (3R is above - that's zero)
88
+ 3M: +
89
+ 3L: -
90
+ 4R: =
91
+ 4M: *
92
+ 4L: /
93
+
94
+ # I am less happy with the punctuation/symbol bindings.
95
+ # There are _so many_ of them, and I don't have a good mental model for
96
+ # how to organize them so that I can find what I need on the fly yet.
97
+ # I write mostly ruby, so the easily reachable symbols are biased in
98
+ # that direction.
99
+
100
+ # -------- paired glyphs (mostly) ---------------------
101
+ 1R2M::
102
+ 3R: [
103
+ 4R: ]
104
+ 3M: (
105
+ 4M: )
106
+ 3L: {
107
+ 4L: }
108
+ 3R 4R: <
109
+ 3L 4L: >
110
+
111
+ 3M 4M: $
112
+
113
+ 1L:: # -------- common punctuation ------------------------------
114
+ 2L: .
115
+ 3L: ,
116
+ 4L: '
117
+
118
+ 2M: enter
119
+ 3M: !
120
+ 4M: *
121
+
122
+ 2R: -
123
+ 3R: /
124
+ 4R: \
125
+
126
+ # adjacent pairs
127
+ 3R 4R: &
128
+ 3M 4M: `
129
+ 3L 4L: shift+' # (double-quote)
130
+
131
+ 1L2L::
132
+ 3R: @
133
+ 3M: ? # way more common than I expected, this needs promoting to a 2-finger chord
134
+ 3L: ;
135
+ 4R: %
136
+ 4M: $
137
+ 4L: "#"
138
+ 3L 4L: "_"
139
+
140
+ 1L2M:: # don't chord too much from here; 'enter' is a dangerous base in a terminal
141
+ 3M: ":"
142
+ 3M 4M: =
143
+
144
+ 1L2R:: # awkward reach
145
+ 3R: ~
146
+ 3R 4R: |
147
+
148
+ # Thumb chords - these are entirely tentative, and I'm playing with other approaches.
149
+ # Chords including them buttons are _awkward_, and usually require a hgrip shift,
150
+ # so they aren't terribly useful.
151
+
152
+ # Probably the answer is 'sticky' thumb buttons, but I need to see how often I get
153
+ # confused about what buttons are _stuck_.
154
+
155
+ T2::
156
+ 2R: ctrl+d
157
+ 2M: ctrl+c
158
+ 2L: cmd+n
159
+
160
+ 1R 2R: cmd+c
161
+ 1R 2M: cmd+v
162
+ 1R 2L: cmd+x
163
+
164
+ 3R: cmd+l
165
+ 3M: cmd+k
166
+ 3L: cmd+f
167
+
168
+ 4R: cmd+w
169
+ 4M: cmd+t
170
+ 4L: cmd+q
171
+
172
+ T4::
173
+ 1R: ctrl+y
174
+ 1M: up
175
+ 1L: page_up
176
+ 2R: alt+f
177
+ 2M: right
178
+ 2L: end
179
+ 3R: alt+b
180
+ 2R 3R: ctrl+cmd+up
181
+ 3M: left
182
+ 3L: home
183
+ 2L 3L: ctrl+cmd+enter
184
+ 4R: ctrl+e
185
+ 1R 4R: ctrl+cmd+left
186
+ 4M: down
187
+ 4L: page_down
188
+ 1L 4L: ctrl+cmd+right
189
+ 1L 2L 3L 4L: ctrl+cmd+enter
190
+ 0L: ctrl+tab
191
+ 0M: cmd+`
192
+ 0R: cmd+tab
193
+
194
+ T14 4R: speed_cycle
195
+
196
+ [MOUSEMODE]::
197
+ 1R: left_click
198
+ 1M: middle_click
199
+ 1L: right_click
200
+ T23: mouse_toggle
201
+ 4R: speed_decrease
202
+ 4M: scroll_toggle
203
+ 4L: speed_increase
@@ -0,0 +1,31 @@
1
+ # Fixtures
2
+
3
+ - empty.cfg - config downloaded with only system chords and default settings
4
+ - large.cfg - a full config with many chords.
5
+
6
+ ## Settings
7
+
8
+ Each of these is a variation of empty.cfg with one setting changed.
9
+
10
+ - no-right-mouse-button.cfg - 'dedicated button function' removed from
11
+ 0L (previously was 'Mouse Button Right')
12
+ - no-t0-dedicated.cfg - t0 no longer dedicated to mouse button left.
13
+ - idle-time-8m.cfg - 'idle time until sleep' lowered from 10m to 8m
14
+ - nav-invert-x-axis.cfg - 'Nav Invert X-Axis' enabled
15
+ - nav-sensitivity-lowered.cfg - 'nav sensitivity' reduced all the way
16
+ - button-mode-keyboard.cfg - button-mode set to "keyboard"
17
+ - haptic-feedback-off.cfg - haptic feedback disabled
18
+ - nav-up-east.cfg - nav-up set to east instead of north
19
+ - key-repeat-disabled.cfg - key-repeat disabled
20
+ - key-repeat-1020.cfg - key-repeat threshold changed from 1000 to 1020 ms
21
+
22
+ ## Buttons
23
+
24
+ Each of these is empty.cfg with one extra chord added.
25
+
26
+ - single-unmodified-key.cfg - F1R = "c"
27
+ - shifted-key.cfg - F1R = "@"
28
+ - modifier-key.cfg - F1R = "ctrl+c"
29
+ - multi-char.cfg - F1R = "test" (a string)
30
+ - cycle-config-chord.cfg - F1R = "Cycle config"
31
+ - mini-buttons.cfg - 0L = "l", 0M = "m", and 0R = "r"
@@ -0,0 +1,16 @@
1
+ keyboard_mode: true
2
+ =====
3
+ 0L: l
4
+ 0M: m
5
+ 0R: r
6
+
7
+ T14 4R: speed_cycle
8
+
9
+ [MOUSEMODE]::
10
+ 1R: left_click
11
+ 1M: middle_click
12
+ 1L: right_click
13
+ T23: mouse_toggle
14
+ 4R: speed_decrease
15
+ 4M: scroll_toggle
16
+ 4L: speed_increase
Binary file
@@ -0,0 +1,12 @@
1
+ 1R: config_cycle
2
+
3
+ T14 4R: speed_cycle
4
+
5
+ [MOUSEMODE]::
6
+ 1R: left_click
7
+ 1M: middle_click
8
+ 1L: right_click
9
+ T23: mouse_toggle
10
+ 4R: speed_decrease
11
+ 4M: scroll_toggle
12
+ 4L: speed_increase
Binary file
@@ -0,0 +1,10 @@
1
+ T14 4R: speed_cycle
2
+
3
+ [MOUSEMODE]::
4
+ 1R: left_click
5
+ 1M: middle_click
6
+ 1L: right_click
7
+ T23: mouse_toggle
8
+ 4R: speed_decrease
9
+ 4M: scroll_toggle
10
+ 4L: speed_increase
Binary file