Chapter 09

文字入力の効率化

AWtnb
AWtnb
2021.12.30に更新
このチャプターの目次

括弧類

指定したペアの括弧類を自動で入力してその間にカーソルを動かすようにしています。

また、文字列を選択した状態で変換とWを押してからキーストロークをつなげることで選択中のテキストを括弧で囲むこともできます。

config.py

    keymap_global["U1-W"] = keymap.defineMultiStrokeKeymap("Wrap with parenthesis:")

    # 半角括弧で囲んで IME オフ
    for key, pair in {
        "U0-2": '""',
        "U0-7": "''",
        "U0-AtMark": "``",
        "U0-CloseBracket": "[]",
        "U1-9": "()",
        "U1-CloseBracket": "{}",
        "U1-S": "  ",
    }.items():
        keymap_global[key] = non_ime_typing(pair, "Left")
        keymap_global["U1-W"][key] = non_ime_typing("C-C", pair[0], "C-V", pair[1])

    # 全角括弧で囲んで IME オン
    for key, pair in {
        "U0-8": "\u300E\u300F", # WHITE CORNER BRACKET 『』
        "U0-9": "\u3010\u3011", # BLACK LENTICULAR BRACKET 【】
        "U0-OpenBracket": "\u300c\u300d", # CORNER BRACKET 「」
        "U0-Y": "\u3008\u3009", # Angle Bracket 〈〉
        "U1-2": "\u201C\u201D", # DOUBLE QUOTATION MARK “”
        "U1-7": "\u3014\u3015", # TORTOISE SHELL BRACKET 〔〕
        "U1-8": "\uFF08\uFF09", # FULLWIDTH PARENTHESIS ()
        "U1-OpenBracket": "\uFF3B\uFF3D", # FULLWIDTH SQUARE BRACKET []
        "U1-Y": "\u300A\u300B", # Double Angle Bracket 《》
    }.items():
        keymap_global[key] = recover_ime(non_ime_typing(pair, "Left"))
        keymap_global["U1-W"][key] = recover_ime(non_ime_typing("C-C", pair[0], "C-V", pair[1]))

記号の直接入力

句読点など、IME オンでも入力してからさらに変換することがない記号類は入力と同時に確定させてしまいます。

処理の流れ
記号を入力
↓
その時点で IME がオンなら Ctrl-M で確定
↓
必要ならそこで IME をオフにする

最後のステップは、たとえば @ など、後に続けて日本語を入力することがめったに無い記号もあるのでオプションを追加してみました。
Shift キーとの同時押し系は右 Shift との同時押しにすれば通常の入力になる形です。

config.py

    # 関数(クロージャ)を返す関数
    def direct_input(key, turnoff_ime_later=False):
        finish_keys = ["C-M"]
        if turnoff_ime_later:
            finish_keys.append("(243)")
        def _input():
            send_keys(key)
            if keymap.getWindow().getImeStatus():
                send_input(finish_keys)
        return _input

    for key, turnoff_ime in {
        "AtMark": True,
        "Caret": False,
        "CloseBracket": False,
        "Colon": False,
        "Comma": False,
        "LS-AtMark": True,
        "LS-Caret": False,
        "LS-Colon": True,
        "LS-Comma": True,
        "LS-Minus": False,
        "LS-Period": True,
        "LS-SemiColon": False,
        "LS-Slash": False,
        "LS-Yen": True,
        "OpenBracket": False,
        "Period": False,
        "SemiColon": False,
        "Slash": False,
        "Yen": True,
    }.items():
        keymap_global[key] = direct_input(key, turnoff_ime)

    for n in "123456789":
        key = "LS-" + n
        turnoff_ime = False
        if n in ("2", "3", "4"):
            turnoff_ime = True
        keymap_global[key] = direct_input(key, turnoff_ime)

    for alphabet in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        key = "LS-" + alphabet
        keymap_global[key] = direct_input(key, True)

特に最後の、アルファベット大文字を入力すれば自動的にそれ以降の IME がオフになる仕様は個人的なお気に入りです。

また応用で、記号の半角全角の決め打ちもできます。

config.py
    # 半角記号類
    for key, send in {
        "U0-1": "S-1",
        "U0-Colon": "Colon",
        "U0-Comma": "Comma",
        "U0-Period": "Period",
        "U0-Slash": "Slash",
        "U0-U": "S-BackSlash",
        "U1-B": "<br>",
        "U1-Minus": "Minus",
    }.items():
        keymap_global[key] = non_ime_typing(send)

    # 全角記号類
    for key, send in {
        "S-U0-Colon": "\uFF1A", # FULLWIDTH COLON
        "S-U0-Comma": "\uFF0C", # FULLWIDTH COMMA
        "S-U0-Minus": "\u3000\u2015\u2015",
        "S-U0-P": "\uFF1F", # FULLWIDTH QUESTION MARK
        "S-U0-Period": "\uFF0E", # FULLWIDTH FULL STOP
        "S-U0-SemiColon": "\u30FB", # KATAKANA MIDDLE DOT
        "S-U0-U": "S-BackSlash",
        "U0-Minus": "\u2015\u2015", # HORIZONTAL BAR * 2
        "U0-P": "\u30FB", # KATAKANA MIDDLE DOT
        "U0-SemiColon": "+ ",
        "U1-1": "1. ",
    }.items():
        keymap_global[key] = recover_ime(non_ime_typing(send))

日付

その時点のタイムスタンプを自動入力できるようにしています。

config.py
    def input_date(fmt):
        def _input():
            d = datetime.datetime.today()
            date_str = d.strftime(fmt)
            set_ime(0)
            send_input(date_str, 0)
        return _input

    keymap_global["U1-D"] = keymap.defineMultiStrokeKeymap("1=>YMD, 2=>Y/M/D, 3=>Y.M.D, 4=>Y-M-D, 5=>Y年M月D日")
    for key, fmt in {
        "1": "%Y%m%d",
        "2": "%Y/%m/%d",
        "3": "%Y.%m.%d",
        "4": "%Y-%m-%d",
    }.items():
        keymap_global["U1-D"][key] = input_date(fmt)

    def input_date_jp():
        d = datetime.datetime.today()
        recover_ime(non_ime_typing("{}年{}月{}日".format(d.year, d.month, d.day)))()
    keymap_global["U1-D"]["5"] = input_date_jp