以下の記事では、「selected」という、リージョンで囲われた文字列を対象に様々な関数を1キーストロークで発動できるパッケージの紹介がされている。
同記事では対象の文字列に対してgoogle検索を呼び出す方法も紹介されているが、ここではgoogle翻訳を呼び出すのが目的である。
MELPAよりgoogle-translateというパッケージをインストールした上で、以下の関数を定義する。
;; https://solist.work/blog/posts/google-translate/ ;; https://w.atwiki.jp/ntemacs/pages/86.html ;; http://emacs.rubikitch.com/google-translate/ ;; で紹介されていた関数をアレンジ (defvar google-translate--english-chars "[:ascii:]’“”–") (defvar google-translate--target-text "") (defun google-translate-auto () "Automatically recognize and translate Japanese and English." (interactive) (cond ((use-region-p) (setq google-translate--target-text (replace-regexp-in-string "\\([^\n]\\)\n\\([^\n]\\)" "\\1 \\2" (replace-regexp-in-string "^\s*\\(.*?\\)\s*$" "\\1" (funcall region-extract-function nil)))) (deactivate-mark) (when (fboundp 'cua-cancel) (cua-cancel))) (t (setq google-translate--target-text (read-string "Google Translate: ")))) (if (string-match (format "\\`[%s]+\\'" google-translate--english-chars) google-translate--target-text) (google-translate-translate "en" "ja" google-translate--target-text) (google-translate-translate "ja" "en" google-translate--target-text)))
この関数のミソは、google翻訳にかける前に「改行」を削除していることである。また日本語と英語を自動判別する機能もついているので、便利に使えるだろう。
そして以下の設定を書く。
(when (require 'selected nil t) (define-key selected-keymap (kbd "t") #'google-translate-auto) (selected-global-mode 1))
すると、リージョンに文字列が囲われた状態で、t を押下すればgoogle translateからの翻訳結果が帰ってくる(*Google Translate*バッファ)。