Chapter 12

クリップボードメニュー

AWtnb
AWtnb
2021.12.30に更新

keymap.command_ClipboardList を割り当てたキーを押すとクリップボード履歴のウィンドウが開きます。

公式の サンプル を参考に、keymap.cblisters にタプルを追加していくことでポップアップメニューの内容をカスタムできます。

言わずもがなメニュー内容に対して割り当てるのは 関数 でなくてはいけないので、まずは下記のような感じでクロージャを生成する関数を作成します。

config.py

    # 関数を受け取り、現在のクリップボード内容をその引数に与えて実行する関数を返す
    def format_cb(func):
        def _format():
            cb = get_current_clipboard()
            if cb:
                return func(cb)
        return _format

    # 現在のクリップボード内容に対して正規表現で文字列置換をする関数を返す
    def replace_cb(search, replace_to):
        reg = re.compile(search)
        def _replacer():
            cb = get_current_clipboard()
            if cb:
                return reg.sub(replace_to, cb)
        return _replacer

メニュー選択以降の処理は、

処理の流れ
メニュー選択
↓
割り当てられた関数が実行される
↓
実行結果がクリップボードに格納される
↓
ペースト操作が実行される

という流れなので、割り当てる関数は最終的に貼り付けたい文字列を返すようにします。

config.py

    FULLWIDTH_LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
    HALFWIDTH_LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
    def toHalfWidth(s):
        return s.translate(str.maketrans(FULLWIDTH_LETTERS, HALFWIDTH_LETTERS))
    def toFullWidth(s):
        return s.translate(str.maketrans(HALFWIDTH_LETTERS, FULLWIDTH_LETTERS))

    def decode_url(encoded):
        decoded = urllib.parse.unquote(encoded)
        return decoded

あとは keymap.cblisters に登録していきます。

config.py

    menu_configure = [
        (" Reload config.py ", keymap.command_ReloadConfig),
        (" Edit config.py ", keymap.command_EditConfig),
        ("--------------- EXIT ---------------", lambda : None),
    ]
    menu_transform_clipboard_item = [
        (" A-Z0-9: to FullWidth ", format_cb(toFullWidth) ),
        (" A-Z0-9: to HalfWidth ", format_cb(toHalfWidth) ),
        (" A-Z: to lowercase ", lambda : get_current_clipboard().lower() ),
        (" A-Z: to UPPERCASE ", lambda : get_current_clipboard().upper() ),
        (" Comma: to Japanese-style ", replace_cb(r"\uFF0C", "\u3001") ),
        (" Comma: to Official-style ", replace_cb(r"\u3001", "\uFF0C") ),
        (" Quote mark: to Double ", replace_cb("'", '"') ),
        (" Quote mark: to Single ", replace_cb('"', "'") ),
        ("--------------- EXIT ---------------", lambda : None),
    ]
    menu_format_clipboard_item = [
        (" As single-line ", replace_cb(r"\r?\n", "") ),
        (" As single-line without whitespace ", replace_cb(r"\s", "") ),
        (" Decode URL ", format_cb(decode_url) ),
        (" Remove empty line ", replace_cb(r"(?m)^(\r?\n)", "") ),
        (" Remove inside parenthesis ", replace_cb(r"[(\(].+?[)\)]", "") ),
        (" Remove quote mark ", replace_cb(r"[\"']", "") ),
        (" Shorten Amazon-URL ", replace_cb(r"^.+amazon\.co\.jp/.+dp/(.{10}).*", "https://www.amazon.jp/dp/\\1") ),
        ("--------------- EXIT ---------------", lambda : None),
    ]
    keymap.cblisters += [
        ("Configure", cblister_FixedPhrase(menu_configure)),
        ("Transform -> Paste" , cblister_FixedPhrase(menu_transform_clipboard_item)),
        ("Format -> Paste" , cblister_FixedPhrase(menu_format_clipboard_item)),
    ]