$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Emacsで英和辞書や和英辞書をすぐに引けるようにしたい

ちょっと調べてたら、

というような記事を見つけて、google-translate.elというのを見かけたので導入してみた。特にrubikitchさんの記事は自動で日本語か英語かを判定してくれるので、そのまま導入した。

動作

キーバインドはほぼ一つで以下の動作が出来ます。
f:id:shiba_yu36:20160529122730g:plain

インストール

M-x package-install google-translateで。

設定する

(require 'google-translate)
(require 'google-translate-default-ui)

(defvar google-translate-english-chars "[:ascii:]"
  "これらの文字が含まれているときは英語とみなす")
(defun google-translate-enja-or-jaen (&optional string)
  "regionか現在位置の単語を翻訳する。C-u付きでquery指定も可能"
  (interactive)
  (setq string
        (cond ((stringp string) string)
              (current-prefix-arg
               (read-string "Google Translate: "))
              ((use-region-p)
               (buffer-substring (region-beginning) (region-end)))
              (t
               (thing-at-point 'word))))
  (let* ((asciip (string-match
                  (format "\\`[%s]+\\'" google-translate-english-chars)
                  string)))
    (run-at-time 0.1 nil 'deactivate-mark)
    (google-translate-translate
     (if asciip "en" "ja")
     (if asciip "ja" "en")
     string)))

(push '("\*Google Translate\*" :height 0.5 :stick t) popwin:special-display-config)

(global-set-key (kbd "C-M-t") 'google-translate-enja-or-jaen)

このgoogle-translate-enja-or-jaenはほぼrubykitchさんのをパクりました。ただ、regionを指定していない時の挙動は現在位置のセンテンスより現在位置のワードのほうが嬉しかったので、(thing-at-point 'word)を利用。

これで、

  • 英語か日本語かは自動判定してくれる
  • region指定してC-M-tすると、そのregionの翻訳をしてくれる
  • region指定せずにC-M-tすると、現在位置のwordを翻訳してくれる
  • C-u C-M-tすると、自分で調べたいものを入力できる

という最高環境ができあがりました。