다음은 qmk에서 키보드 배열 레이어 전환시, 날개셋 입력기의 한영 입력 모드도 동시에 함께 전환되도록 하는 코드입니다.
// ...(전략)..
// qmk 키맵 레이어 값 정의
#define _ALPHA 0 // ALPHABET LAYER
// ...(중간 생략)..
#define _SYMB 5 // SYMBOL LAYER
// ...(후략)..
// 날개셋 한영 입력 모드 전환 함수 : 특수기호의 입력 일관성을 위해 날개셋 한영 입력 모드 전환을 위한 단축글쇠를 입력한다.
void for_nalgaeset_symbol_consistency_on(void) {
wait_ms(10);
register_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT));
tap_code(KC_RALT);
unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT));
clear_mods();
clear_oneshot_mods();
wait_ms(10);
}
void for_nalgaeset_symbol_consistency_off(void) {
wait_ms(10);
register_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT));
tap_code(KC_RALT);
unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT));
clear_mods();
clear_oneshot_mods();
wait_ms(10);
}
// ..(키맵 함수 등 생략)
// 전역 변수 정의 : 후술할 레이어 상태 처리 함수를 위한
uint8_t current_layer = 0;
uint8_t last_layer = 0;
// 레이어 상태 처리 함수 : qmk 레이어 전환 시마다 앞서 미리 정의한 날개셋 한영 입력 모드 전환 함수들을 불러오도록 한다.
layer_state_t layer_state_set_user(layer_state_t state) {
current_layer = get_highest_layer(state);
// qmk 레이어 전환 조건에 따라 적합한 날개셋 한영 입력 모드 전환 함수 불러오기
if (last_layer != _SYMB && current_layer == _SYMB) {
for_nalgaeset_symbol_consistency_on();
} else if (last_layer == _SYMB && current_layer != _SYMB) {
for_nalgaeset_symbol_consistency_off();
}
last_layer = current_layer;
return state;
}
// ..(후략)..
qmk에는 layer_state_set_user 함수가 있어서 qmk 레이어 전환 시마다 날개셋 입력 모드 전환 함수를 동시에 함께 처리하도록 할 수 있습니다. qmk의 키맵 레이아웃 설정 부분에서 symbol 레이어를 별도로 하나 만들어서 symbol 레이어에 숫자와 특수기호 키들을 다 몰아넣은 다음에, symbol 레이어로 전환할때마다 날개셋의 기본 베이스 입력 모드도 0으로 함께 전환시키고 symbol 레이어에서 다른 레이어로 다시 빠져나올때마다 날개셋 입력 모드도 도로 원복시키면 특수기호 입력의 일관성 문제를 안정적으로 해결할 수 있습니다.
위 코드를 말로 설명하자면, layer_state_set_user 함수를 써서 symbol 레이어로 전환할때는 for_nalgaeset_symbol_consistency_on 함수를 실행하고, symbol 레이어에서 다른 레이어로 빠져나올때는 for_nalgaeset_symbol_consistency_off 함수를 실행하도록 해놓았습니다. for_nalgaeset_symbol_consistency_on 함수는 ctrl+shift+right alt을 입력하는 함수이고, void for_nalgaeset_symbol_consistency_off 함수는 win(gui)+ctrl+shift+right alt를 입력하는 함수입니다.(기타 버벅임 등을 방지하기 위해 clear mods 등을 추가로 넣었습니다)
날개셋 제어판에서는 ctrl+shift+right alt을 입력하면 0 입력 모드로 가고, win(gui)+ctrl+shift+right alt을 입력하면 A==0 ? C : A 계산식에 따라 0 입력 모드가 아닐때는 입력 모드를 건드리지 말고 그대로 두고, 0 입력 모드일때는 도로 이전 입력 모드로 회귀하도록 해놓았습니다. 즉, 0 입력 모드는 가장 기본 입력 모드로 symbol 레이어의 숫자와 특수기호를 이 입력 모드에서 처리합니다. 그리고 symbol 레이어를 빠져나가면 도로 이전 입력 모드로 회귀하게끔 합니다. (날개셋 편집기의 도구 - 날개셋 제어판 - 편집기 계층 - 단축 글쇠에서 이런 설정을 할 수 있습니다.)
제 경우엔 날개셋 입력 모드들을
0 : symbol 입력을 위한 가장 기본 입력 모드
1 : 영문 qwerty
2 : 한글 표준 두벌식
3 : 영문 aptv3
4 : 한글 제가 만들어놓은 제 커스텀 배열
이렇게 만들어놓았습니다. symbol을 입력할 때만 0 입력 모드로 잠깐 들렀다 나오도록 한 거죠.
(도구 - 날개셋 제어판 - 입력기 계층에서 이런 입력 모드들을 설정해놓았습니다)
입력 모드 전환을 위한 단축글쇠는
글쇠 : 용도 : 계산식
lctrl+lshift+한영 : 전환 : 0
lctrl+lshift+lwin+한영 : 전환 : A==0 ? C : A
한영 : 전환 : A==3 ? 4 : 3
lshift+한영 : 전환 : 1
lctrl+한영 : 전환 : 2
lshift+lwin+한영 : 전환 : 3
lctrl+lwin+한영 : 전환 : 4
한자 : 입력 : C0|0x82
(도구 - 날개셋 제어판 - 편집기 계층 - 단축글쇠에서 설정)
(여기에서 PC/AT 101키 호환 키보드/USB 키보드 (종류 1) 기준, 한영 키는 right alt, 한자 키는 right ctrl입니다)
---------------------------------------------
zmk 사용자를 위해)
저는 zmk를 사용하지 않아 zmk에서는 어떻게 구현하는지 잘 모르지만, claude에 물어봤더니 claude가 아래와 같이 답하더군요. zmk 사용자들에게 참고가 되길 바랍니다. 아래의 코드를 적당히 수정해서 사용하면 되지 않을까 싶습니다.
위의 QMK 코드를 ZMK로 변환하면 다음과 같습니다:
// 날개셋 기호 일관성 매크로 정의
/ {
macros {
nalgaeset_on: nalgaeset_on {
compatible = "zmk,behavior-macro";
#binding-cells = <0>;
bindings
= <¯o_pause_for_release>
, <¯o_press &kp LCTRL &kp LSHFT>
, <¯o_tap &kp RALT>
, <¯o_release &kp LCTRL &kp LSHFT>
, <¯o_pause_for_release>
;
};
nalgaeset_off: nalgaeset_off {
compatible = "zmk,behavior-macro";
#binding-cells = <0>;
bindings
= <¯o_pause_for_release>
, <¯o_press &kp LGUI &kp LCTRL &kp LSHFT>
, <¯o_tap &kp RALT>
, <¯o_release &kp LGUI &kp LCTRL &kp LSHFT>
, <¯o_pause_for_release>
;
};
};
};
그리고 레이어 변경 시 자동으로 매크로를 실행하려면, ZMK의 on-press/on-release 동작을 사용하거나, 레이어 토글 키에 매크로를 연결해야 합니다:
// keymap 정의 예시
keymap {
compatible = "zmk,keymap";
// 기본 레이어
default_layer {
bindings =
// ... 다른 키들 ...
&mo SYMB // SYMB 레이어로 전환
>;
};
// SYMB 레이어 (on-press로 매크로 실행)
symb_layer {
bindings =
// ... SYMB 레이어의 키들 ...
&trans
>;
// 레이어 진입 시 매크로 실행
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
};
};
주요 차이점:
1. wait_ms() → ZMK에서는 <¯o_pause_for_release> 사용
2. register/unregister_mods() → <¯o_press>와 <¯o_release> 사용
3. layer_state_set_user() → ZMK는 직접적인 레이어 콜백이 없으므로, 레이어 전환 키에 매크로를 바인딩하거나 별도의 동작 구현 필요
한계사항: ZMK는 QMK의 layer_state_set_user() 같은 자동 레이어 변경 감지 함수가 없습니다. 따라서 레이어 전환 키를 누를 때 매크로를 함께 실행하도록 설정해야 합니다.
첫댓글 우와 대단하십니다
qmk 되는 스플릿 키보드랑 날개셋이랑 같이 쓰려다 보니 이런 코드를 개발하게 되었습니다. 높게 평가해주셔서 감사합니다.
정말 감사합니다 한 번 적용해보겠습니다
zmk을 직접 쓰지는 않지만 그래도 qmk 쓰는 입장에서 이 글이 도움이 되지 않을까 싶어 글을 써봤습니다.