Chapter 08

Espanso もどき

AWtnb
AWtnb
2021.12.30に更新

https://espanso.org/

Espanso というテキストエキスパンダーを真似してみようと思ったのです。

config.py
    keymap_global["U1-X"] = keymap.defineMultiStrokeKeymap("Pseudo-Espanso:")

    def pseudo_espanso(trigger_key, prompt, key_mapping, func):
        keymap_global["U1-X"][trigger_key] = keymap.defineMultiStrokeKeymap(prompt)
        for key, args in key_mapping.items():
            keymap_global["U1-X"][trigger_key][key] = func(*args)

pseudo_espanso() にトリガーとなるキー、トリガーキーが押されたときに表示されるポップアップ内容、呼び出したい関数、最後に押すキーと関数に渡す引数のペアを渡してやります。

たとえば下記の設定で 変換+XHD の順にキーを押すと <div class=""></div> が入力されます。

config.py
    for params in [
        {
            "trigger_key": "F",
            "prompt": "Filler: G=>GETA-MARK, 0=>CIRCLE, C-0=>WHITE-CIRCLE, 4=>SQUARE, MINUS=>Tilda",
            "key_mapping": {
                "G": ["\u3013\u3013"],
                "0": ["\u25CF\u25CF"],
                "C-0": ["\u25CB\u25CB"],
                "4": ["\u25A0\u25A0"],
                "Minus": ["\uFF5E\uFF5E"],
            },
        },
        {
            "trigger_key": "M",
            "prompt": "MARKDOWN:",
            "key_mapping": {
                "1": ["# "],
                "2": ["## "],
                "3": ["### "],
                "4": ["#### "],
                "5": ["##### "],
                "6": ["###### "],
                "I": ["![img]()", "Left"],
                "L": ["[]()", "Left"],
            },
        },
        {
            "trigger_key": "H",
            "prompt": "HTML-TAG:",
            "key_mapping": {
                "D": ["<div class=\"\"></div>"],
                "S": ["<span class=\"\"></span>"],
            },
        },
        {
            "trigger_key": "X",
            "prompt": "EXTENSION:",
            "key_mapping": {
                "T": [".txt"],
                "M": [".md"],
                "C": [".css"],
                "H": [".html"],
            },
        },
    ]:
        pseudo_espanso(**params, func=non_ime_typing)

下記のように貼り付け用の関数を作ってやると複数行の貼り付けなどもできます。

config.py
    def join_lines_and_paste(*lines):
        def _paster():
            paste_string("\n".join(lines))
        return _paster

    pseudo_espanso(
        trigger_key="C-M",
        prompt="MULTILINES:",
        key_mapping={
            "3": [
                    "################################",
                    "# ",
                    "################################",
                ],
        },
        func=join_lines_and_paste
    )