Chapter 10

選択した文字列でウェブ検索

AWtnb
AWtnb
2021.12.30に更新

Autohotkey でよくサンプルとして出てくる、選択した文字列でのウェブ検索を keyhac でも実装してみました。

config.py

    # 検索のノイズになりそうな記号類・句読点を指定する正規表現をコンパイルしておく
    REG_PUNCTUATIONS = re.compile("[{}]+".format("".join([
        # halfwidth symbols
        r"\u0021-\u002F",
        r"\u003A-\u0040",
        r"\u005B-\u0060",
        r"\u007B-\u007E",
        # quotation marks
        r"\u2018-\u201F",
        # horizontal bars
        r"\u2010-\u2017",
        r"\u2500\u2501",
        r"\u2E3A\u2E3B",
        # fullwidth symbols
        r"\u3000-\u3004",
        r"\u3008-\u3011",
        r"\u3013-\u303F",
        r"\u30FB",
        r"\uFF01-\uFF0F",
        r"\uFF1A-\uFF20",
        r"\uFF3B-\uFF40",
        r"\uFF5B-\uFF65",
        # Kangxi Radicals
        r"\u2F00-\u2FD5",
        # CJK Radicals
        r"\u2E80-\u2EF3"
    ])))
    REG_HIRAGANAS = re.compile(r"[ぁ-ん]+")
    REG_SPACES = re.compile(r"\s+")

    # 正規表現を指定して半角スペースに変換する
    def to_space(reg_to_replace, s):
        return reg_to_replace.sub(" ", s)

    # 各語を二重引用符で囲んでキーワード検索できるようにする
    def quote_each_word(s):
        quoted = []
        for w in to_space(REG_SPACES, s).split(" "):
            if w:
                quoted.append('"{}"'.format(w))
        return " ".join(quoted)

    # 余計なスペースを取り除く
    def remove_extra_space(s):
        return REG_SPACES.sub(" ", s).strip()

    # クロージャを生成する
    def search_on_web(uri, verbatim=False, removeHiragana=False):
        def _search():
            s = copy_string(0.05)
            query = to_space(REG_PUNCTUATIONS, s)
            if removeHiragana:
                query = to_space(REG_HIRAGANAS, query)
            if verbatim:
                query = quote_each_word(query)
            encoded = urllib.parse.quote(remove_extra_space(query))
            execute_path(uri.format(encoded))
        return _search

無変換とSを押してから続けてキーを押すことで指定のエンジンで検索します。

  • 記号類は自動で半角スペースに変換
  • 無変換とSを押すときにどの修飾キーを押しているかで検索方式を変える
    • Shift:キーワード検索
    • Ctrl:ひらがなを消して検索

割り当てには下記のようにループを使っています。

config.py

    for mdf, params in {
        "": (False, False),
        "S-": (True, False),
        "C-": (False, True),
        "S-C-": (True, True),
    }.items():
        keymap_global[mdf+"U0-S"] = keymap.defineMultiStrokeKeymap("verbatim:{} / hiragana-removal:{}".format(*params))
        for key, uri in {
            "A": "https://www.amazon.co.jp/s?i=stripbooks&k={}",
            "G": "http://www.google.co.jp/search?q={}",
            "I": "https://www.google.com/search?tbm=isch&q={}",
            "J": "https://eow.alc.co.jp/search?q={}",
            "S": "https://scholar.google.co.jp/scholar?q={}",
            "W": "https://www.worldcat.org/search?q={}",
        }.items():
            keymap_global[mdf+"U0-S"][key] = search_on_web(uri, *params)