Termux 上で Emacs を普段使いする為の設定

![Screenshot_20220119-162140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153538/d2a95dab-df45-d7d3-6a05-ec38d3480667.png)
↑この様に Termux 上で Emacs が普段使い出来るまでになったので、その設定を覚書します。
使用したのは Fire HD 10 です。OS はほぼ Android 9 なので、Termux が普通に使えます。

# Termux のインストール
Termux は今でも Google Play で配布してますが、[Android10 の問題](https://github.com/termux/termux-packages/wiki/Termux-and-Android-10)により Google Play の更新をやめているので、[F-Droid のサイト](https://f-droid.org/)から F-Droid アプリをインストールし、F-Droid アプリから Termux をインストールします。

F-Droid をインストールする時に、提供元不明のアプリケーションのインストールを許可する必要があります。

Emacs を普段使いするには Termux のバージョンが 0.118.0 以上が必要です。

以下、Termux をインストールして起動出来た状態を想定。

# Ctrl ⇔ CapsLock する為に KCM リマップをインストールする
この後、端末上での作業になるので、Ctrl キーの入れ替えを行います。

https://play.google.com/store/apps/details?id=jp.kcm.thumbctrl&hl=ja&gl=US

物理キーボードを使わないなら不要です。
ちなみに、自分は Ctrl を[変換]キーに割り当てる「親指Ctrl」使いですが、ありがたい事にこのアプリはそれに対応しています。

Android で使えるキーボードは色々あると思いますが、自分が使ってるキーボード(TK-FBP073)だと、Android モードではなく Windows モードにしないと上手くキーの入れ替えが反映されませんでした。

# Emacs のインストール
```shell_session
$ pkg upgrade
$ pkg install emacs
```

# Emacs のキーバインドを正しく動かす為の Termux の設定
```shell_session
$ mkdir ~/.termux
```
```shell_session
$ cat ~/.termux/termux.properties
ctrl-space-workaround = true
disable-hardware-keyboard-shortcuts = true
fullscreen = true
```
設定ファイル(```~/.termux/termux.properties```)を↑この様な内容にします。

```ctrl-space-workaround = true```は、Android9 以降で物理キーボードの```Ctrl+space```が OS に横取りされる問題の回避策です。

```disable-hardware-keyboard-shortcuts = true```は、物理キーボードの```Ctrl+Alt+n```の様なキー入力を Termux が横取りする問題の回避策です。

Termux は```Ctrl+Alt```を[幾つかの機能のショートカット](https://wiki.termux.com/wiki/Hardware_Keyboard)のプリフィックスとしているので、それらが使えなくなります。
使いたい場合は、別途設定してください。(https://wiki.termux.com/wiki/Terminal_Settings)

最後の```fullscreen = true```はお好みで。
以下に、ヒアドキュメントのコマンドを書いておきます。コマンドラインにコピペして Enter で作成出来ます。

```shell_session
cat <<EOF > ~/.termux/termux.properties
ctrl-space-workaround = true
disable-hardware-keyboard-shortcuts = true
fullscreen = true
EOF
```

# 曖昧文字幅の問題([東アジアの文字幅:Wikipedia](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85))により Emacs の表示がズレる問題の解消

![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153538/ff36231e-3b94-6710-6de2-8affad9ffaee.png)
↑こんな感じに変な事になります…。
```▽kか```と不要な k が見えてたり、ウィンドウの区切り(フリンジ)がズレていたり、右下に変なラインが表示されてたり)

Termux が純粋な Linux アプリであれば、[```wcwidh()```のハック](https://github.com/fumiyas/wcwidth-cjk)により解消出来ますが、Termux は Java アプリなのでハックの仕方が分かりません…。
(ソースを修正すべき箇所は多分ここです→ https://github.com/termux/termux-app/blob/master/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java)

なので、Emacs 側の方で曖昧文字の幅を全て Termux に合わせて```1```にする設定を行います。

```eaw.el``` を手動で落とすならこちら → https://gist.github.com/chuntaro/c8e787eedf07c566fc0760b246ae1382

```shell_session
$ curl -O https://gist.githubusercontent.com/chuntaro/c8e787eedf07c566fc0760b246ae1382/raw/6c903a3b4d08501137be9934717375fd1d1020c6/eaw.el
$ cat eaw.el
;;; eaw.el --- Fix east asian ambiguous width issue for emacs
;; Author: HAMANO Tsukasa <code@cuspy.org>
;; URL: https://github.com/hamano/locale-eaw
;; Version: 12
;; MIT License

;;; Code:

(defconst eaw-east-asian-ambiguous
  [#x00A1 ; (1) Po         INVERTED EXCLAMATION MARK
   #x00A4 ; (1) Sc         CURRENCY SIGN
   #x00A7 ; (2) Po         SECTION SIGN

...略...

(defun eaw-fullwidth ()
  (eaw--set-width 2))

(defun eaw-halfwidth ()
  (eaw--set-width 1))

(provide 'eaw)

;;; eaw.el ends here
```

この```eaw.el```は https://github.com/hamano/locale-eaw で公開されていたものを、今回の目的に合わせて修正したものです。
修正内容は、絵文字が含まれていたのを削除と```eaw-halfwidth```関数の追加です。

この```eaw.el```を```load-path```が通ってるディレクトリにコピーして```init.el```に、

```emacs-lisp
(require 'eaw)
(eaw-halfwidth)
```

と追加します。
これで変な表示は無くなりますが、自分の環境だと曖昧文字幅が 1 になったせいか、```○```(C-x 8 RET WHITE CIRCLE)が縦長になりました。
これはフォントを変更する事で対処出来ます。

自分は```Cascadia Code```(https://github.com/microsoft/cascadia-code) を使用しました。
このフォントは Windows Terminal に標準で付いてくるようになった、オープンソースのフォントです。
ちなみに、Windows Terminal も曖昧文字の幅を強制的に 1 にする端末エミュレーターです。(しかも、Windows アプリなのでハックの仕方も分かりません)
そのせいなのか、曖昧文字を全て綺麗に 1 の幅で表示してくれます。流石ですｗ

フォントをダウンロードしたら、```CascadiaCode.ttf```を```~/.termux/font.ttf```の名前でコピーするだけです。

# Emacs を 24bit カラーで使う為の設定 (Emacs28 からは不要)
https://www.gnu.org/software/emacs/manual/html_node/efaq/Colors-on-a-TTY.html
↑ここに手順が書いてありますが、どうも Termux では上手く行かないので、[stack overflow](https://stackoverflow.com/questions/14672875/true-color-24-bit-in-terminal-emacs)に書いてある方法を実行します。

```terminfo-24bit.src``` を手動で落とすならこちら → https://gist.github.com/chuntaro/aafe8fe9c2c4d70420c3f50a6bf384cc

```shell_session
$ curl -O https://gist.githubusercontent.com/chuntaro/aafe8fe9c2c4d70420c3f50a6bf384cc/raw/779a232b801c5128f6db1c77de248cb0bf082cfa/terminfo-24bit.src
$ cat terminfo-24bit.src
# Use colon separators.
xterm-24bit|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
  setf24=\E[38:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
# Use semicolon separators.
xterm-24bits|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
  setf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
$ tic -x terminfo-24bit.src
$ TERM=xterm-24bits emacs -nw
```
```tic```コマンドを```-o```オプションを付けて実行すると、なぜか segv を起こすので、直接```/usr/share/terminfo/```内を更新します。
特に困る事も無いでしょう。

# Emacs の mark-sexp のキーバインドが効かない問題の回避策
```mark-sexp``` は通常```C+M+@```か```C+M+SPC```に割り当てられてますが、Termux 上でどちらも正しく認識されません…。
それぞれ、```M-@```と```C-@```と認識されます。
自分は「親指Ctrl」の都合上、```C+M+@```を使っているので、```M-@```の方ですが、これは```mark-word```という全く使う事がないコマンドなので、

```emacs-lisp
(global-set-key "\M-@" 'mark-sexp)
```

とする事で、```C+M+@```→```M-@```→```mark-sexp```となり、回避出来ました。
ただ、ほとんどの人は```C-M-SPC```を使うと思うので、その場合は今の所、回避策がありません！(滝汗…

この1点をもって、常用出来ないと思う人もいるかも知れません。自分だったら出来ないです。
そもそも端末に詳しくないので、そういうものなのか、回避策が有るのかもわかりません。
なので、Github に issue でも上げるべきなのかも知れませんね。(他人事良くない)

取り合えず、これらを全て行った結果が、冒頭の画像になります。

# 余談
曖昧文字で検索すると、必ず全角(幅 2)に設定する方法が出てきます。
もう半角でも良いんじゃないかと思う様になりました。
邪道なんでしょうかね？

Termux は```sshd```が使えるので、PC とのデータのやり取り用に先に設定しておいた方が良いでしょう。

画面下の方に[ESC][↑]の様な拡張キー領域がありますが、これは音量大キー＋kを同時押しで表示のトグルが出来ます。(https://wiki.termux.com/wiki/Touch_Keyboard)

Emacs で日本語の入力は[DDSKK](http://openlab.ring.gr.jp/skk/ddskk-ja.html)を使っています。
mozc が有れば良いのでしょうが、Termux のリポジトリに mozc が無いです。

最初 Termux を入れて Emacs を起動した時は、まず```Ctrl+space```が使えなくて諦め、暫くするとその回避策がコミットされ、喜び勇んで Emacs を起動すると、今度は```Ctrl+Alt+n```が使えなくて諦め、と数年は指をくわえて見てるだけでしたｗ

しかし、それも issue が立ち上がり、回避策のパッチがコミットされて、いよいよ使えるようになったという次第です。

いやー長かった！

以上です。