|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2020 The ZMK Contributors |
| 2 | + * Copyright (c) 2024 Allister MacLeod |
3 | 3 | *
|
4 | 4 | * SPDX-License-Identifier: MIT
|
5 | 5 | */
|
6 | 6 |
|
7 | 7 | #include <behaviors.dtsi>
|
8 |
| -#include <dt-bindings/zmk/keys.h> |
9 | 8 | #include <dt-bindings/zmk/bt.h>
|
| 9 | +#include <dt-bindings/zmk/keys.h> |
| 10 | + |
| 11 | + |
| 12 | +#define DEFAULT 0 |
| 13 | +#define HD_NEU 0 |
| 14 | +#define HD_GOLD 1 |
| 15 | +#define DVORAK 2 |
| 16 | +#define COLEMAK 3 |
| 17 | +#define QWERTY 4 |
| 18 | +#define CANARY 5 |
| 19 | +#define STURDY 6 |
| 20 | +#define SYMBOLS 7 |
| 21 | +#define NAV 8 |
| 22 | +#define NUMPAD 9 |
| 23 | +#define NUMLOCK 10 |
| 24 | +#define NUMTEMP 11 |
| 25 | +#define BTOOTH 12 |
| 26 | +#define LAYOUTS 13 |
| 27 | + |
| 28 | +// Keycode definitions by thumb, to hopefully make swapping easier. |
| 29 | +#define LTHUMB BACKSPACE |
| 30 | +#define RTHUMB SPACE |
| 31 | + |
| 32 | +// Home row mods settings; history notes below: |
| 33 | +// - fast tapping term of 100 feels too fast |
| 34 | +// - in Dvorak, al roll sometimes comes out as L, and so roll as O, also as as S |
| 35 | +// - maybe Callum-style sticky mods are the way to go after all? |
| 36 | +// - what about mod-tap shift space on the big thumb keys? would have to get used to backspace on a layer, but that might be okay |
| 37 | +#define HM_TAPPING_TERM 200 |
| 38 | +#define HM_TAPPING_TERM_FAST 175 |
| 39 | +#define HM_PRIOR_IDLE 125 |
| 40 | +#define HM_QUICK_TAP 150 |
| 41 | + |
| 42 | +// Key groups for cross-hand hold trigger definitions. |
| 43 | +#define KEYS_LEFT 0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 |
| 44 | +#define KEYS_RIGHT 5 6 7 8 9 15 16 17 18 19 25 26 27 28 29 |
| 45 | +#define KEYS_THUMB 30 31 32 33 34 35 |
| 46 | + |
| 47 | + |
| 48 | +// Things to try next: |
| 49 | +// - mod-tap home row mods (shift on home row pinkies to start), preferably with quiet time to prevent delayed keypresses |
| 50 | +// - better handling of adaptive keys in Hands Down Gold; maybe tap-dance is not the best way to handle Z and Q |
| 51 | +// - experiment with different sticky keys durations |
| 52 | +// - try spacebar on the right thumb to see if it feels any more natural |
| 53 | +// - more ctrl-* combos in nav layer, or maybe a dedicated hotkey layer: ^S save, ^T new tab, ^R reload, etc. |
10 | 54 |
|
11 | 55 | / {
|
12 |
| - keymap { |
13 |
| - compatible = "zmk,keymap"; |
14 |
| - |
15 |
| - default_layer { |
16 |
| -// ----------------------------------------------------------------------------------------- |
17 |
| -// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | |
18 |
| -// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | |
19 |
| -// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | |
20 |
| -// | GUI | LWR | SPC | | ENT | RSE | ALT | |
21 |
| - bindings = < |
22 |
| - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC |
23 |
| - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT |
24 |
| - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC |
25 |
| - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT |
26 |
| - >; |
27 |
| - }; |
28 |
| - lower_layer { |
29 |
| -// ----------------------------------------------------------------------------------------- |
30 |
| -// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | |
31 |
| -// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | |
32 |
| -// | SHFT | | | | | | | | | | | | | |
33 |
| -// | GUI | | SPC | | ENT | | ALT | |
34 |
| - bindings = < |
35 |
| - &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC |
36 |
| - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans |
37 |
| - &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
38 |
| - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT |
39 |
| - >; |
40 |
| - }; |
41 |
| - |
42 |
| - raise_layer { |
43 |
| -// ----------------------------------------------------------------------------------------- |
44 |
| -// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | |
45 |
| -// | CTRL | | | | | | | - | = | [ | ] | \ | ` | |
46 |
| -// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | |
47 |
| -// | GUI | | SPC | | ENT | | ALT | |
48 |
| - bindings = < |
49 |
| - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp BSPC |
50 |
| - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE |
51 |
| - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE |
52 |
| - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT |
53 |
| - >; |
54 |
| - }; |
55 |
| - }; |
| 56 | +chosen { zmk,matrix_transform = &five_column_transform; }; |
| 57 | + |
| 58 | +behaviors { |
| 59 | + tdjz: tap_dance_jz { |
| 60 | + compatible = "zmk,behavior-tap-dance"; |
| 61 | + #binding-cells = <0>; |
| 62 | + bindings = <&kp J>, <&kp Z>; |
| 63 | + }; |
| 64 | + tdgq: tap_dance_gq { |
| 65 | + compatible = "zmk,behavior-tap-dance"; |
| 66 | + #binding-cells = <0>; |
| 67 | + bindings = <&kp G>, <&kp Q>; |
| 68 | + }; |
| 69 | + tdesclay: tap_dance_esc_layouts { |
| 70 | + compatible = "zmk,behavior-tap-dance"; |
| 71 | + #binding-cells = <0>; |
| 72 | + tapping-term-ms = <200>; |
| 73 | + bindings = <&kp ESC>, <&to LAYOUTS>; |
| 74 | + }; |
| 75 | + // Positional home-row shift; uses fast tapping term |
| 76 | + hsl: homerow_mods_shift_left { |
| 77 | + compatible = "zmk,behavior-hold-tap"; |
| 78 | + #binding-cells = <2>; |
| 79 | + bindings = <&kp>, <&kp>; |
| 80 | + flavor = "tap-unless-interrupted"; |
| 81 | + tapping-term-ms = <HM_TAPPING_TERM_FAST>; |
| 82 | + quick-tap-ms = <HM_QUICK_TAP>; |
| 83 | + require-prior-idle-ms = <HM_PRIOR_IDLE>; |
| 84 | + hold-trigger-key-positions = <KEYS_RIGHT KEYS_THUMB>; |
| 85 | + }; |
| 86 | + hsr: homerow_mods_shift_right { |
| 87 | + compatible = "zmk,behavior-hold-tap"; |
| 88 | + #binding-cells = <2>; |
| 89 | + bindings = <&kp>, <&kp>; |
| 90 | + flavor = "tap-unless-interrupted"; |
| 91 | + tapping-term-ms = <HM_TAPPING_TERM_FAST>; |
| 92 | + quick-tap-ms = <HM_QUICK_TAP>; |
| 93 | + require-prior-idle-ms = <HM_PRIOR_IDLE>; |
| 94 | + hold-trigger-key-positions = <KEYS_LEFT KEYS_THUMB>; |
| 95 | + }; |
| 96 | +}; |
| 97 | + |
| 98 | +conditional_layers { |
| 99 | + compatible = "zmk,conditional-layers"; |
| 100 | + numeric_momentary { |
| 101 | + if-layers = <NUMTEMP>; |
| 102 | + then-layer = <NUMPAD>; |
| 103 | + }; |
| 104 | + numeric_lock { |
| 105 | + if-layers = <NUMLOCK>; |
| 106 | + then-layer = <NUMPAD>; |
| 107 | + }; |
| 108 | +}; |
| 109 | + |
| 110 | +keymap { |
| 111 | + compatible = "zmk,keymap"; |
| 112 | + |
| 113 | + hands_down_neu_layer { |
| 114 | +// ,-----------------------------. ,-----------------------------. |
| 115 | +// | W | F | M | P | V | | / | . | Q | Z | J | |
| 116 | +// | R | S | N | T | B | | , | A | E | I | H | |
| 117 | +// | X | C | L | D | G | | - | U | O | Y | K | |
| 118 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 119 | + bindings = < |
| 120 | + &kp W &kp F &kp M &kp P &kp V &kp FSLH &kp DOT &kp Q &kp Z &kp J |
| 121 | + &hsl LSHIFT R &kp S &kp N &kp T &kp B &kp COMMA &kp A &kp E &kp I &hsr RSHIFT H |
| 122 | + &kp X &kp C &kp L &kp D &kp G &kp MINUS &kp U &kp O &kp Y &kp K |
| 123 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 124 | + >; |
| 125 | + }; |
| 126 | + |
| 127 | + hands_down_gold_layer { |
| 128 | +// ,-----------------------------. ,-----------------------------. |
| 129 | +// | J z | G q | M | P | V | | ; | . | / | " | ' | |
| 130 | +// | R | S | N | D | B | | , | A | E | I | H | |
| 131 | +// | X | F | L | C | W | | - | U | O | Y | K | |
| 132 | +// `-----------| Esc | SYM | T | | Bks | NAV | Tab |-----------' |
| 133 | + bindings = < |
| 134 | + &tdjz &tdgq &kp M &kp P &kp V &kp SEMI &kp DOT &kp FSLH &kp DQT &kp SQT |
| 135 | + &hsl LSHIFT R &kp S &kp N &kp D &kp B &kp COMMA &kp A &kp E &kp I &hsr RSHIFT H |
| 136 | + &kp X &kp F &kp L &kp C &kp W &kp MINUS &kp U &kp O &kp Y &kp K |
| 137 | + &tdesclay &sl SYMBOLS &kp T &kp SPACE &sl NAV &kp TAB |
| 138 | + >; |
| 139 | + }; |
| 140 | + |
| 141 | + dvorak_layer { |
| 142 | +// ,-----------------------------. ,-----------------------------. |
| 143 | +// | ' | , | . | P | Y | | F | G | C | R | L | |
| 144 | +// | A | O | E | U | I | | D | H | T | N | S | |
| 145 | +// | ; | Q | J | K | X | | B | M | W | V | Z | |
| 146 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 147 | + bindings = < |
| 148 | + &kp SQT &kp COMMA &kp DOT &kp P &kp Y &kp F &kp G &kp C &kp R &kp L |
| 149 | + &hsl LSHIFT A &kp O &kp E &kp U &kp I &kp D &kp H &kp T &kp N &hsr RSHIFT S |
| 150 | + &kp SEMI &kp Q &kp J &kp K &kp X &kp B &kp M &kp W &kp V &kp Z |
| 151 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 152 | + >; |
| 153 | + }; |
| 154 | + |
| 155 | + colemakdh_layer { |
| 156 | +// ,-----------------------------. ,-----------------------------. |
| 157 | +// | Q | W | F | P | B | | J | L | U | Y | ' | |
| 158 | +// | A | R | S | T | G | | M | N | E | I | O | |
| 159 | +// | Z | X | C | D | V | | K | H | , | . | / | |
| 160 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 161 | + bindings = < |
| 162 | + &kp Q &kp W &kp F &kp P &kp B &kp J &kp L &kp U &kp Y &kp SQT |
| 163 | + &hsl LSHIFT A &kp R &kp S &kp T &kp G &kp M &kp N &kp E &kp I &hsr RSHIFT O |
| 164 | + &kp Z &kp X &kp C &kp D &kp V &kp K &kp H &kp COMMA &kp DOT &kp FSLH |
| 165 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 166 | + >; |
| 167 | + }; |
| 168 | + |
| 169 | + qwerty_layer { |
| 170 | +// ,-----------------------------. ,-----------------------------. |
| 171 | +// | Q | W | E | R | T | | Y | U | I | O | P | |
| 172 | +// | A | S | D | F | G | | H | J | K | L | ; | |
| 173 | +// | Z | X | C | V | B | | N | M | , | . | / | |
| 174 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 175 | + bindings = < |
| 176 | + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P |
| 177 | + &hsl LSHIFT A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &hsr RSHIFT SEMI |
| 178 | + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH |
| 179 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 180 | + >; |
| 181 | + }; |
| 182 | + |
| 183 | + canary_layer { |
| 184 | +// ,-----------------------------. ,-----------------------------. |
| 185 | +// | W | L | Y | P | B | | Z | F | O | U | ' | |
| 186 | +// | C | R | S | T | G | | M | N | E | I | A | |
| 187 | +// | Q | J | V | D | K | | X | H | / | , | . | |
| 188 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 189 | + bindings = < |
| 190 | + &kp W &kp L &kp Y &kp P &kp B &kp Z &kp F &kp O &kp U &kp SQT |
| 191 | + &hsl LSHIFT C &kp R &kp S &kp T &kp G &kp M &kp N &kp E &kp I &hsr RSHIFT A |
| 192 | + &kp Q &kp J &kp V &kp D &kp K &kp X &kp H &kp FSLH &kp COMMA &kp DOT |
| 193 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 194 | + >; |
| 195 | + }; |
| 196 | + |
| 197 | + sturdy_layer { |
| 198 | +// ,-----------------------------. ,-----------------------------. |
| 199 | +// | V | M | L | C | P | | X | F | O | U | J | |
| 200 | +// | S | T | R | D | Y | | . | N | A | E | I | |
| 201 | +// | Z | K | Q | G | W | | B | H | ' | ; | , | |
| 202 | +// `-----------| Esc | SYM | Bks | | Spc | NAV | Tab |-----------' |
| 203 | + bindings = < |
| 204 | + &kp V &kp M &kp L &kp C &kp P &kp X &kp F &kp O &kp U &kp J |
| 205 | + &hsl LSHIFT S &kp T &kp R &kp D &kp Y &kp DOT &kp N &kp A &kp E &hsr RSHIFT I |
| 206 | + &kp Z &kp K &kp Q &kp G &kp W &kp B &kp H &kp SQT &kp SEMI &kp COMMA |
| 207 | + &tdesclay &sl SYMBOLS &kp LTHUMB &kp RTHUMB &sl NAV &kp TAB |
| 208 | + >; |
| 209 | + }; |
| 210 | + |
| 211 | + symbols_layer { |
| 212 | +// ,-----------------------------. ,-----------------------------. |
| 213 | +// | ` | < | > | " | ' | | & | : | [ | ] | \ | |
| 214 | +// | ! | - | + | = | # | | | | ; | { | } | ? | |
| 215 | +// | ~ | / | * | % | @ | | ^ | $ | ( | ) | / | |
| 216 | +// `-----------|Shift|#####| BAS | | Ent | NUM |Shift|-----------' |
| 217 | + bindings = < |
| 218 | + &kp GRAVE &kp LT &kp GT &kp DQT &kp SQT &kp AMPS &kp COLON &kp LBKT &kp RBKT &kp BSLH |
| 219 | + &kp EXCL &kp MINUS &kp PLUS &kp EQUAL &kp HASH &kp PIPE &kp SEMI &kp LBRC &kp RBRC &kp QMARK |
| 220 | + &kp TILDE &kp SLASH &kp STAR &kp PERCENT &kp AT &kp CARET &kp DOLLAR &kp LPAR &kp RPAR &kp FSLH |
| 221 | + &sk LSHIFT &trans &tog SYMBOLS &kp RET &mo NUMTEMP &sk RSHIFT |
| 222 | + >; |
| 223 | + }; |
| 224 | + |
| 225 | + navigation_layer { |
| 226 | +// ,-----------------------------. ,-----------------------------. |
| 227 | +// | 1 | 2 | 3 | 4 | 5 | | Hom | PgD | Up | PgU | Esc | |
| 228 | +// | 6 | 7 | 8 | 9 | 0 | | End | Left| Down|Right| Bks | |
| 229 | +// | Undo| Cut | Copy|Paste| GUI | | Ins | Ctrl| Del | Alt | Tab | |
| 230 | +// `-----------|Shift| NUM | BAS | | Ent |#####|Shift|-----------' |
| 231 | + bindings = < |
| 232 | + &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp HOME &kp PG_DN &kp UP &kp PG_UP &kp ESC |
| 233 | + &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp END &kp LEFT &kp DOWN &kp RIGHT &kp BSPC |
| 234 | + &kp LC(Z) &kp LC(X) &kp LC(C) &kp LC(V) &sk LGUI &kp INS &sk RCTRL &kp DEL &sk LALT &kp TAB |
| 235 | + &sk LSHIFT &mo NUMTEMP &tog NAV &kp RET &trans &sk RSHIFT |
| 236 | + >; |
| 237 | + }; |
| 238 | + |
| 239 | + numpad_layer { |
| 240 | +// ,-----------------------------. ,------------------------------. |
| 241 | +// | F1 | F2 | F3 | F4 |NumLk| | * | 7 | 8 | 9 | - | |
| 242 | +// | F5 | F6 | F7 | F8 | | | / | 4 | 5 | 6 | + | |
| 243 | +// | F9 | F10 | F11 | F12 | | | 0 | 1 | 2 | 3 | Ent | |
| 244 | +// `-----------| |#####| BAS | | 0 |######| . |-----------' |
| 245 | + bindings = < |
| 246 | + &kp F1 &kp F2 &kp F3 &kp F4 &tog NUMLOCK &kp KP_MULTIPLY &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_SUBTRACT |
| 247 | + &kp F5 &kp F6 &kp F7 &kp F8 &none &kp KP_DIVIDE &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS |
| 248 | + &kp F9 &kp F10 &kp F11 &kp F12 &none &kp KP_N0 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp RETURN2 |
| 249 | + &to BTOOTH &trans &tog NUMLOCK &kp KP_N0 &trans &kp KP_DOT |
| 250 | + >; |
| 251 | + }; |
| 252 | + |
| 253 | + num_temp_layer { |
| 254 | + // Only exists to momentarily activate numpad layer. |
| 255 | + bindings = < |
| 256 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 257 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 258 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 259 | + &trans &trans &trans &trans &trans &trans |
| 260 | + >; |
| 261 | + }; |
| 262 | + |
| 263 | + num_lock_layer { |
| 264 | + // Only exists to toggle numpad layer lock on and off. |
| 265 | + bindings = < |
| 266 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 267 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 268 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 269 | + &trans &trans &trans &trans &trans &trans |
| 270 | + >; |
| 271 | + }; |
| 272 | + |
| 273 | + bluetooth_layer { |
| 274 | +// ,-----------------------------. ,-----------------------------. |
| 275 | +// | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
| 276 | +// | BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
| 277 | +// | | | | | | | | | | | | |
| 278 | +// `-----------| | | | | | | |-----------' |
| 279 | + |
| 280 | + bindings = < |
| 281 | + &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 |
| 282 | + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans |
| 283 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 284 | + &trans &trans &tog BTOOTH &trans &trans &trans |
| 285 | + >; |
| 286 | + }; |
| 287 | + layout_selection_layer { |
| 288 | +// ,-----------------------------. ,-----------------------------. |
| 289 | +// | |HDNeu|Dvork|Clmak| | | | | | | | |
| 290 | +// |QWRTY|HDGld|STRDY|Cnary| | | | | | | | |
| 291 | +// | | | | | | | | | | | | |
| 292 | +// `-----------| | | | | | | |-----------' |
| 293 | + |
| 294 | + bindings = < |
| 295 | + &trans &to HD_NEU &to DVORAK &to COLEMAK &trans &trans &trans &trans &trans &trans |
| 296 | + &to QWERTY &to HD_GOLD &to STURDY &to CANARY &trans &trans &trans &trans &trans &trans |
| 297 | + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans |
| 298 | + &trans &trans &tog LAYOUTS &trans &trans &trans |
| 299 | + >; |
| 300 | + }; |
| 301 | +}; |
| 302 | +// end keymap |
56 | 303 | };
|
0 commit comments