Skip to content

Instantly share code, notes, and snippets.

@swkm
Last active November 14, 2023 11:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save swkm/bb5e738513b56de3403bbcf250378e8a to your computer and use it in GitHub Desktop.
Save swkm/bb5e738513b56de3403bbcf250378e8a to your computer and use it in GitHub Desktop.
QMK Firmware Keychron V2 ansi_encoder用のkeymap

Keychron V2 ノブ付きのキーマップ

Windowsの設定がJISのままUSキーボード通りに打つことができるように、 Winモードの時にUSキーコードをJISキーコードに変換して送ります。

これで会社PCでJIS設定が変えられないケースや リモートPCでJIS設定が変えられないケースでもUSキーボードで打てます。

ファイルは2つ。

  • keymap.c
  • rules.mk

2つのファイルを次のディレクトリに格納する。swkmはキーマップの名前になるので好きな名前をつける。

  • qmk_firmware/keyboards/keychron/v2/ansi_encoder/keymaps/swkm/

格納後のイメージ

  • qmk_firmware/keyboards/keychron/v2/ansi_encoder/keymaps/swkm/keymaps.c
  • qmk_firmware/keyboards/keychron/v2/ansi_encoder/keymaps/swkm/rules.mk

あとはqmkのコンパイル。

keymap.cのポイント

30行目から76行目がUSキーコードをJISキーコードに置き換える機能の実装。

rules.mkのポイント

KEY_OVERRIDE_ENABLEを有効にする必要がある。

/* Copyright 2021 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "keymap_japanese.h"
// clang-format off
enum layers{
MAC_BASE,
WIN_BASE,
_FN1,
_FN2,
_FN3
};
#if defined(KEY_OVERRIDE_ENABLE)
// winモードで us to jis
const key_override_t sft_kc_2_to_jp_at = ko_make_with_layers(MOD_MASK_SHIFT, KC_2, JP_AT, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_6_to_jp_circ = ko_make_with_layers(MOD_MASK_SHIFT, KC_6, JP_CIRC, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_7_to_jp_ampr = ko_make_with_layers(MOD_MASK_SHIFT, KC_7, JP_AMPR, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_8_to_jp_astr = ko_make_with_layers(MOD_MASK_SHIFT, KC_8, JP_ASTR, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_9_to_jp_lprn = ko_make_with_layers(MOD_MASK_SHIFT, KC_9, JP_LPRN, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_0_to_jp_rprn = ko_make_with_layers(MOD_MASK_SHIFT, KC_0, JP_RPRN, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_mins_to_jp_unds = ko_make_with_layers(MOD_MASK_SHIFT, KC_MINS, JP_UNDS, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_eql_to_jp_eql = ko_make_with_layers_and_negmods(0, KC_EQL, JP_EQL, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_eql_to_jp_plus = ko_make_with_layers(MOD_MASK_SHIFT, KC_EQL, JP_PLUS, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_lbrc_to_jp_lbrc = ko_make_with_layers_and_negmods(0, KC_LBRC, JP_LBRC, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_lbrc_to_jp_lcbr = ko_make_with_layers(MOD_MASK_SHIFT, KC_LBRC, JP_LCBR, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_rbrc_to_jp_rbrc = ko_make_with_layers_and_negmods(0, KC_RBRC, JP_RBRC, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_rbrc_to_jp_rcbr = ko_make_with_layers(MOD_MASK_SHIFT, KC_RBRC, JP_RCBR, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_bsls_to_jp_bsls = ko_make_with_layers_and_negmods(0, KC_BSLS, JP_BSLS, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_bsls_to_jp_pipe = ko_make_with_layers(MOD_MASK_SHIFT, KC_BSLS, JP_PIPE, (1<<WIN_BASE | 1<<_FN2));
const key_override_t sft_kc_scln_to_jp_coln = ko_make_with_layers(MOD_MASK_SHIFT, KC_SCLN, JP_COLN, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_quot_to_jp_quot = ko_make_with_layers_and_negmods(0, KC_QUOT, JP_QUOT, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_quot_to_jp_dquo = ko_make_with_layers(MOD_MASK_SHIFT, KC_QUOT, JP_DQUO, (1<<WIN_BASE | 1<<_FN2));
const key_override_t kc_grv_to_jp_grv = ko_make_with_layers_and_negmods(0, KC_GRV, JP_GRV, (1<<WIN_BASE | 1<<_FN2), (uint8_t) MOD_MASK_SHIFT);
const key_override_t sft_kc_grv_to_jp_tild = ko_make_with_layers(MOD_MASK_SHIFT, KC_GRV, JP_TILD, (1<<WIN_BASE | 1<<_FN2));
const key_override_t **key_overrides = (const key_override_t *[]){
&sft_kc_2_to_jp_at
, &sft_kc_6_to_jp_circ
, &sft_kc_7_to_jp_ampr
, &sft_kc_8_to_jp_astr
, &sft_kc_9_to_jp_lprn
, &sft_kc_0_to_jp_rprn
, &sft_kc_mins_to_jp_unds
, &kc_eql_to_jp_eql
, &sft_kc_eql_to_jp_plus
, &kc_lbrc_to_jp_lbrc
, &sft_kc_lbrc_to_jp_lcbr
, &kc_rbrc_to_jp_rbrc
, &sft_kc_rbrc_to_jp_rcbr
, &kc_bsls_to_jp_bsls
, &sft_kc_bsls_to_jp_pipe
, &sft_kc_scln_to_jp_coln
, &kc_quot_to_jp_quot
, &sft_kc_quot_to_jp_dquo
, &kc_grv_to_jp_grv
, &sft_kc_grv_to_jp_tild
, NULL
};
#endif // KEY_OVERRIDE_ENABLE
#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_ansi_67(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, RGB_MOD,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, SCMD(KC_3),
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LOPT, LCMD_T(KC_LNG2), KC_SPC, RCMD_T(KC_LNG1), MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[WIN_BASE] = LAYOUT_ansi_67(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, RGB_MOD,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PSCR,
MO(_FN2),KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LWIN, LALT_T(KC_LNG2), KC_SPC, RALT_T(KC_LNG1), MO(_FN2), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
[_FN1] = LAYOUT_ansi_67(
KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______,
_______, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______,
_______, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______,
_______, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_FN2] = LAYOUT_ansi_67(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, _______,
_______, KC_HOME, KC_NO, KC_DEL, KC_RGHT, KC_NO, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______,
_______, KC_NO, C(KC_X), C(KC_C), C(KC_V), KC_LEFT, KC_DOWN, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT_ansi_67(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
[WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
[_FN1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
[_FN2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)},
[_FN3] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}
};
#endif // ENCODER_MAP_ENABLE
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes
KEY_OVERRIDE_ENABLE = yes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment