Update nodefree repo

This commit is contained in:
urob 2022-07-14 23:36:18 -04:00
parent 0b6979f97e
commit 7de28e17eb
5 changed files with 256 additions and 33 deletions

View file

@ -1,2 +0,0 @@
*.dtsi linguist-language=C++
*.keymap linguist-language=C++

View file

@ -10,11 +10,21 @@ streamlined syntax. Check out [example.keymap](example.keymap) to see it in acti
## Usage overview
1. Copy the file `helper.h` from this repository into the "config" folder of your
private zmk-config repository
1. Copy this repository into the root folder of your private zmk-config repository. The
folder structure should look as follows:
```
zmk-config
├── config
│ ├── your.keyboard.conf
│ ├── your_keyboard.keymap
│ └── ...
├── zmk-nodefree-config
│ ├── helper.h
│ ├── ...
```
2. Source `helper.h` near the top of your `.keymap` file:
```C++
#include "helper.h"
#include "../zmk-nodefree-config/helper.h"
```
3. Customize your keyboard's `.keymap` file. See [example.keymap](example.keymap) or [my
personal zmk-config](https://github.com/urob/zmk-config/blob/main/config/base.keymap)
@ -22,19 +32,31 @@ streamlined syntax. Check out [example.keymap](example.keymap) to see it in acti
## Usage details
`helper.h` provides two convenience macros. `ZMK_BEHAVIOR` creates new behaviors, and
`ZMK_LAYER` adds new layers to your keymap.
This repository provides a number of convenience macros:
1. `ZMK_BEHAVIOR` can be used to create new behaviors such as hold-taps, tap-dances or
ZMK macros [\[doc\]](#zmk_behavior)
2. `ZMK_LAYER` adds new layers to your keymap [\[doc\]](#zmk_layer)
3. `ZMK_COMBO` defines new combos [\[doc\]](#zmk_combo)
4. `ZMK_UNICODE_SINGLE` and `ZMK_UNICODE_PAIR` create unicode characters [\[doc\]](#zmk_unicode)
5. `international_chars` define a number of international character definitions such
as <kbd>ä</kbd>/<kbd>Ä</kbd> or <kbd>δ</kbd>/<kbd>Δ</kbd> that can be added to the keymap
[\[doc\]](#international-characters)
6. `keypos_def` sets up human-readable key position shortcuts for a number of popular
keyboards that simplify the configuration of combos and positional hold-taps
[\[doc\]](#key-position-shortcuts)
### ZMK\_BEHAVIOR
The macro is invoked by calling `ZMK_BEHAVIOR(name, type, specification)`, expecting
3 arguments:
* `name` is a unique string chosen by the user (e.g., `my_behavior`). It can later be
used to reference the new behavior by preceding it by "&" (e.g., `&my_behavior`)
* `type` selects the behavior that is created. It must be one of the following:
`ZMK_BEHAVIOR` can be used to create any of the following ZMK behaviors: caps-word,
hold-tap, key-repeat, macro, mod-morph, sticky-key or tap-dance
**Syntax:** `ZMK_BEHAVIOR(name, type, specification)`
* `name`: a unique string chosen by the user (e.g., `my_behavior`). The new behavior can
be added to the keymap using `&name` (e.g., `&my_behavior`)
* `type`: the behavior to be created. It must be one of the following:
`caps_word`, `hold_tap`, `key_repeat`, `macro`, `mod_morph`, `sticky_key` or
`tap_dance`. Note that two-word types use underscores ("\_") to separate words.
* `specification` contains the code customizing the new behavior. It should contain the
`tap_dance`. Note that two-word types are separated by underscores (`_`).
* `specification`: the custom behavior code. It should contain the
body of the corresponding [ZMK behavior configuration](https://zmk.dev/docs/config/behaviors)
without the `label`, `#binding-cells` and `compatible` properties and without the
surrounding node-specification.
@ -82,13 +104,14 @@ This creates a "Windows sleep key" that can be added to the keymap-layout using
### ZMK\_LAYER
The function is invoked by calling `ZMK_LAYER(name, layout)`, expecting
2 arguments:
* `name` is a unique identifier string chosen by the user (it isn't used elsewhere)
* `layout` provides the layout specification using the same syntax as the `bindings`
`ZMK_LAYER` adds new keymap layers to the configuration.
**Syntax:** `ZMK_LAYER(name, layout)`
* `name`: a unique identifier string chosen by the user (usually this isn't referenced elsewhere)
* `layout`: the layout specification using the same syntax as the `bindings`
property of the [ZMK keymap configuration](https://zmk.dev/docs/config/keymap)
Multiple layers can be defined with repeated calls of `ZMK_LAYER`. They will be ordered
Multiple layers can be added with repeated calls of `ZMK_LAYER`. They will be ordered
in the same order in which they are created, with the first-specified layer being
the "lowest" one ([see here for details](https://zmk.dev/docs/features/keymaps#layers)).
@ -108,3 +131,183 @@ ZMK_KEYMAP(default_layer,
```
### ZMK\_COMBO
`ZMK_COMBO` defines new combos.
**Syntax:** `ZMK_COMBO(name, bindings, keypos, layers)`
* `name`: a unique identifier string chosen by the user (usually this isn't referenced elsewhere)
* `binding`: the binding triggered by the combo (this can be any stock or previously defined behavior)
* `keypos`: a list of 2 or more key positions that trigger the combo (e.g., `12
13`). Note that the mapping from key positions to keys depends on your keyboard. To facilitate
the combo set-up and increase portability, this repository provides shortcuts for a number of popular keyboard.
See [below](#key-position-shortcuts) on how to use them.
* `layers`: a list of layers for which the combo is active (e.g., `0` for only the
default layer). If set to `ALL` the combo is active on all layers.
By default, the timeout for combos created with `ZMK_COMBO` is 30ms. If `COMBO_TERM` is
set prior to calling `ZMK_COMBO`, the value of `COMBO_TERM` is used instead. Note: while
it is possible to set different timeout for different combos, this is known to cause
[issues](https://github.com/zmkfirmware/zmk/issues/905) with overlapping combos and should be avoided.
#### Example: copy and paste combos
```C++
#define COMBO_TERM 50
ZMK_COMBO(copy, &kp LC(C), 12 13, 0 1)
ZMK_COMBO(paste, &kp LC(V), 13 14, 0 1)
```
This sets the combo timeout to 50ms, and then creates two combos which both are
active on the first two layers (layers 0 and 1). The first combo is triggered when the
12th and 13th keys are pressed jointly within the `COMBO_TERM`, sending <kbd>Ctrl</kbd> + <kbd>C</kbd>. The
second combo is triggered when the 13th and 14th keys are pressed jointly, sending
<kbd>Ctrl</kbd> + <kbd>V</kbd>.
### ZMK\_UNICODE
This repository provides two macros that simplify creating new unicode characters that
can be added to keymaps. `ZMK_UNICODE_SINGLE` creates single unicode characters such
as <kbd></kbd>, whereas `ZMK_UNICODE_PAIR` creates pairs of shifted/unshifted unicode
characters that are useful for specifying international characters such as
<kbd>ä</kbd>/<kbd>Ä</kbd> or <kbd>δ</kbd>/<kbd>Δ</kbd>.
Note that the input of unicode characters differs across operation systems. By default,
`ZMK_UNICODE` is configured for Windows (using WinCompose). The easiest way to set up unicode
characters for other operation systems is to set the variable `HOST_OS` **before**
sourcing `helper.h`. For Linux use:
```C++
#define HOST_OS 1 // set to 1 for Linux
#include helper.h
```
For macOS use:
```C++
#define HOST_OS 2 // set to 2 for macOS
#include helper.h
```
This will send unicode characters using the OS's default input channels.
For non-default input channels or for other operation systems, one can instead set the
variables `OS_UNICODE_LEAD` and `OS_UNICODE_TRAIL` to the character sequences that
initialize/terminate the unicode input.
**Syntax:** `ZMK_UNICODE_SINGLE(name, L0, L1, L2, L3)`
* `name:` a unique string chosen by the user (e.g., `my_char`). The unicode character can
be added to the keymap using `&name` (e.g., `&my_char`)
* `L0` to `L3`: a 4-digit sequence defining the unicode string using standard [ZMK key
codes](https://zmk.dev/docs/codes/keyboard-keypad)
**Syntax:** `ZMK_UNICODE_PAIR(name, L0, L1, L2, L3, U0, U1, U2, U3)`
* `name:` a unique string chosen by the user (e.g., `my_char`). The unicode character can
be added to the keymap using `&name` (e.g., `&my_char`)
* `L0` to `L3`: a 4-digit sequence defining the unshifted unicode string
* `U0` to `U3`: a 4-digit sequence defining the shifted unicode string (which is send when
holding <kbd>Shift</kbd> while pressing <kbd>&name</kbd>)
Note: 5-digit unicode characters are currently not supported.
#### Example 1: Euro sign (U+20AC)
```C++
ZMK_UNICODE_SINGLE(euro_sign, N2, N0, A, C)
```
The Euro character can be added to the keymap using `&euro_sign`.
#### Example 2: German umlauts (ä/Ä, ö/Ö, ü/Ü)
```C++
// name unshifted shifted
ZMK_UNICODE_PAIR( ae, N0, N0, E, N4, N0, N0, C, N4 )
ZMK_UNICODE_PAIR( oe, N0, N0, F, N6, N0, N0, D, N6 )
ZMK_UNICODE_PAIR( ue, N0, N0, F, C, N0, N0, D, C )
```
The "umlaut"-pairs can be added to the keymap using `&ae`, `&oe` and `&ue`.
#### Dependencies for unicodes
* `ZMK_UNICODE_PAIR` requires a ZMK version patched with
[PR#1114](https://github.com/zmkfirmware/zmk/pull/1114) (not needed when only using
`ZMK_UNICODE_SINGLE`). If you don't want to maintain
your own ZMK repository, you can use ZMK's [beta
testing](https://zmk.dev/docs/features/beta-testing) feature to configure Github
Actions to build against a patched remote branch of ZMK. To do so, replace the
contents of `west.yml` in your local `zmk-config/config` directory with the following
contents:
```
manifest:
remotes:
- name: urob
url-base: https://github.com/urob
projects:
- name: zmk
remote: urob
revision: masked-mods
import: app/west.yml
self:
path: config
```
* Depending on the operation system there are addition requirements for unicode input to
work. On Windows, one must install
[WinCompose](https://github.com/samhocevar/wincompose). On macOS one must enable
unicode input in the system preferences.
### International characters
This repository includes pre-defined definitions for international characters for a few
languages (currently German and Greek --- contributions are welcome 😀!). These can be
loaded by sourcing the corresponding files.
```C++
#include "../zmk-nodefree-config/international_chars/greek.dtsi"
#include "../zmk-nodefree-config/international_chars/german.dtsi"
```
These files make use of unicode in the background, please see the unicode documentation
above for prerequisites. Once sourced Greek and German characters can be added to the
keymap using, e.g., `&alpha`, `&upsilon`, `&tau` or `&omikron` (see the language files for
a complete list of available characters).
### Key position shortcuts
Certain configuration options such as combos and positional hold-taps are based on the
physical position of keys on your keyboard. This reduces portability of configuration
files across keyboards with different layouts.
To increase portability, this repository comes with key position definitions for a
number of popular keyboard layouts (48-key boards such as Planck, 42-key boards such as Corne,
36-key boards and 34-key boards --- new contributions are welcome 😀!).
These layouts provide a map from the physical key positions to human-readable shortcuts
such as "LT0" and "LT1" for the left-hand's top-row's first and second keys.
In general, all shortcuts are of the following form:
* `L/R` for **L**eft/**R**ight hand
* `T/M/B/H` for **T**op/**M**iddle/**B**ottom and t**H**umb row.
* `0/1/2/3/4` for the finger position starting from the inside (`0` is the inner
index-finger column, `1` is the home position of the index finger, ..., `4` is the home
position of the pinkie)
For instance, the shortcuts layout for a 36-key board looks as follows:
```
╭─────────────────────┬─────────────────────╮
│ LT4 LT3 LT2 LT1 LT0 │ RT0 RT1 RT2 RT3 RT4 │
│ LM4 LM3 LM2 LM1 LM0 │ RM0 RM1 RM2 RM3 RM4 │
│ LB4 LB3 LB2 LB1 LB0 │ RB0 RB1 RB2 RB3 RB4 │
╰───────╮ LH2 LH1 LH0 │ RH0 RH1 RH2 ╭───────╯
╰─────────────┴─────────────╯
```
Schematics to all of the layout files can be found inside the corresponding definition
files.
To use these shortcut definitions, source the definition file for your keyboard
into your `.keymap` file. E.g., for a 36-key board, use:
```C++
#include "../zmk-nodefree-config/keypos_def/keypos_36keys.h"
```
#### Example: Defining combos using key position shortcuts
```C++
ZMK_COMBO(copy, &kp LC(C), LH1 LM2, 0 1)
ZMK_COMBO(paste, &kp LC(V), LH1 LM1, 0 1)
```
This would define "copy"-combo on the home positions of the left thumb + the left middle finger,
and it would defined a "paste"-combo on the home positions of the left thumb + the left
index finger.

View file

@ -1,6 +1,9 @@
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include "helper.h"
#include "../zmk-nodefree-config/helper.h"
#include "../zmk-nodefree-config/keypos_def/keypos_36keys.h"
#include "../zmk-nodefree-config/international_chars/german.dtsi"
/* layer and key shortcuts */
@ -10,7 +13,7 @@
#define NAV 1
#define NUM 2
/* custom keys and macros */
/* custom behaviors */
// homerow mods
ZMK_BEHAVIOR(hrm, hold_tap,
@ -33,13 +36,31 @@ ZMK_BEHAVIOR(bs_del_num, mod_morph,
mods = <(MOD_LSFT|MOD_RSFT)>;
)
// windows sleep key
// windows sleep macro
ZMK_BEHAVIOR(win_sleep, macro,
wait-ms = <100>;
tap-ms = <5>;
bindings = <&kp LG(X) &kp U &kp S>;
)
/* combos */
// use timeout of 40ms (omitting the option yields default of 30ms)
#define COMBO_TERM 40
// combo for our custom sleep behavior from above, only active on NAV layer
ZMK_COMBO(combo_sleep, &win_sleep, RT3 RT4, NAV)
// copy and paste combos, active on all layers
ZMK_COMBO(combo_copy, &kp LC(C), LB2 LB3, ALL)
ZMK_COMBO(combo_paste, &kp LC(V), LB1 LB2, ALL)
// german umlauts on right thumb + letter, only active on default layer
ZMK_COMBO(combo_ae, &ae, RH1 LM4, DEF)
ZMK_COMBO(combo_oe, &oe, RH1 RM4, DEF)
ZMK_COMBO(combo_ue, &oe, RH1 RT2, DEF)
ZMK_COMBO(combo_eszett, &eszett, RH1 LM2, DEF)
/* keymap */
ZMK_LAYER(default_layer,
@ -62,7 +83,7 @@ ZMK_LAYER(nav_layer,
// ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤
___ ___ ___ ___ ___ ___ &kp LC(X) &kp LC(INS) &kp LS(INS) ___
// ╰─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤
___ ___ ___ ___ &win_sleep ___
___ ___ ___ ___ ___ ___
// ╰─────────────┴──── ────────┴─────────────╯ ╰─────────────┴─────────────┴─────────────╯
)

View file

@ -49,7 +49,7 @@
#define COMBO_TERM 30
#endif
#define COMBO(name, combo_bindings, keypos, combo_layers) \
#define ZMK_COMBO(name, combo_bindings, keypos, combo_layers) \
/ { \
combos { \
compatible = "zmk,combos"; \
@ -64,22 +64,22 @@
/* ZMK_UNICODE */
#if !defined OS_COMBO_LEAD
#if !defined OS_UNICODE_LEAD
#if HOST_OS == 2
// OSx
#define OS_UNICODE_LEAD &macro_press &kp LALT // macOS
#elif HOST_OS == 1
// Linux
#define OS_UNICODE_LEAD &kp LS(LC(U)) // Linux
#else
#define OS_COMBO_LEAD &kp RALT &kp U // Windows + WinCompose (default)
#define OS_UNICODE_LEAD &kp RALT &kp U // Windows + WinCompose (default)
#endif
#endif
#if !defined OS_COMBO_TRAIL
#if !defined OS_UNICODE_TRAIL
#if HOST_OS == 2
// OSx
#define OS_UNICODE_TRAIL &macro_release &kp LALT // macOS
#elif HOST_OS == 1
// Linux
#define OS_UNICODE_TRAIL &kp SPACE // Linux
#else
#define OS_COMBO_TRAIL &kp RET // Windows + WinCompose (default)
#define OS_UNICODE_TRAIL &kp RET // Windows + WinCompose (default)
#endif
#endif
@ -92,7 +92,7 @@
wait-ms = <0>; \
tap-ms = <1>; \
#binding-cells = <0>; \
bindings = <OS_COMBO_LEAD>, <unicode_bindings>, <OS_COMBO_TRAIL>; \
bindings = <OS_UNICODE_LEAD>, <unicode_bindings>, <OS_UNICODE_TRAIL>; \
}; \
}; \
};

View file

@ -13,6 +13,7 @@ ZMK_UNICODE_PAIR( lambda, N0, N3, B, B, N0, N3, N9, B)
ZMK_UNICODE_PAIR( mu, N0, N3, B, C, N0, N3, N9, C)
ZMK_UNICODE_PAIR( nu, N0, N3, B, D, N0, N3, N9, D)
ZMK_UNICODE_PAIR( xi, N0, N3, B, E, N0, N3, N9, E)
ZMK_UNICODE_PAIR( omikron, N0, N3, B, F, N0, N3, N9, F)
ZMK_UNICODE_PAIR( pi, N0, N3, C, N0, N0, N3, A, N0)
ZMK_UNICODE_PAIR( rho, N0, N3, C, N1, N0, N3, A, N1)
ZMK_UNICODE_PAIR( sigma, N0, N3, C, N3, N0, N3, A, N3)