MacBook日文键盘四种输入模式输入法切换(同样适用于其他布局的键盘)

前言

以前买了个日文键盘的MacBook,日文键盘与中文键盘布局差别不小,不过适应了之后发现其实日文键盘用起来比普通键盘布局更加舒服。而且比普通键盘多了两个输入法切换键,最近就再考虑把这两个键利用起来。

工具

Karabiner-Elements

方法

日文键盘比普通键盘多了“英数”和“かな”键,前者将输入法强制切换到英文,后者强制切换到平假名。由于我主要使用中文输入法和Dvorak布局的英文键盘,偶尔使用日文输入法和qwerty布局,使用这两个键可以很方便地进行四种输入模式的切换,如下所示:
  • 英数 -> Dvorak
  • fn+英数 -> qwerty
  • かな-> 中文
  • fn+かな -> 日文
通过编写配置文件即可。值得注意的是切换到日文的部分我并没有直接使用切换语言的api,而是将fn+かな直接映射为かな键,这与后文提到的macOS的bug有关。

问题与Walkaround

  • macOS有个历史悠久的bug是输入法切换api在cjk之间互相切换时输入法指示器显示已切换却无法使用该输入法,解决方法是切换为英文输入法后再切换到前一个输入法(可以在karabiner-elements里面自动实现)。
  •  输入法切换为英文时不会像之前按英数键一样自动将输入一半的内容直接提交为英文,而是出现一个不会消失的输入法框。解决方案是使karabiner-elements先触发一次英数键后再切换键盘布局。
  • 使用上述walkaround之后输入法切换不够稳定,有的时候可能切换不到中文输入法或有的时候かな键变成了切换为日文。解决方法是将按一次键触发的多个动作中最后一个动作延迟触发,比如我使英数键或かな键弹起时触发最后一个动作。
  • 如果没有在karabiner-elements里面专门设置键盘布局的话默认会按照美式布局进行映射,会发现各别日文独有的按键没识别到,不要忘记设置好。

总结:

输入法的切换存在两种方式,有状态和无状态。有状态即默认的使用caps lock在两种输入模式之间转换,而无状态是不论当前处于何种输入模式直接切换到指定输入模式。无状态切换更省心,既不需要每回都去看输入法指示器,也不会忘记切换输入法而导致需要删掉使用错误输入法打的字。我发现我的博文能解决的问题实在是小众得不能更小众,以汉语为母语的dvorak键盘布局与日文键盘使用者应该很不多见吧。

附录:

karabiner-elements 配置文件:
{
    "global": {
        "check_for_updates_on_startup": false,
        "show_in_menu_bar": false,
        "show_profile_name_in_menu_bar": false
    },
    "profiles": [
        {
            "complex_modifications": {
                "parameters": {
                    "basic.simultaneous_threshold_milliseconds": 50,
                    "basic.to_delayed_action_delay_milliseconds": 500,
                    "basic.to_if_alone_timeout_milliseconds": 1000,
                    "basic.to_if_held_down_threshold_milliseconds": 500,
                    "mouse_motion_to_scroll.speed": 100
                },
                "rules": [
                    {
                        "description": "Input Method Switcher",
                        "manipulators": [
                            {
                                "from": {
                                    "key_code": "japanese_eisuu"
                                },
                                "to": [
                                    {
                                        "key_code": "japanese_eisuu"
                                    },
                                    {
                                        "select_input_source": {
                                            "input_source_id": "com.apple.keylayout.Dvorak"
                                        }
                                    }
                                ],
                                "type": "basic"
                            },
                            {
                                "from": {
                                    "key_code": "japanese_eisuu",
                                    "modifiers": {
                                        "mandatory": [
                                            "fn"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "japanese_eisuu"
                                    },
                                    {
                                        "select_input_source": {
                                            "input_source_id": "com.apple.keylayout.ABC"
                                        }
                                    }
                                ],
                                "type": "basic"
                            },
                            {
                                "from": {
                                    "key_code": "japanese_kana"
                                },
                                "to": [
                                    {
                                        "select_input_source": {
                                            "language": "zh-Hans"
                                        }
                                    },
                                    {
                                        "hold_down_milliseconds": 200,
                                        "key_code": "caps_lock"
                                    },
                                    {
                                        "key_code": "vk_none"
                                    },
                                    {
                                        "hold_down_milliseconds": 200,
                                        "key_code": "caps_lock"
                                    },
                                    {
                                        "key_code": "vk_none"
                                    }
                                ],
                                "type": "basic"
                            },
                            {
                                "from": {
                                    "key_code": "japanese_kana",
                                    "modifiers": {
                                        "mandatory": [
                                            "fn"
                                        ],
                                        "optional": [
                                            "any"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "japanese_kana"
                                    }
                                ],
                                "type": "basic"
                            }
                        ]
                    }
                ]
            },
            "devices": [],
            "fn_function_keys": [
                {
                    "from": {
                        "key_code": "f1"
                    },
                    "to": {
                        "consumer_key_code": "display_brightness_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f2"
                    },
                    "to": {
                        "consumer_key_code": "display_brightness_increment"
                    }
                },
                {
                    "from": {
                        "key_code": "f3"
                    },
                    "to": {
                        "key_code": "mission_control"
                    }
                },
                {
                    "from": {
                        "key_code": "f4"
                    },
                    "to": {
                        "key_code": "launchpad"
                    }
                },
                {
                    "from": {
                        "key_code": "f5"
                    },
                    "to": {
                        "key_code": "illumination_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f6"
                    },
                    "to": {
                        "key_code": "illumination_increment"
                    }
                },
                {
                    "from": {
                        "key_code": "f7"
                    },
                    "to": {
                        "consumer_key_code": "rewind"
                    }
                },
                {
                    "from": {
                        "key_code": "f8"
                    },
                    "to": {
                        "consumer_key_code": "play_or_pause"
                    }
                },
                {
                    "from": {
                        "key_code": "f9"
                    },
                    "to": {
                        "consumer_key_code": "fastforward"
                    }
                },
                {
                    "from": {
                        "key_code": "f10"
                    },
                    "to": {
                        "consumer_key_code": "mute"
                    }
                },
                {
                    "from": {
                        "key_code": "f11"
                    },
                    "to": {
                        "consumer_key_code": "volume_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f12"
                    },
                    "to": {
                        "consumer_key_code": "volume_increment"
                    }
                }
            ],
            "name": "Default profile",
            "parameters": {
                "delay_milliseconds_before_open_device": 1000
            },
            "selected": false,
            "simple_modifications": [],
            "virtual_hid_keyboard": {
                "country_code": 2,
                "mouse_key_xy_scale": 100
            }
        }
    ]
}

评论

此博客中的热门博文

Flash被淘汰后打开swf文件的最佳方法

[SOLVED] Supermicro cannot connect to VGA video port or iKVM