emacsでgoogle-translateしたい。（Termux）

emacs で google 翻訳したいと思いました。

 terminal の CUI プログラムから google API に文字列を投げ込んで、処理されて戻ってきたものを表示するというイメージです。
多分できるんだろう、と emacs 見たこともなかったところからスタートでした。

できました。
ひと月かかったような気がします。

（イチから作ったわけではなく、すでにあるものの使い方を理解するのにゼロから始めて、フルタイムでという意味です。特に理解力がないとか、特別にあるとかは、無いです。ゼロ知識のレベルに合わせた情報がほとんど見つからないので、読む（もしくは読まない）ことに、そのくらいかかると思います。まず、CUI emacs についてふれている情報が見つけることができませんでした。何もことわりなく　emacs　と書いているものについては GUI emacs を前提にしているんだろーなーと思いますが、ここではターミナルで動作する emacs に限定しておきます。）

atykhonov/google-translate: Emacs interface to Google translate
https://github.com/atykhonov/google-translate

こちらを使わせていただきます。
atykhonov/google-translate を　MELPA という emacs のプログラムパッケージのリポジトリからダウンロードして、emacs へセットアップするということになります。

それともう一つ popup も使わせていただきます。
popup.el　Copyright (C) 2011-2015 Tomohiro Matsuyama
https://github.com/auto-complete/popup-el

atykhonov　google-translate　では、単体で翻訳結果を別のバッファを開いて表示する機能のすべてを持ってないようなので、ポップアップ（新たにバッファなど開いて表示する）プログラムを呼び出すのに、必要になるのだと思います。atykhonov　google-translate　をインストールするときに、 popup が無いというエラーになりますから、　popup.el　を後から MELPA 経由でインストールすると問題がなく動作するようになりましたので、そうなんだろうなと思います。何も検証していないです。
atykhonov　google-translate　インストール時にエラーがないという場合には、必要ありません。すでに何か別の機能拡張プログラムがインストールされていて補完されているのだと思います。popup : popup.el 以外で検証していませんので、わかりませんが、ちがうよそれというご意見があれば、ぜひコメントください。


ありがとうございます。

---

順を追って、説明したいと思いますが、まず最終的なところから。

これを見てください。何もわからなくて当然ですから、わからなくていいです。見て、見たと思えば一歩前進です。

##### 設定ファイル init.el
https://gist.github.com/dauuricus/73cec5c249eca5a9a1079a3da490d418#file-init-el

```lisp:init.el
;;UTF-8の設定
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
;; Set up package.el to work with MELPA
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

;;(require 'google-translate)
;;(require 'google-translate-default-ui)
;;(global-set-key "\C-ct" 'google-translate-at-point)
;;(global-set-key "\C-cT" 'google-translate-query-translate)

(require 'google-translate)
(defun google-translate--search-tkk () "Search TKK." (list 430675 2721866130))
(setq google-translate-backend-method 'curl)
(require 'google-translate-smooth-ui)
(global-set-key "\C-ct" 'google-translate-smooth-translate)

;;Evil (vim) mode
(require 'evil)
(evil-mode 1)
```

これは、 emacs の設定の記載です。後ほど説明しますが、先に眺めてもらって、こういうのがいるんだな、とか今現在これで通るんだ、とか、これじゃ駄目だとか、おもいおもいに感想をもってください。
最低限この設定で、 google-translate は期待したとおり動作しました。

Amazon Fire 8 のTermux の package の emacs で Evil mode で google 翻訳を使っている場面（ youtube 動画）

https://youtu.be/ERPeCYSM8zI

この動画のようにCUI emacs 内で google 翻訳機能を使うことを想定して、その設定について説明していきます。

`Evil mode` についてはここではふれませんが、設定ファイルのおしりのところに記載がありますから、 `Evil mode` の設定までのことを別の記事で簡潔にまとめてありますので興味があるようでしたら、そちらをどうぞ。
https://qiita.com/dauuricus/items/fcd30edb55127c5a5986
必要ない方は、設定ファイル `init.el` のおしりのところは削除して無視していただけば問題ないないです。

 `init.el` のおしりのとこ

```lisp
;;Evil (vim) mode
(require 'evil)
(evil-mode 1)
```

 CUI emacs に `google-translate`　をインストールしている作業を動画でキャプチャーしました。スムーズな作業とは云えませんが、一連でひととおりインストールから機能するまでの流れになっています。

https://youtu.be/lONj2d9HdEQ?t=131

ここらへんに書くことは、読むことを想定しているのは自分と、興味はあるけど、ウェブを探すとよくわからなってあきらめるというタイプの人に向けています。


まず、 emacs 自体のかんたんな構造説明ですが、パッケージマネージャーがあり、それによってプラグインのような機能拡張するプログラムを追加していくというようになっています。
その一つが、MELPA というリポジトリを使うことなのですが、emacs をインストールした時点のデフォルトでは、MELPA は指定されていません。
MELPA は外部のネットワーク上にありますから、URL で指定して、そのアドレスにあるリストを見ながら、これだというパッケージ(プログラム)をダウンロードしてコンパイルして emacs にインストールするという流れで機能を追加します。
そのために、emacs の設定ファイルを用意して、あらかじめ MELPA のリポジトリの設定を記載しておいて、emacs 独自のキーコマンドでリポジトリへアクセスして、パッケージリストを更新したり、インストールしたり、アンインストールするということをイメージしてください。
`apt-get update`や`apt-get install`に似ていますね。

では、emacs の設定ファイルとは？
設定ファイルはすでに見ていますね。一番最初に、とにかく見てみましょうと書いたものが、設定ファイルでした。

では、emacs の設定ファイルはどこにあるのか。
emacs をインストールしたばかりの状態では、存在していないので、ターミナルからemacs を使って設定ファイルを作ります。

```bash
~$ emacs ~/.emacs.d/init.el
```

enter を押すと、`~/.emacs.d/init.el`ファイルを編集する状態に移ります。

```lisp
;; Set up package.el to work with MELPA
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
```

こう書き加える事で、MELPA レポジトリが設定されます。
逆に書き加えない状態だと、別のレポジトリがデフォルトになっているのですが、レポジトリによってリストアップされるパッケージ(プログラム)が違うので、今回の目的の google-translate は MELPA にあるからレポジトリを設定するわけです。

リポジトリを変更するところまでだけで、MELPA のパッケージリストを見てみるとすると、リポジトリの設定コードを書き終わったところで、

`M` `x` `eval-buffuer`

`M`とは Meta キーのことで、`Alt`キーが Meta キーに相当します。
だから、`Alt`の次に、`x`キー、その後に`eval-buffer`とタイピングして、`enter`キー。
これが、emacs でこのバッファーの変更を反映するコマンドです。

さて、Android での仮想キーボード(たとえば、Amazon Fire hd 8 だとオムロン製の fire keyboard がデフォルトになっているキー入力ソフトウェアキーボードのことです。)だと、`Alt`や`ESC`などの入力に困ります。
網羅的には調べていないのですけど、いまのところ半年間くらいの経験では、

* hacker's keyboard https://github.com/klausw/hackerskeyboard
* codeboard https://github.com/gazlaws-dev/codeboard

この2つで vim のキー入力は問題少なく使えています。完璧なキーボードって追求するとたいへん険しい道のりになりそうですが、 IME のプログラムやキー配列など当たり前に備わっているのが前提のものっていうのは、不自由を感じたとき、どうすればいいんだろうか？とモヤモヤします。この2つのソフトウェアキーボードはオープンソースで github に公開されています。

* keyboard with ctrl key ソースコードリンク切れ

このソフトウェアキーボードでは、Meta キーは`ESC`キーでアサインされます。キー配列はそっけないですが、bluetooth のハードウェアキーボードを使う場合は、仮想キーボードのキー配列のことは問題にならないです。例えば、googlecolab でコードエディターを vim モードにした場合、`r`コマンド（文字の置き換え）は、このソフトウエアキーボードの場合、通常の動作をしました。他の2つは codeboard では置き換えではなくインサートになり、hacker'skeyboard ではコマンドになりませんでした。

emacs のキーコマンドで一番最初に確認したいコマンドは「キャンセル」ではないかと思います。キャンセルって？ `Quit`のことですが、何かコマンド入力をしていて、なんか思ってるのと違うかもしれないぞ？というときに、コマンドの実行から抜けるためのコマンドです。あ、このコマンド、タイピングしたキー間違ってたというときにも、キャンセルできるので、`Quit`ですがキャンセルというニュアンスの方がイメージしやすいかと思います。

`Ctrl` `g`

でキャンセル( Quit )することができます。
これで、コマンドをあてすっぽで、好きにタイピングしても不穏なムードから抜け出せます。

emacs のコマンドについてはインターネット上にたくさん説明がありますが、ここにもその一つのリンクを貼っておきます。

[emacs cheat sheet](https://duckduckgo.com/?q=emacs+cheatsheet&ia=cheatsheet&iax=cheatsheet)

そしてたくさんコマンドがありますが確認しておくべきコマンドは、**Undo**でしょう。確認できましたか？

evil モードという vim エディターのキーコマンドを使うモードで emacs を使うという場合、vim キーコマンドと emacs キーコマンドの対照表があると、vim に慣れた人でも emacs コマンドを探しやすくなると思います。

[vim-emacs-cheatsheet_of_freezing_hell](https://karl-voit.at/unmaintained/vim-emacs-cheatsheet_of_freezing_hell.shtml)

`M(Alt)` `x` `package``-` `list` `packages`

とタイピングすると、バッファにパッケージのリストが表示されます。

ここでは MELPA リポジトリに接続して、リストのダウンロードを要求している動作をしているのだと思いますが、もしかすると MELPA のリストを表示せず、デフォルトのリポジトリのリストになっているかもしれません。

Archive の列をよく見てください。

![Screenshot_20210424-171516_kindlephoto-88992784.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ef2a1cd9-3911-4c72-55e6-565de8928479.png)

**MELPA**になっていたら、そのままでいいのですが、ELPA になっていたら、それはデフォルトでアクセスするレポジトリになっています。

なんかチベット密教にでてきそうな、MELPA と ELPA ですが、もう一度、 `M(Alt)` `x` `package` `-` `list` `packages`とタイプしてみてください。

少し待ってリストがリフレッシュされない場合は、emacs の設定ファイルで、リポジトリの設定が間違っているのかもしれません。

`M(Alt)` `x` `package` `-` `list` `packages` は、レポジトリのパッケージリストをリフレッシュして表示するためのコマンドです。

このスクリーンキャプチャー画像では、すでに`installed`になっていますが、リスト上にあるインストールしたいパッケージのところに方向キーなどでカーソルを移動して、該当するパッケージにカーソルを合わせて`enter`キーを押すと、パッケージの詳細のバッファー（ウィンドウ）が分割表示で開きます。

![Screenshot_20210424-190213_kindlephoto-2920933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/61db37c8-224a-9372-8931-21a3bcb9bace.png)

`Ctrl` `x` `o`
のコマンドでバッファー（ウインドウ）の新たに開いた方へ、フォーカス移動します。
カーソルを`install`の上に合わせて`enter`キーを押すと、パッケージが emacs にインストールされます。

Andrey Tykhonov **google-translate**は、**popup**というパッケージも必要としますので、popupもパッケージリストの中から探し出して、同様にインストールします。

さて、ここでカーソルの移動ですが、方向キーで移動するのも問題ないのですが、ワードサーチできるといいすよね。

`Ctrl` `s`
このコマンドで、下方向へ**インクリメンタルサーチ**ができます。

逆向きの場合は、
`Ctrl` `r`
です。

最初からすんなり問題なく検索できるという場合は、無視していいのですけど、なんかおかしいこの検索・・・と思った人は、私と同じです。

`Ctrl` `s` とキーをタイプしたあと、検索したいワードをそのまま入力してください。
そのままというのは、`enter`キーや、方向キーなどを押さずに、`Ctrl` `s` を押した後すぐにということです。
たとえば、`popup`パッケージを探したい場合だと、
`Ctrl` `s` `p`
と入力したと同時に、検索が始まっていて、`p`を含むセンテンスの｀play｀ など、`p`lay 文字がハイライトされています。
そのまま`popup`と入力すると、他に`enter`などのキーも押さずに、再び、
`Ctrl` `s`
とタイプすると、テクストの`popup`が現れる箇所にハイライトが下方向に検索されていくとともにカーソルもそこへ移動しています。
なんかおかしいなと思った人は、検索ワードをさせたくて無意識に`enter`キーや、方向キーを押してみて、あれ？検索できないなと思ったのかもしれません。
`Ctrl` `s`に続けて入力された文字で、すでに検索が始まっているので、検索を下方向にかけていきたい場合は、再び`Ctrl` `s`を繰り返すといいわけです。
おや？へんだなと思った人は、このことに慣れるまでにしばらくかかるかもしれません。

たぶん、それが**インクリメンタルサーチ**です。きっと。

google-translate　と popup をパッケージリストからインストールされた状態で、再び emacs の設定ファイルを見てみましょう。

設定ファイルに MELPA のリポジトリがあるだけだと、まだ google-translate は正常に動かないと思います。

`Ctrl` `x` `Ctrl` `f`

このコマンドで、ファイルを開きます。

```
Find file: ~/.emacs.d/init.el
```

とタイプして`enter`キーを押します。

init.el のファイルに google-tanslate の設定を追記します。

```lisp:init.el
;;(require 'google-translate)
;;(require 'google-translate-default-ui)
;;(global-set-key "\C-ct" 'google-translate-at-point)
;;(global-set-key "\C-cT" 'google-translate-query-translate)

(require 'google-translate)
(defun google-translate--search-tkk () "Search TKK." (list 430675 2721866130))
(setq google-translate-backend-method 'curl)
(require 'google-translate-smooth-ui)
(global-set-key "\C-ct" 'google-translate-smooth-translate)
```

そして、また`Alt` `x` `eval-buffer`で設定を反映します。

これで google-translate が emacs で使えるようになっています。

google translate の使い方は、翻訳したいテクストを選択した状態で、`Ctrl` `c` `t` とコマンドをタイピングします。
そして、翻訳元の言語が英語の場合だと｀eng｀ `enter` キーで `English`が確定し、翻訳先の言語が日本語の場合は `jap` `enter` キーで `Japanese` が確定されます。
翻訳されたものは新たにバッファーがポップアップウィンドウのように開いて表示されます。

https://youtu.be/ERPeCYSM8zI