LoginSignup
5
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-19

Screenshot_20220119-162140.png
↑この様に Termux 上で Emacs が普段使い出来るまでになったので、その設定を覚書します。
使用したのは Fire HD 10 です。OS はほぼ Android 9 なので、Termux が普通に使えます。

Termux のインストール

Termux は今でも Google Play で配布してますが、Android10 の問題により Google Play の更新をやめているので、F-Droid のサイトから F-Droid アプリをインストールし、F-Droid アプリから Termux をインストールします。

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

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

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

Ctrl ⇔ CapsLock する為に KCM リマップをインストールする

この後、端末上での作業になるので、Ctrl キーの入れ替えを行います。

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

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

Emacs のインストール

$ pkg upgrade
$ pkg install emacs

Emacs のキーバインドを正しく動かす為の Termux の設定

$ mkdir ~/.termux
$ 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/Terminal_Settings)

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

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

曖昧文字幅の問題(東アジアの文字幅:Wikipedia)により Emacs の表示がズレる問題の解消

ss2.png
↑こんな感じに変な事になります…。
▽kかと不要な k が見えてたり、ウィンドウの区切り(フリンジ)がズレていたり、右下に変なラインが表示されてたり)

Termux が純粋な Linux アプリであれば、wcwidh()のハックにより解消出来ますが、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

$ 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.elhttps://github.com/hamano/locale-eaw で公開されていたものを、今回の目的に合わせて修正したものです。
修正内容は、絵文字が含まれていたのを削除とeaw-halfwidth関数の追加です。

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

(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 の幅で表示してくれます。流石ですw

フォントをダウンロードしたら、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に書いてある方法を実行します。

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

$ 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という全く使う事がないコマンドなので、

(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を使っています。
mozc が有れば良いのでしょうが、Termux のリポジトリに mozc が無いです。

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

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

いやー長かった!

以上です。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6