AutoHotkeyで辞書や翻訳サービスをサクッと呼び出す(Ctrl+,×2)

先日、「DeepL のデスクトップアプリは Ctrl+C を2回押すだけで翻訳ができる。同様に辞書も検索できないものか」というリクエストをいただきました。

知らない単語や表現に出会ったとき、意味を調べるために、いちいちブラウザを開き、検索して、元の画面に戻る--このプロセスは、思っている以上に集中力を削ります。どうにかしてこの手間を減らしたい。

そこで作ったのが、今回紹介する「どこでも検索・翻訳ショートカット」です。

できること

この仕組みを使うと、次のような操作が可能になります。

  • エディタ、ブラウザ、PDFビューアなどで文字を範囲選択
  • Ctrl+, を素早く2回押す
  • 表示されたメニューから、Webサイトを選んで検索実行

検索先としては、たとえば次のようなものを登録できます。

  1. 辞書サイト(北辞郎、英辞郎、コトバンクなど)
  2. Google
  3. Wikipedia
  4. 翻訳サイト(DeepLなど)

マウスを動かす必要はありません。
キーボード操作だけで、調べたい語句をすぐに確認できます。

AutoHotkeyとは?

今回使っている AutoHotkey(AHK) は、Windowsでショートカットキーや簡単な自動操作を設定できるツールです。

難しいことをしているわけではなく、今回紹介するスクリプトで行っているのは、次の3つだけです。

  1. 指定のキー操作を検出する
  2. 選択中の文字をコピーする
  3. ブラウザでページを開いて検索や翻訳を実行

スクリプトの中身は下記の通りで、カスタマイズも可能です。

なぜ Ctrl+,×2 なのか?

最初は DeepL と同じ Ctrl+C×2 も試しましたが、アプリの既存のショートカットと衝突することがあり、いろいろ試した結果、Ctrl+,(カンマ) が非常に使いやすいことに気づきました。

  • 英字キーを使わないのでブラウザ、エディタ、PDFビューアのショートカットと衝突しにくい
  • 手の位置が自然で、連続操作しても疲れにくい

なお、サンプルのスクリプトでは「Ctrl+Shift+/」でも同じように機能するようにしてあります。最後のキーの部分はお好きなキーに変更できます。

スクリプトについて

以下、実際の AutoHotkey 用のスクリプトを掲載します。


#Requires AutoHotkey v2.0
#SingleInstance Force

^,::                 ; Ctrl+, で連打検知
{
HandleDoubleTap()
}

^+/::                 ; Ctrl+Shift+/
{
HandleOnce()
}

HandleDoubleTap() {
    static last := 0
    now := A_TickCount

    if (now - last < 400) {
        last := 0
        DoSearchMenu()
    } else {
        last := now
    }
}

HandleOnce() {
    DoSearchMenu()
}

DoSearchMenu() {
    old := ClipboardAll()
    A_Clipboard := ""
    Send "^c"
    if ClipWait(0.6) {
        q := Trim(A_Clipboard)
        if (q != "")
            ShowSearchMenu(q)
    }
    A_Clipboard := old
}

ShowSearchMenu(q) {
    m := Menu()

    m.Add("北辞郎", (*) => OpenUrl("https://www.ctrans.org/search.php?word=" . UrlEncode(q)))
    m.Add("Google", (*) => OpenUrl("https://www.google.com/search?q=" . UrlEncode(q)))
    m.Add("Wikipedia", (*) => OpenUrl("https://ja.wikipedia.org/wiki/Special:Search?search=" . UrlEncode(q)))
    m.Add("英辞郎", (*) => OpenUrl("https://eow.alc.co.jp/search?q=" . UrlEncode(q)))
    m.Add("コトバンク", (*) => OpenUrl("https://kotobank.jp/search?t=all&q=" . UrlEncode(q)))
    m.Add("百度", (*) => OpenUrl("https://www.baidu.com/s?wd=" . UrlEncode(q)))
    m.Add() ; separator

    m.Add("Kagi(中日)", (*) => OpenUrl("https://translate.kagi.com/?from=zh_cn&to=ja&text=" . UrlEncode(q)))
    m.Add("DeepL(中日)", (*) => OpenUrl("https://www.deepl.com/translator#zh/ja/" . UrlEncode(q)))

    ; 表示位置:キャレット優先 → マウス fallback
    x := "", y := ""
    if !CaretGetPos(&x, &y) {
        MouseGetPos &x, &y
    }
    m.Show(x, y)
}

OpenUrl(url) {
    Run(url)
}

UrlEncode(str) {
    bufSize := StrPut(str, "UTF-8")
    buf := Buffer(bufSize)
    StrPut(str, buf, "UTF-8")

    out := ""
    Loop bufSize - 1 {
        b := NumGet(buf, A_Index - 1, "UChar")
        if ( (b >= 0x30 && b <= 0x39)
          || (b >= 0x41 && b <= 0x5A)
          || (b >= 0x61 && b <= 0x7A)
          || b = 0x2D || b = 0x5F
          || b = 0x2E || b = 0x7E ) {
            out .= Chr(b)
        } else {
            out .= "%" . Format("{:02X}", b)
        }
    }
    return out
}


使い方は次の通りです。

  • コードをコピーしてテキストエディタに貼り付け、拡張子を .ahk にして保存(例:search.ahk)1
  • AutoHotkey(v2) をインストール
  • 保存したファイルをダブルクリックで起動

※スクリプトのファイルはこちらからzip圧縮版をダウンロードすることもできます。

検索先の追加やショートカットキーの変更も、スクリプト内の一部を書き換えるだけで簡単に行えます。ご希望があれば、上のスクリプトに追加いたしますのでお気軽にリクエストください。

なお、毎回AHKファイルをダブルクリックするのが面倒な場合、このスクリプトを常駐させることも可能です。エクスプローラのアドレスバーに「shell:startup」と入力し、Windowsのスタートアップフォルダを表示し、そこに先ほど作成したAHKファイルを貼り付けます。こうすることで次回からはWindowsの起動時にAHKファイルが読み込まれます。

おわりに

調べ物は、集中を切らさずにサクッと完了できることが大切だと思います。
100行に満たない簡単なスクリプトですが、Ctrl+カンマ×2 で作業効率は大きく向上します。
このショートカットが、読書や翻訳、学習の助けになれば幸いです。

追記:メニューの表示位置について

このスクリプトでは、可能な場合は文字入力カーソル(キャレット)の近くにメニューを表示します。そのため、Shift+矢印キーで範囲選択している場合でも、テキストエディタやワープロ上では自然な位置にメニューが出ます。ブラウザなど、一部のアプリではキャレットの位置を取得できない場合がありますが、その場合はマウスポインターの位置に表示されます。

  1. 文字コードはBOMなしのUTF-8にしてください []

2件のコメント

    1. 自分でも使ってみましたが、この仕組みはとてもいいですね。
      サイトだけでなく、アプリを呼び出すこともできるので、またスクリプトがまとまったらアップしようと思います。
      ご提案ありがとうございました!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください