Compare commits

...

9 Commits

6 changed files with 78 additions and 43 deletions

View File

@ -40,7 +40,7 @@ When defining axes for your joystick, you must provide a definition array typica
For instance, the below example configures two axes. The X axis is read from the `A4` pin. With the default axis resolution of 8 bits, the range of values between 900 and 575 are scaled to -127 through 0, and values 575 to 285 are scaled to 0 through 127. The Y axis is configured as a virtual axis, and its value is not read from any pin. Instead, the user must update the axis value programmatically.
```c
joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
joystick_config_t joystick_axes[JOYSTICK_AXIS_COUNT] = {
JOYSTICK_AXIS_IN(A4, 900, 575, 285),
JOYSTICK_AXIS_VIRTUAL
};
@ -64,7 +64,7 @@ The `low` and `high` values can be swapped to effectively invert the axis.
The following example adjusts two virtual axes (X and Y) based on keypad presses, with `KC_P0` as a precision modifier:
```c
joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
joystick_config_t joystick_axes[JOYSTICK_AXIS_COUNT] = {
JOYSTICK_AXIS_VIRTUAL, // x
JOYSTICK_AXIS_VIRTUAL // y
};

View File

@ -53,7 +53,7 @@ There are a number of functions (and variables) related to how you can use or ma
|Function |Description |
|----------------------------------------------|---------------------------------------------------------------------------------------------------------|
| `layer_state_set(layer_mask)` | Directly sets the layer state (recommended, do not use unless you know what you are doing). |
| `layer_state_set(layer_mask)` | Directly sets the layer state (avoid unless you know what you are doing). |
| `layer_clear()` | Clears all layers (turns them all off). |
| `layer_move(layer)` | Turns specified layer on, and all other layers off. |
| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. |
@ -63,7 +63,7 @@ There are a number of functions (and variables) related to how you can use or ma
| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. |
| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. |
| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. |
| `default_layer_set(layer_mask)` | Directly sets the default layer state (recommended, do not use unless you know what you are doing). |
| `default_layer_set(layer_mask)` | Directly sets the default layer state (avoid unless you know what you are doing). |
| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. |
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |

View File

@ -576,7 +576,7 @@ enum rgb_matrix_effects {
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
RGB_MATRIX_PIXEL_FLOW, // Pulsing RGB flow along LED wiring with random hues
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
RGB_MATRIX_DIGITAL_RAIN, // That famous computer simulation
#endif

View File

@ -0,0 +1,14 @@
/*
Set any config.h overrides for your specific keymap here.
See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
*/
#pragma once
// 15, the default, is too low for Kailh Coppers. I get lots of double presses.
// (ba-dum tish)
// #undef DEBOUNCE
// #define DEBOUNCE 22
// Reduce USB power consumption to 100 mA to make it work with a Lightning to USB 3 Camera Adapter (MK0W2AM/A). ZSA says 100 mA is high enough for the keyboard if you disable the big Shine/Glow LEDs first.
#undef USB_MAX_POWER_CONSUMPTION
#define USB_MAX_POWER_CONSUMPTION 100

View File

@ -8,6 +8,23 @@
// Best viewed in Xcode in Menlo Regular or SF Mono.
enum custom_keycodes {
NEWITEM = SAFE_RANGE,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case NEWITEM:
if (record->event.pressed) {
// when keycode NEWITEM is pressed
SEND_STRING("\n- "); // starts a new item in a Markdown-style list
}
// else-clause (for when NEWITEM is released) omitted
break;
}
return true; // the key press we just processed should continue to be processed as normal
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
@ -25,23 +42,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-------------. ,---------------.
* | `~ | '" | | ⎋ | ⌫ |
* ,------|------|------| |------+--------+------.
* | | | PgUp | | PgDn | | |
* | | | L | | R | | |
* | | |------| |------| | |
* | | | R | | R | | |
* | | | L | | R | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(SYMB),
KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(SYMB),
KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI,
KC_LCTL, KC_LALT, KC_LGUI,KC_LEFT,KC_RGHT,
KC_GRV, KC_QUOT,
KC_PGUP,
KC_ENT ,KC_TAB ,KC_RALT,
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, TG(SYMB),
KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(SYMB),
KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI,
KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT,KC_RGHT,
KC_GRV, KC_QUOT,
KC_LALT,
KC_ENT ,KC_TAB ,KC_LCTL,
// right hand
TG(SYMB), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
MO(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
@ -49,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_RGUI, KC_N, KC_M, KC_COMM,KC_DOT, RALT_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_ENT ,
KC_ESC, KC_BSPC,
KC_PGDN,
KC_RALT,
KC_RCTL, KC_TAB, KC_SPC
),
/* Keymap 1: Symbol Layer
@ -59,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | [ | ] | { | } | " | | | | / | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | < | > | ( | ) | ' |------| |------| - | 4 | 5 | 6 | + | |
* | | < | > | ( | ) | ' |------| |------| - | 4 | 5 | 6 | + | `~ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | = | | | | : | 1 | 2 | 3 | = | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
@ -79,7 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_LBRC,KC_RBRC,KC_LCBR,KC_RCBR,KC_DQT ,KC_TRNS,
KC_TRNS,KC_LABK,KC_RABK,KC_LPRN,KC_RPRN,KC_QUOT,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_EQL ,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,NEWITEM,KC_EQL ,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
@ -87,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, KC_GRV,
KC_TRNS, KC_COLN, KC_1, KC_2, KC_3, KC_EQL, KC_TRNS,
KC_0, KC_DOT, KC_LEFT, KC_RGHT, KC_TRNS,
KC_TRNS, KC_TRNS,
@ -97,9 +114,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 2: Media keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F14 | F15 |PrtScr|SclLck| Pause| | | | W | ` | ` | | | Power |
* | | F14 | F15 |PrtScr|SclLck| Pause| | | | W | ` | ` | | | Power |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | PgUp | | | | | | ] | | | | | |
* | | | | PgUp | | | | | | ] | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | Home | PgDn | End | |------| |------| [ | | | | | F16 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
@ -110,29 +127,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | Home | | End | | |
* | | | | | | | |
* | | |------| |------| C | V |
* | | | | | X | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_F14 , KC_F15 , KC_PSCR, KC_SCRL, KC_PAUS, KC_TRNS, /* F14 dims screen, F15 brightens */
KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_HOME,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_F14 , KC_F15 , KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, /* F14 dims screen, F15 brightens */
KC_TRNS, KC_TRNS, LALT(KC_UP), KC_PGUP, LALT(KC_DOWN), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, LGUI(KC_W), LGUI(LSFT(KC_GRV)), LGUI(KC_GRV), KC_TRNS, KC_TRNS, KC_PWR,
KC_TRNS, LGUI(KC_W), LGUI(LSFT(KC_GRV)), LGUI(KC_GRV), KC_TRNS, KC_EJCT, KC_POWER,
KC_TRNS, LGUI(KC_RBRC), LGUI(LALT(KC_UP)), KC_UP , LGUI(LALT(KC_DOWN)), KC_TRNS, KC_TRNS,
LGUI(KC_LBRC), KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_F16 ,
KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_END ,
KC_TRNS,
LGUI(KC_X), LGUI(KC_C), LGUI(KC_V)
),
};
@ -158,5 +175,4 @@ void matrix_scan_user(void) {
// none
break;
}
};

View File

@ -6,12 +6,10 @@ This README refers to two secondary layers: the Media Layer and the Symbol Layer
This layout is tuned for people who…
## use macOS
While this layout works fine in Windows, its not tuned for it. No sane person who primarily uses Windows would put this many Windows keys on a keyboard layout. That said, Print Screen, Scroll Lock, and Pause are available in their usual order on the Media Layer if you need them.
## mouse left-handed while doing other things with the right hand
I tend to have my mouse in my left hand, but I like to use my other hand to make things go faster. Ive added a bunch of buttons to the Media Layer (hold ;) to speed up browsing in applications like Safari and Finder:
@ -29,8 +27,7 @@ I also have a few keys dedicated to window management:
Cut, Copy, and Paste (⌘X, ⌘C, and ⌘V) are also available on the three bottommost right-thumb buttons if you hold ;.
## use lots of modifier keys in OS X menu-item shortcuts
## use lots of modifier keys in macOS menu-item shortcuts
I wanted to preserve the feel of a number of shortcuts that involve pressing lots of modifier keys at once. This is why the bottom left of the keyboard has Shift, Control, Option, and Command in the usual spots. Further Ive added affordances so some key combinations are easier to press with just the right hand.
@ -43,31 +40,39 @@ I also put a second Backspace (⌫) key on the right half of the keyboard to mak
Pressing and holding / will give you Option. This makes a number of keyboard shortcuts easy to press with just the right hand:
- ⌥↑ — Move Line Up
- ⌥↓ — Move Line Down
- ⌥↑ — Move Line Up (in Visual Studio Code)
- ⌥↓ — Move Line Down (in Visual Studio Code)
- ⌥⇧↑ — Copy Line Up / Go To Previous Channel With Unread Messages
- ⌥⇧↓ — Copy Line Down / Go To Next Channel With Unread Messages
## use Emacs-style shortcuts
I press C-a, C-e, and C-k all the time. Its difficult to press these key combinations with the Control key on the far left, so the leftmost thumb button on the right side is another Control key.
I press C-a, C-e, and C-k all the time. Its difficult to press these key combinations with the Control key on the far left, so the innermost thumb buttons are Control keys. Above/inside them are Option keys.
Having trouble remembering which innermost thumb key is Alt and which is Control? The twore like on the lower right of a normal keyboard — leftmost is Alt, rightmost is Control.
## use Visual Studio Code
;-W and ;-R are bound to ⌥↑ and ⌥↓, respectively, for moving lines up and down in Visual Studio Code. In normal macOS applications, theyre used for moving the cursor to the beginning and end of a line, and then on to the previous/next line.
## use spreadsheets
All the common spreadsheet operations (+-*/=) are on the right side of the Symbol Layer. Make-numbers-bigger (+, \*) operations on the right; make-numbers-smaller (-, /) on the left. Theres also a colon there for entering times and maybe IPv6 addresses.
## know the ↑↓←→ fn-key shortcuts for MacBooks
Have you looked at the Page Up, Page Down, Home, and End keys on the EDSF keys and wondered why theyre arranged that way? Theyre arranged the same way as the fn-key shortcuts on an Apple laptops arrow keys. On Apple keyboards with an\* fn key, if you press fn-↑, youll get Page Up; if you press fn-← youll get Home. Similarly, on Zweihander, ;-E is Page Up and ;-S is Home.
## write a fair bit of Markdown
If youre on the second layer (hold/tap one of the four inside middle top keys), the `'` button on the far right is a `\`` key.
If youre on the second layer, pressing `v` will send the string `"\n- "`, not including the quotation marks. This is intended to be a faster way to make a new list item when writing meeting notes in Markdown.
## use Siri
F16, accessed by holding ; and pressing the ' key next to it, is intended for Siri.
## use it with an iPad
This layout overrides `USB_MAX_POWER_CONSUMPTION` to turn it down to 100 mA instead of the default of 500 mA. This is not what you want if your Ergodox EZ has the Shine or Glow lights, but good if you want to be able to plug it into your iPads lightning port with a USB adapter. The indicator lights that tell you what layer youre on are _not_ Shine or Glow lights.
\* I pronounce “fn” as “effin”. Your mileage may vary.