リージョンで囲った文字列を対象にgoogle翻訳を呼び出す(Emacs)

以下の記事では、「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*バッファ)。