aboutsummaryrefslogtreecommitdiff
path: root/users/kuchosauronad0/readme.md
diff options
context:
space:
mode:
Diffstat (limited to 'users/kuchosauronad0/readme.md')
-rw-r--r--users/kuchosauronad0/readme.md145
1 files changed, 145 insertions, 0 deletions
diff --git a/users/kuchosauronad0/readme.md b/users/kuchosauronad0/readme.md
new file mode 100644
index 000000000..8211dc189
--- /dev/null
+++ b/users/kuchosauronad0/readme.md
@@ -0,0 +1,145 @@
1# qmk userspace for kuchosauronad0
2Thanks to drashna and everyone else in the qmk_firmware/users/ directory :)
3
4# Overview
5
6## Keyboard Layout Templates
7This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.
8
9This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.
10
11The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:
12
13`#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)`
14
15Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.
16
17Credit goes to @jola5 for first implementing this awesome idea.
18
19## Custom Keycodes
20Declared in `process_records.h` and `template.h` and defined in `process_record_user` in template.c
21
22## Tap Dances
23Set `TAP_DANCE_ENABLE = yes` in rules.mk. See file tap_dances.{c,h}
24
25## Leader Key
26Set `LEADER_ENABLE = yes` in rules.mk.
27TODO: document tmux / vim / os
28
29## Unicode
30TODO: Set `idk` in `idc`
31
32## Diablo Layer
33Currently not in use.
34
35# Secret Macros
36Set `NO_SECRETS = yes` in rules.mk.
37
38With help from gitter and Colinta, this adds the ability to add hidden macros from other users.
39
40First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open `.git/info/exclude` and add `secrets.c` and `secrets.h` to that file, below the comments.
41
42And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `<name>.h` file to define the keycodes for the new macros.
43
44
45### .git/info/exclude
46
47```
48# git ls-files --others --exclude-from=.git/info/exclude
49# Lines that start with '#' are comments.
50# For a project mostly in C, the following would be a good set of
51# exclude patterns (uncomment them if you want to use them):
52# *.[oa]
53# *~
54/users/kuchosauronad0/secrets.c
55/users/kuchosauronad0/secrets.h
56```
57
58Then you can create these files:
59
60### secrets.c
61
62```c
63#include "kuchosauronad0.h" // replace with your keymap's "h" file, or whatever file stores the keycodes
64
65#if (__has_include("secrets.h") && !defined(NO_SECRETS))
66#include "secrets.h"
67#else
68// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
69// And I'm not familiar enough to know which is better or why...
70static const char * const secret[] = {
71 "test1",
72 "test2",
73 "test3",
74 "test4",
75 "test5"
76};
77#endif
78
79bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
80 switch (keycode) {
81 case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo
82 if (!record->event.pressed) {
83 clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
84 send_string_with_delay(secret[keycode - KC_SECRET_1], MACRO_TIMER);
85 }
86 return false;
87 break;
88 }
89 return true;
90}
91```
92
93### secrets.h
94
95```c
96static const char * const secrets[] = {
97 "secret1",
98 "secret2",
99 "secret3",
100 "secret4",
101 "secret5"
102};
103```
104
105Replacing the strings with the codes that you need.
106
107### name.c
108
109In the `<name>.c` file, you will want to add this to the top:
110
111```c
112__attribute__ ((weak))
113bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
114 return true;
115}
116```
117
118This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist.
119
120And then, in the `process_record_user` function, assuming you have `return process_record_keymap(keycode, record)` here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the `return true;` with `return process_record_secrets(keycode, record);`
121
122```c
123 return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
124}
125```
126
127### rules.mk
128
129Here, you want your `/users/<name>/rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block:
130
131```make
132ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
133 SRC += secrets.c
134endif
135```
136
137Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users/<name>/rules.mk`, so that it catches the flag:
138
139```make
140ifeq ($(strip $(NO_SECRETS)), yes)
141 OPT_DEFS += -DNO_SECRETS
142endif
143```
144
145Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `<name>.c` file, rather than reading from your file.