やっとヒューマンライツを回復することができました。
いま、私は、自分が思った通りにタイピングできる喜びと、あの長く、辛い日々を噛み締めながら、この記事を書いています。
macOS Sierra 10.12.4
Karabiner-Elements 0.91.4
ベータ版なので、使用は自己責任でお願いします。故障・損害などに関しては一切の責任を負いかねます。また、今後仕様が変更されて、下の設定では動かない可能性もあります。
##Karabiner-Elementsとは
macOS Sierra用の、キーボードのマッピングをカスタマイズできるアプリケーション。
OSXにはKarabiner(もっと以前はKeyRemap4MacBooという名前でした)というアプリケーションがあるのですが、新しいmacOS Sierraでは正常に動作しません。
Karabinerでかなりキーボードをカスタマイズしているにも関わらず、Sierraに対応しているかちゃんと確認せずにアップグレードしてしまった、私のような生きる価値もない人間は、当然人権を剥奪され、長く、辛い日々を強いられることになったのです。
代替になりそうなアプリケーションを漁りまくり、結局はBetterTouchToolとKarabiner-ElementsのSimple Modificationsの組み合わせで、不完全ながらなんとか凌いでいました。
自分で書いてPRを送ろうかとも思いましたが、コードを追うのもそれなりに大変ですし、私のクソコードでは...という気持ちもあり、また、他の方のPRに対しても開発者様の応答がなかったようなので、座して待つしかないと思い、寄付だけしときました。
##One-to-oneマッピング
-
Karabiner-Elementsのインストール
usage/READMEを見てください。 -
キーボードを選択
Karabiner-Elementsを起動。Preferences...
を選択。Virtual Keyboard
タブへ行き、キーボードがJIS(キーボードにアルファベットとひらがなが書かれているもの)ならKeyboard type
でJIS
を選択。USキーボードならANSI
を選択。 -
GUIでマッピングしてみる
Simple Modifications
のタブへ行き、Add item
を押し、左のドロップダウンからマッピングを変えたいキーを選択。右のドロップダウンからどのキーへマッピングしたいか選択。例えば、左Shift
キーをa
に変えたければ、左のドロップダウンはleft_shift
、右のドロップダウンはa
を選択。これで左Shiftを押すと、a
が入力されるようになります。
キーボードの名前がわからない場合、Karabiner-EventViewerがKarabiner-Elementsと一緒にインストールされているはずなので、起動して、そこで当該キーを押してみると、キーの名前などがわかります。
##設定ファイルを見る
-
設定ファイルを開く
~/.config/karabiner/
配下にある、karabiner.json
というファイルを開く。なかったら作る。 -
プロファイル
キーマッピングの設定のセットは、profile
と呼ばれ、いくつも登録し、切替もできます。例えば、default
という名前のprofileを設定をしてみます。"simple_modifications"
のところには、Simple Modificationsのところで設定したものが表示されているはずです。
Karabinerでは、設定ファイルを変更したらリロードする必要がありましたが、Karabiner-Elementsでは、設定ファイルを保存するとすぐリロードされるようです。
{
"global": {
"check_for_updates_on_startup": true,
"show_in_menu_bar": true,
"show_profile_name_in_menu_bar": false
},
"profiles": [
{
"name": "default",
"selected": true,
"devices": [],
"fn_function_keys": {
"f1": "display_brightness_decrement",
"f2": "display_brightness_increment",
"f3": "mission_control",
"f4": "launchpad",
"f5": "f5",
"f6": "illumination_increment",
"f7": "rewind",
"f8": "play_or_pause",
"f9": "fastforward",
"f10": "mute",
"f11": "volume_decrement",
"f12": "volume_increment"
},
"simple_modifications": {
"backslash": "quote",
"caps_lock": "vk_none",
"international1": "semicolon",
"quote": "delete_or_backspace",
"right_shift": "vk_none",
"semicolon": "return_or_enter"
},
"virtual_hid_keyboard": {
"caps_lock_delay_milliseconds": 0,
"keyboard_type": "jis"
}
}
]
}
##One-to-many, Many-to-oneマッピング
-
ベータ版(2017年6月23日現在)へアップデート
時間が経てばベータではなく、製品版のほうで利用できるようになると思うので、アップデート情報はチェックされると良いと思います。
Preferences... -> Misc -> Check for beta updates
-
"complex_modifications"
を追加
今回できるようになったのは、この部分です。例えば、英数キーが単体で押されたときには、普段通り、英数への切替、a
と組み合わせて押されたときには1
を入力する、みたいなことができます。先程のdefault
プロファイルの"simple_modifications"
と同じ階層に"complex_modifications"
を作ります。
{
"complex_modifications": {
"rules": [
{
"manipulators": [
{ "mapping goes here": "hello" }
]
}
]
},
"name": "default",
"selected": true,
"devices": [],
"fn_function_keys": {
"f1": "display_brightness_decrement",
"f2": "display_brightness_increment",
"f3": "mission_control",
"f4": "launchpad",
"f5": "f5",
"f6": "illumination_increment",
"f7": "rewind",
"f8": "play_or_pause",
"f9": "fastforward",
"f10": "mute",
"f11": "volume_decrement",
"f12": "volume_increment"
},
"simple_modifications": {
"backslash": "quote",
"caps_lock": "vk_none",
"international1": "semicolon",
"quote": "delete_or_backspace",
"right_shift": "vk_none",
"semicolon": "return_or_enter"
},
"virtual_hid_keyboard": {
"caps_lock_delay_milliseconds": 0,
"keyboard_type": "jis"
}
}
3 設定例
設定の仕方は、examplesと、このPRでのこのコメント以下が参考になりました。
- spacebar単体 -> spacebar; 別のキーとの組み合わせ -> left_shift
{ "type": "basic",
"from": { "key_code": "spacebar", "modifiers": { "optional": [ "any" ] } },
"to": [ { "key_code": "left_shift" } ],
"to_if_alone": [ { "key_code": "spacebar" } ] }
- left_shift -> 英数, escape
{ "type": "basic",
"from": { "key_code": "left_shift",
"modifiers": { "optional": [ "caps_lock" ] } },
"to": [ { "key_code": "lang2" },
{ "key_code": "escape" } ] }
- left_control + h -> 左カーソル移動
{ "type": "basic",
"from": { "key_code": "h",
"modifiers": {
"mandatory": [ "left_control" ],
"optional": [ "caps_lock" ] } },
"to": [ { "key_code": "left_arrow" } ] }
- 英数単体 -> 英数; 英数 + a -> 1
{ "type": "basic",
"from": { "key_code": "lang2",
"modifiers": { "optional": [ "any" ] } },
"to": [ { "key_code": "left_command",
"modifiers": [ "left_shift", "left_option" ] } ],
"to_if_alone": [ { "key_code": "lang2" } ] },
{ "type": "basic",
"from": { "key_code": "a",
"modifiers": {
"mandatory": [ "left_command", "left_shift", "left_option" ],
"optional": [ "caps_lock" ] } },
"to": [ { "key_code": "1" } ] }
とりあえず書いた設定ファイルの全体は以下のような感じです。JISキーボード用の設定なので、ANSIキーボードで同じことをしようと思ったら、設定が少し異なるはずです。
{
"global": {
"check_for_updates_on_startup": true,
"show_in_menu_bar": true,
"show_profile_name_in_menu_bar": false
},
"profiles": [
{
"complex_modifications": {
"rules": [
{
"manipulators": [
{
"description": "left_shift -> eisuu, esc",
"from": {
"key_code": "left_shift"
},
"to": [
{
"key_code": "lang2"
},
{
"key_code": "escape"
}
],
"type": "basic"
},
{
"description": "kana -> right_hyper | kana",
"from": {
"key_code": "lang1",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_command",
"modifiers": [
"right_shift",
"right_option"
]
}
],
"to_if_alone": [
{
"key_code": "lang1"
}
],
"type": "basic"
},
{
"description": "eisuu -> left_hyper | eisuu",
"from": {
"key_code": "lang2",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_command",
"modifiers": [
"left_shift",
"left_option"
]
}
],
"to_if_alone": [
{
"key_code": "lang2"
}
],
"type": "basic"
},
{
"description": "spacebar -> left_shift | spacebar",
"from": {
"key_code": "spacebar",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_shift"
}
],
"to_if_alone": [
{
"key_code": "spacebar"
}
],
"type": "basic"
},
{
"description": "eisuu + a -> 1",
"from": {
"key_code": "a",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "1"
}
],
"type": "basic"
},
{
"description": "kana + a -> !",
"from": {
"key_code": "a",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "1",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + s -> 2",
"from": {
"key_code": "s",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "2"
}
],
"type": "basic"
},
{
"description": "kana + s -> \"",
"from": {
"key_code": "s",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "2",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + d -> 3",
"from": {
"key_code": "d",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "3"
}
],
"type": "basic"
},
{
"description": "kana + d -> #",
"from": {
"key_code": "d",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "3",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + f -> 4",
"from": {
"key_code": "f",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "4"
}
],
"type": "basic"
},
{
"description": "kana + f -> $",
"from": {
"key_code": "f",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "4",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + g -> 5",
"from": {
"key_code": "g",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "5"
}
],
"type": "basic"
},
{
"description": "kana + g -> %",
"from": {
"key_code": "g",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "5",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + h -> 6",
"from": {
"key_code": "h",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "6"
}
],
"type": "basic"
},
{
"description": "kana + h -> &",
"from": {
"key_code": "h",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "6",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + j -> 7",
"from": {
"key_code": "j",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "7"
}
],
"type": "basic"
},
{
"description": "kana + j -> '",
"from": {
"key_code": "j",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "7",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + k -> 8",
"from": {
"key_code": "k",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "8"
}
],
"type": "basic"
},
{
"description": "kana + k -> (",
"from": {
"key_code": "k",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "8",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + l -> 9",
"from": {
"key_code": "l",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "9"
}
],
"type": "basic"
},
{
"description": "kana + l -> )",
"from": {
"key_code": "l",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "9",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + o -> 0",
"from": {
"key_code": "o",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "0"
}
],
"type": "basic"
},
{
"description": "eisuu + b -> [",
"from": {
"key_code": "b",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "close_bracket"
}
],
"type": "basic"
},
{
"description": "kana + b -> {",
"from": {
"key_code": "b",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "close_bracket",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + n -> ]",
"from": {
"key_code": "n",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "backslash"
}
],
"type": "basic"
},
{
"description": "kana + n -> }",
"from": {
"key_code": "n",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "backslash",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + c -> :",
"from": {
"key_code": "c",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "quote"
}
],
"type": "basic"
},
{
"description": "kana + c -> ;",
"from": {
"key_code": "c",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "semicolon"
}
],
"type": "basic"
},
{
"description": "kana + e -> =",
"from": {
"key_code": "e",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "hyphen",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "kana + p -> ^",
"from": {
"key_code": "p",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "equal_sign"
}
],
"type": "basic"
},
{
"description": "eisuu + p -> +",
"from": {
"key_code": "p",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "semicolon",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "kana + m -> *",
"from": {
"key_code": "m",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "quote",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "eisuu + m -> -",
"from": {
"key_code": "m",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "hyphen"
}
],
"type": "basic"
},
{
"description": "kana + u -> _",
"from": {
"key_code": "u",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "international1"
}
],
"type": "basic"
},
{
"description": "eisuu + y -> ¥",
"from": {
"key_code": "y",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "y",
"modifiers": [
"left_option"
]
}
],
"type": "basic"
},
{
"description": "kana + y -> |",
"from": {
"key_code": "y",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "international3",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "kana + / -> \\",
"from": {
"key_code": "slash",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "international3",
"modifiers": [
"left_option"
]
}
],
"type": "basic"
},
{
"description": "kana + . -> >",
"from": {
"key_code": "period",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "period",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "kana + , -> <",
"from": {
"key_code": "comma",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "comma",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "kana + t -> ~",
"from": {
"key_code": "t",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "equal_sign",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "left_option + / -> ¡",
"from": {
"key_code": "slash",
"modifiers": {
"mandatory": [
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "1",
"modifiers": [
"left_option"
]
}
],
"type": "basic"
},
{
"description": "eisuu + ] -> «",
"from": {
"key_code": "quote",
"modifiers": {
"mandatory": [
"left_command",
"left_shift",
"left_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "backslash",
"modifiers": [
"left_option"
]
}
],
"type": "basic"
},
{
"description": "kana + ] -> »",
"from": {
"key_code": "quote",
"modifiers": {
"mandatory": [
"right_command",
"right_shift",
"right_option"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "backslash",
"modifiers": [
"left_option",
"left_shift"
]
}
],
"type": "basic"
},
{
"description": "left_control + h -> left_arrow",
"from": {
"key_code": "h",
"modifiers": {
"mandatory": [
"left_control"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"description": "left_control + j -> down_arrow",
"from": {
"key_code": "j",
"modifiers": {
"mandatory": [
"left_control"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"description": "left_control + k -> up_arrow",
"from": {
"key_code": "k",
"modifiers": {
"mandatory": [
"left_control"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"description": "left_control + l -> right_arrow",
"from": {
"key_code": "l",
"modifiers": {
"mandatory": [
"left_control"
],
"optional": [
"caps_lock"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
]
},
"devices": [],
"fn_function_keys": {
"f1": "display_brightness_decrement",
"f10": "mute",
"f11": "volume_decrement",
"f12": "volume_increment",
"f2": "display_brightness_increment",
"f3": "mission_control",
"f4": "launchpad",
"f5": "f5",
"f6": "illumination_increment",
"f7": "rewind",
"f8": "play_or_pause",
"f9": "fastforward"
},
"name": "default",
"selected": true,
"simple_modifications": {
"caps_lock": "vk_none",
"international1": "semicolon",
"international3": "quote",
"quote": "delete_or_backspace",
"right_shift": "vk_none",
"semicolon": "return_or_enter"
},
"virtual_hid_keyboard": {
"caps_lock_delay_milliseconds": 0,
"keyboard_type": "jis"
}
}
]
}
##あとは言語の設定キー
私はフランス語とロシア語も高頻度で使うので、以前のKarabinerではできていた、言語の切替や言語ごとのキーボード設定がKarabiner-Elementsだけでできるようになれば最高です。
とにかく、私、いま、とっても幸せです!
参考:
https://github.com/tekezo/Karabiner-Elements
https://github.com/tekezo/Karabiner-Elements/blob/master/usage/README.md
https://github.com/tekezo/Karabiner-Elements/tree/master/examples
https://github.com/tekezo/Karabiner-Elements/pull/247