aboutsummaryrefslogtreecommitdiff
path: root/users
diff options
context:
space:
mode:
authorepaew <epaew@users.noreply.github.com>2018-11-27 02:50:45 +0900
committerDrashna Jaelre <drashna@live.com>2018-11-26 09:50:45 -0800
commitf3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390 (patch)
treeba63b9851104dfc7916740af4bcee8f2476e50b3 /users
parent0031e461913d23e37a9aebd1da5daf1c93a149ee (diff)
downloadqmk_firmware-f3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390.tar.gz
qmk_firmware-f3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390.zip
Keymap: Refactor edvorakjp user library (#4480)
* Refactor edvorakjp user library * add tap dance support * update keymaps * edvorakjp: add SWAP_SCLN option * fix behavior of SWAP_SCLN
Diffstat (limited to 'users')
-rw-r--r--users/edvorakjp/edvorakjp.c222
-rw-r--r--users/edvorakjp/edvorakjp.h37
-rw-r--r--users/edvorakjp/edvorakjp_process_record.c206
-rw-r--r--users/edvorakjp/edvorakjp_status.c75
-rw-r--r--users/edvorakjp/edvorakjp_tap_dance.c71
-rw-r--r--users/edvorakjp/readme.md12
-rw-r--r--users/edvorakjp/rules.mk8
7 files changed, 394 insertions, 237 deletions
diff --git a/users/edvorakjp/edvorakjp.c b/users/edvorakjp/edvorakjp.c
index cff1a123e..1ac610794 100644
--- a/users/edvorakjp/edvorakjp.c
+++ b/users/edvorakjp/edvorakjp.c
@@ -1,47 +1,12 @@
1#include "eeprom.h"
2#include "edvorakjp.h" 1#include "edvorakjp.h"
3 2
4bool japanese_mode;
5uint16_t time_on_pressed;
6
7edvorakjp_config_t edvorakjp_config;
8
9uint8_t eeconfig_read_edvorakjp(void) {
10 return eeprom_read_byte(EECONFIG_EDVORAK);
11}
12
13void eeconfig_update_edvorakjp(uint8_t val) {
14 eeprom_update_byte(EECONFIG_EDVORAK, val);
15}
16
17void dvorakj_layer_off(void) { 3void dvorakj_layer_off(void) {
18 layer_off(_EDVORAKJ1); 4 layer_off(_EDVORAKJ1);
19 layer_off(_EDVORAKJ2); 5 layer_off(_EDVORAKJ2);
20} 6}
21 7
22void update_japanese_mode(bool new_state) {
23 japanese_mode = new_state;
24 if (japanese_mode) {
25 if (edvorakjp_config.enable_kc_lang) {
26 SEND_STRING(SS_TAP(X_LANG1));
27 } else {
28 SEND_STRING(SS_LALT("`"));
29 }
30 } else {
31 dvorakj_layer_off();
32 if (edvorakjp_config.enable_kc_lang) {
33 SEND_STRING(SS_TAP(X_LANG2));
34 } else {
35 SEND_STRING(SS_LALT("`"));
36 }
37 }
38}
39
40void matrix_init_user(void) { 8void matrix_init_user(void) {
41 japanese_mode = false; 9 edvorakjp_status_init();
42 time_on_pressed = 0;
43 edvorakjp_config.raw = eeconfig_read_edvorakjp();
44
45 matrix_init_keymap(); 10 matrix_init_keymap();
46} 11}
47 12
@@ -58,189 +23,16 @@ uint32_t layer_state_set_keymap(uint32_t state) {
58 return state; 23 return state;
59} 24}
60 25
61/*
62 * Each process_record_* methods defined here are
63 * return false if handle edvorak_keycodes, or return true others.
64 */
65__attribute__ ((weak))
66bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
67 return true;
68}
69
70bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) {
71 if (!(edvorakjp_config.enable_jp_extra_layer &&\
72 (default_layer_state == 1UL<<_EDVORAK) &&\
73 japanese_mode &&\
74 record->event.pressed)) {
75 return true;
76 }
77
78 // consonant keys
79 // layer_on(J1) or layer_on(J2) are defined based on key positions.
80 switch (keycode) {
81 // right hand's left side w/o N
82 case KC_F:
83 case KC_G:
84 case KC_R:
85 case KC_D:
86 case KC_T:
87 case KC_B:
88 case KC_H:
89 case KC_J:
90 layer_on(_EDVORAKJ1);
91 register_code(keycode);
92 unregister_code(keycode);
93 return false;
94
95 // N: toggle layer
96 case KC_N:
97 biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off();
98 register_code(keycode);
99 unregister_code(keycode);
100 return false;
101
102 // left hand and right hand's right side
103 case KC_X:
104 case KC_C:
105 case KC_V:
106 case KC_Z:
107 case KC_P:
108 case KC_Y:
109 case KC_W:
110 case KC_Q:
111 case KC_S:
112 case KC_M:
113 case KC_K:
114 case KC_L:
115 layer_on(_EDVORAKJ2);
116 register_code(keycode);
117 unregister_code(keycode);
118 return false;
119 }
120
121 // vowel keys, symbol keys and modifier keys
122 dvorakj_layer_off();
123 switch (keycode) {
124 // combination vowel keys
125 case KC_AI:
126 SEND_STRING("ai");
127 return false;
128 case KC_OU:
129 SEND_STRING("ou");
130 return false;
131 case KC_EI:
132 SEND_STRING("ei");
133 return false;
134 case KC_ANN:
135 SEND_STRING("ann");
136 return false;
137 case KC_ONN:
138 SEND_STRING("onn");
139 return false;
140 case KC_ENN:
141 SEND_STRING("enn");
142 return false;
143 case KC_INN:
144 SEND_STRING("inn");
145 return false;
146 case KC_UNN:
147 SEND_STRING("unn");
148 return false;
149
150 // AOEIU and other (symbol, modifier) keys
151 default:
152 return true;
153 }
154}
155
156bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
157 switch (keycode) {
158 case KC_MAC:
159 edvorakjp_config.enable_kc_lang = true;
160 eeconfig_update_edvorakjp(edvorakjp_config.raw);
161 return false;
162 case KC_WIN:
163 edvorakjp_config.enable_kc_lang = false;
164 eeconfig_update_edvorakjp(edvorakjp_config.raw);
165 return false;
166 case KC_EXTON:
167 edvorakjp_config.enable_jp_extra_layer = true;
168 eeconfig_update_edvorakjp(edvorakjp_config.raw);
169 return false;
170 case KC_EXTOFF:
171 edvorakjp_config.enable_jp_extra_layer = false;
172 eeconfig_update_edvorakjp(edvorakjp_config.raw);
173 return false;
174 }
175 return true;
176}
177
178bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
179 switch (keycode) {
180 case EDVORAK:
181 if (record->event.pressed) {
182 set_single_persistent_default_layer(_EDVORAK);
183 }
184 return false;
185 case QWERTY:
186 if (record->event.pressed) {
187 dvorakj_layer_off();
188 set_single_persistent_default_layer(_QWERTY);
189 }
190 return false;
191 case LOWER:
192 if (record->event.pressed) {
193 layer_on(_LOWER);
194 time_on_pressed = record->event.time;
195 } else {
196 layer_off(_LOWER);
197
198 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
199 update_japanese_mode(false);
200 }
201 time_on_pressed = 0;
202 }
203 return false;
204 case RAISE:
205 if (record->event.pressed) {
206 layer_on(_RAISE);
207 time_on_pressed = record->event.time;
208 } else {
209 layer_off(_RAISE);
210
211 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
212 update_japanese_mode(true);
213 }
214 time_on_pressed = 0;
215 }
216 return false;
217 default:
218 return true;
219 }
220}
221
222bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
223 switch (keycode) {
224 case KC_JPN:
225 if (record->event.pressed) {
226 update_japanese_mode(true);
227 }
228 return false;
229 case KC_ENG:
230 if (record->event.pressed) {
231 update_japanese_mode(false);
232 }
233 return false;
234 default:
235 return true;
236 }
237}
238
239bool process_record_user(uint16_t keycode, keyrecord_t *record) { 26bool process_record_user(uint16_t keycode, keyrecord_t *record) {
240
241 return process_record_keymap(keycode, record) &&\ 27 return process_record_keymap(keycode, record) &&\
242 process_record_edvorakjp_ext(keycode, record) &&\ 28 process_record_edvorakjp_ext(keycode, record) &&\
29 process_record_edvorakjp_swap_scln(keycode, record) &&\
243 process_record_edvorakjp_config(keycode, record) &&\ 30 process_record_edvorakjp_config(keycode, record) &&\
244 process_record_layer(keycode, record) &&\ 31 process_record_layer(keycode, record) &&\
245 process_record_ime(keycode, record); 32 process_record_ime(keycode, record);
246} 33}
34
35__attribute__ ((weak))
36bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
37 return true;
38}
diff --git a/users/edvorakjp/edvorakjp.h b/users/edvorakjp/edvorakjp.h
index f67400686..e781bf237 100644
--- a/users/edvorakjp/edvorakjp.h
+++ b/users/edvorakjp/edvorakjp.h
@@ -1,5 +1,5 @@
1#ifndef USERSPACE 1#ifndef EDVORAKJP
2#define USERSPACE 2#define EDVORAKJP
3 3
4#include "quantum.h" 4#include "quantum.h"
5#include "action_layer.h" 5#include "action_layer.h"
@@ -8,15 +8,6 @@
8 8
9extern keymap_config_t keymap_config; 9extern keymap_config_t keymap_config;
10 10
11typedef union {
12 uint8_t raw;
13 struct {
14 bool enable_jp_extra_layer : 1;
15 bool enable_kc_lang : 1; // for macOS
16 };
17} edvorakjp_config_t;
18extern edvorakjp_config_t edvorakjp_config;
19
20enum edvorakjp_layers { 11enum edvorakjp_layers {
21 _EDVORAK = 0, 12 _EDVORAK = 0,
22 _EDVORAKJ1, 13 _EDVORAKJ1,
@@ -50,26 +41,38 @@ enum edvorakjp_keycodes {
50 NEW_SAFE_RANGE 41 NEW_SAFE_RANGE
51}; 42};
52 43
53uint8_t eeconfig_read_edvorakjp(void); 44enum tap_dance_code {
54void eeconfig_update_edvorakjp(uint8_t val); 45 TD_LOWER = 0,
46 TD_RAISE
47};
55 48
49// base
56void dvorakj_layer_off(void); 50void dvorakj_layer_off(void);
57void update_japanese_mode(bool new_state);
58void matrix_init_user(void); 51void matrix_init_user(void);
59void matrix_init_keymap(void); 52void matrix_init_keymap(void);
60uint32_t layer_state_set_user(uint32_t state); 53uint32_t layer_state_set_user(uint32_t state);
61uint32_t layer_state_set_keymap(uint32_t state); 54uint32_t layer_state_set_keymap(uint32_t state);
55bool process_record_user(uint16_t keycode, keyrecord_t *record);
56bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
57
58// status
59void edvorakjp_status_init(void);
60bool get_enable_jp_extra_layer(void);
61void set_enable_jp_extra_layer(bool new_state);
62bool get_enable_kc_lang(void);
63void set_enable_kc_lang(bool new_state);
64bool get_japanese_mode(void);
65void set_japanese_mode(bool new_state);
62 66
63/* 67/*
64 * Each process_record_* methods defined here are 68 * Each process_record_* methods defined here are
65 * return false if processed, or return true if not processed. 69 * return false if processed, or return true if not processed.
66 * You can add your original macros in process_record_keymap() in keymap.c. 70 * You can add your original macros in process_record_keymap() in keymap.c.
67 */ 71 */
68bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
69bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record); 72bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record);
73bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record);
70bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record); 74bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record);
71bool process_record_layer(uint16_t keycode, keyrecord_t *record); 75bool process_record_layer(uint16_t keycode, keyrecord_t *record);
72bool process_record_ime(uint16_t keycode, keyrecord_t *record); 76bool process_record_ime(uint16_t keycode, keyrecord_t *record);
73bool process_record_user(uint16_t keycode, keyrecord_t *record);
74 77
75#endif 78#endif // EDVORAKJP
diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c
new file mode 100644
index 000000000..dc70522b4
--- /dev/null
+++ b/users/edvorakjp/edvorakjp_process_record.c
@@ -0,0 +1,206 @@
1#include "edvorakjp.h"
2
3#if TAP_DANCE_ENABLE != yes
4static uint16_t time_on_pressed;
5#endif
6/*
7 * Each process_record_* methods defined here are
8 * return false if handle edvorak_keycodes, or return true others.
9 */
10bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) {
11 if (!(default_layer_state == 1UL<<_EDVORAK &&
12 get_enable_jp_extra_layer() && get_japanese_mode())) {
13 return true;
14 }
15
16 // consonant keys
17 // layer_on(J1) or layer_on(J2) are defined based on key positions.
18 switch (keycode) {
19 // right hand's left side w/o N
20 case KC_F:
21 case KC_G:
22 case KC_R:
23 case KC_D:
24 case KC_T:
25 case KC_B:
26 case KC_H:
27 case KC_J:
28 if (record->event.pressed) {
29 layer_on(_EDVORAKJ1);
30 }
31 return true;
32
33 // N: toggle layer
34 case KC_N:
35 if (record->event.pressed) {
36 biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off();
37 }
38 return true;
39
40 // left hand and right hand's right side
41 case KC_X:
42 case KC_C:
43 case KC_V:
44 case KC_Z:
45 case KC_Y:
46 case KC_P:
47 case KC_W:
48 case KC_Q:
49 case KC_S:
50 case KC_M:
51 case KC_K:
52 case KC_L:
53 if (record->event.pressed) {
54 layer_on(_EDVORAKJ2);
55 }
56 return true;
57 }
58
59 // vowel keys, symbol keys and modifier keys
60 if (record->event.pressed) {
61 dvorakj_layer_off();
62 }
63 switch (keycode) {
64 // combination vowel keys
65 case KC_AI:
66 if (record->event.pressed) {
67 SEND_STRING("ai");
68 }
69 return false;
70 case KC_OU:
71 if (record->event.pressed) {
72 SEND_STRING("ou");
73 }
74 return false;
75 case KC_EI:
76 if (record->event.pressed) {
77 SEND_STRING("ei");
78 }
79 return false;
80 case KC_ANN:
81 if (record->event.pressed) {
82 SEND_STRING("ann");
83 }
84 return false;
85 case KC_ONN:
86 if (record->event.pressed) {
87 SEND_STRING("onn");
88 }
89 return false;
90 case KC_ENN:
91 if (record->event.pressed) {
92 SEND_STRING("enn");
93 }
94 return false;
95 case KC_INN:
96 if (record->event.pressed) {
97 SEND_STRING("inn");
98 }
99 return false;
100 case KC_UNN:
101 if (record->event.pressed) {
102 SEND_STRING("unn");
103 }
104 return false;
105 }
106 // AOEIU and other (symbol, modifier) keys
107 return true;
108}
109
110bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) {
111#ifdef SWAP_SCLN
112 static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT);
113 static uint8_t last_mods_status;
114 if (keycode == KC_SCLN) {
115 if (record->event.pressed) {
116 last_mods_status = get_mods();
117
118 // invert shift_bits
119 if (last_mods_status & shift_bits) {
120 set_mods(last_mods_status & ~shift_bits);
121 } else {
122 set_mods(last_mods_status | MOD_BIT(KC_LSFT));
123 }
124 } else {
125 set_mods(last_mods_status);
126 last_mods_status = 0;
127 }
128 }
129#endif
130 return true;
131}
132
133bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
134 switch (keycode) {
135 case KC_MAC:
136 case KC_WIN:
137 if (record->event.pressed) {
138 set_enable_kc_lang(keycode == KC_MAC);
139 }
140 return false;
141 case KC_EXTON:
142 case KC_EXTOFF:
143 if (record->event.pressed) {
144 set_enable_jp_extra_layer(keycode == KC_EXTON);
145 }
146 return false;
147 }
148 return true;
149}
150
151bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
152 switch (keycode) {
153 case EDVORAK:
154 if (record->event.pressed) {
155 set_single_persistent_default_layer(_EDVORAK);
156 }
157 return false;
158 case QWERTY:
159 if (record->event.pressed) {
160 dvorakj_layer_off();
161 set_single_persistent_default_layer(_QWERTY);
162 }
163 return false;
164#if TAP_DANCE_ENABLE != yes
165 case LOWER:
166 if (record->event.pressed) {
167 layer_on(_LOWER);
168 time_on_pressed = record->event.time;
169 } else {
170 layer_off(_LOWER);
171
172 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
173 set_japanese_mode(false);
174 }
175 time_on_pressed = 0;
176 }
177 return false;
178 case RAISE:
179 if (record->event.pressed) {
180 layer_on(_RAISE);
181 time_on_pressed = record->event.time;
182 } else {
183 layer_off(_RAISE);
184
185 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
186 set_japanese_mode(true);
187 }
188 time_on_pressed = 0;
189 }
190 return false;
191#endif
192 }
193 return true;
194}
195
196bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
197 switch (keycode) {
198 case KC_JPN:
199 case KC_ENG:
200 if (record->event.pressed) {
201 set_japanese_mode(keycode == KC_JPN);
202 }
203 return false;
204 }
205 return true;
206}
diff --git a/users/edvorakjp/edvorakjp_status.c b/users/edvorakjp/edvorakjp_status.c
new file mode 100644
index 000000000..a60c8d853
--- /dev/null
+++ b/users/edvorakjp/edvorakjp_status.c
@@ -0,0 +1,75 @@
1#include "eeprom.h"
2#include "edvorakjp.h"
3
4typedef union {
5 uint8_t raw;
6 struct {
7 bool enable_jp_extra_layer : 1;
8 bool enable_kc_lang : 1; // for macOS
9 };
10} edvorakjp_config_t;
11static edvorakjp_config_t edvorakjp_config;
12
13typedef struct {
14 bool japanese_mode;
15} edvorakjp_state_t;
16static edvorakjp_state_t edvorakjp_state;
17
18/*
19 * private methods
20 */
21uint8_t eeconfig_read_edvorakjp(void) {
22 return eeprom_read_byte(EECONFIG_EDVORAK);
23}
24
25void eeconfig_update_edvorakjp(uint8_t val) {
26 eeprom_update_byte(EECONFIG_EDVORAK, val);
27}
28
29/*
30 * public methods
31 */
32void edvorakjp_status_init(void) {
33 edvorakjp_state.japanese_mode = false;
34 edvorakjp_config.raw = eeconfig_read_edvorakjp();
35}
36
37bool get_enable_jp_extra_layer(void) {
38 return edvorakjp_config.enable_jp_extra_layer;
39}
40
41void set_enable_jp_extra_layer(bool new_state) {
42 edvorakjp_config.enable_jp_extra_layer = new_state;
43 eeconfig_update_edvorakjp(edvorakjp_config.raw);
44}
45
46bool get_enable_kc_lang(void) {
47 return edvorakjp_config.enable_kc_lang;
48}
49
50void set_enable_kc_lang(bool new_state) {
51 edvorakjp_config.enable_kc_lang = new_state;
52 eeconfig_update_edvorakjp(edvorakjp_config.raw);
53}
54
55bool get_japanese_mode(void) {
56 return edvorakjp_state.japanese_mode;
57}
58
59void set_japanese_mode(bool new_state) {
60 edvorakjp_state.japanese_mode = new_state;
61 if (edvorakjp_state.japanese_mode) {
62 if (edvorakjp_config.enable_kc_lang) {
63 SEND_STRING(SS_TAP(X_LANG1));
64 } else {
65 SEND_STRING(SS_LALT("`"));
66 }
67 } else {
68 dvorakj_layer_off();
69 if (edvorakjp_config.enable_kc_lang) {
70 SEND_STRING(SS_TAP(X_LANG2));
71 } else {
72 SEND_STRING(SS_LALT("`"));
73 }
74 }
75}
diff --git a/users/edvorakjp/edvorakjp_tap_dance.c b/users/edvorakjp/edvorakjp_tap_dance.c
new file mode 100644
index 000000000..62c0c100a
--- /dev/null
+++ b/users/edvorakjp/edvorakjp_tap_dance.c
@@ -0,0 +1,71 @@
1#include "edvorakjp.h"
2#include "process_keycode/process_tap_dance.h"
3
4enum tap_state {
5 NONE = 0,
6 SINGLE_TAP = 1,
7 DOUBLE_TAP = 2,
8 HOLD
9};
10
11static int td_status_lower = NONE;
12static int td_status_raise = NONE;
13
14int cur_dance(qk_tap_dance_state_t *state) {
15 if (state->interrupted || !state->pressed) {
16 return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
17 } else {
18 return HOLD;
19 }
20}
21
22void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
23 td_status_lower = cur_dance(state);
24 switch(td_status_lower) {
25 case SINGLE_TAP:
26 set_japanese_mode(false);
27 register_code(KC_ESC);
28 break;
29 case DOUBLE_TAP:
30 set_japanese_mode(false);
31 break;
32 case HOLD:
33 break;
34 }
35 layer_on(_LOWER);
36}
37
38void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
39 if (td_status_lower == SINGLE_TAP) {
40 unregister_code(KC_ESC);
41 }
42 layer_off(_LOWER);
43 td_status_lower = NONE;
44}
45
46void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
47 td_status_raise = cur_dance(state);
48 switch(td_status_raise) {
49 case SINGLE_TAP:
50 case DOUBLE_TAP:
51 set_japanese_mode(true);
52 break;
53 case HOLD:
54 break;
55 }
56 layer_on(_RAISE);
57}
58
59void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
60 layer_off(_RAISE);
61 td_status_raise = NONE;
62}
63
64qk_tap_dance_action_t tap_dance_actions[] = {
65 [TD_LOWER] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(
66 NULL, td_lower_finished, td_lower_reset, TAPPING_TERM * 1.5
67 ),
68 [TD_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(
69 NULL, td_raise_finished, td_raise_reset, TAPPING_TERM * 1.5
70 )
71};
diff --git a/users/edvorakjp/readme.md b/users/edvorakjp/readme.md
index d7ec74285..077ba4abd 100644
--- a/users/edvorakjp/readme.md
+++ b/users/edvorakjp/readme.md
@@ -10,7 +10,7 @@ This is a sample. You can swap any symbol keys and modifier keys.
10 //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ 10 //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
11 ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , 11 ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC ,
12 //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ 12 //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
13 TAB , ' , , , . , P , Y , F , G , R , W , Q , / , = , \ , 13 TAB , ' , , , . , Y , P , F , G , R , W , Q , / , = , \ ,
14 //+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+ 14 //+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+
15 CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT , 15 CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT ,
16 //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+ 16 //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+
@@ -25,7 +25,7 @@ This is a sample. You can swap any symbol keys and modifier keys.
25 //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ 25 //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
26 ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , 26 ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC ,
27 //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ 27 //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
28 TAB , ' , , , . , P , Y , F , G , R , W , C , / , = , 28 TAB , ' , , , . , Y , P , F , G , R , W , C , / , = ,
29 //+------++---++---++---++---++---++---++---++---++---++---++---++---++ 29 //+------++---++---++---++---++---++---++---++---++---++---++---++---++
30 CAPS , A , O , E , I , U , D , T , N , S , M , ; , - , ENT , 30 CAPS , A , O , E , I , U , D , T , N , S , M , ; , - , ENT ,
31 //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+------+ 31 //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+------+
@@ -78,11 +78,15 @@ This is a sample. You can swap any symbol keys and modifier keys.
78## for Programmer 78## for Programmer
79 79
80- Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持 80- Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持
81- Vimユーザのために、HJKL キーを横並びで配置 81- 一部にVimユーザ用のキー配置を実施
82 - HJKL キーを横並びで配置
83 - Shift押下時と非押下時で、";"キーの挙動を入れ替え(`config.h` 内で `#define SWAP_SCLN` の宣言が必要です)
82- デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置 84- デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置
83 85
84- mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout 86- mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout
85- HJKL is lining side by side, for Vim users 87- for Vim users
88 - HJKL is lining side by side
89 - swap the ";" key behavior. i.e. send ":" normally and send ";" when you hold shift. (need `#define SWAP_SCLN` in your `config.h`)
86- we can type `!@#$%^&*()` keys without shift keys in base layer 90- we can type `!@#$%^&*()` keys without shift keys in base layer
87 91
88## License 92## License
diff --git a/users/edvorakjp/rules.mk b/users/edvorakjp/rules.mk
index 4fb739186..587c3b8d2 100644
--- a/users/edvorakjp/rules.mk
+++ b/users/edvorakjp/rules.mk
@@ -1 +1,7 @@
1SRC += edvorakjp.c 1SRC += edvorakjp.c \
2 edvorakjp_process_record.c \
3 edvorakjp_status.c
4
5ifeq ($(TAP_DANCE_ENABLE), yes)
6SRC += edvorakjp_tap_dance.c
7endif