先日Android版のEmacsを導入してみましたが、その後にもAndroid版のために様々な設定をしたのでここにまとめておきます。
導入記事:
その後の設定:
- モードラインをドラッグしてウィンドウを消す
- Emacsからssh-agentを起動する
- キー入力を補助するためのツールバーを改善する
- 長押しでコンテキストメニューを開く
- 起動したらorgファイルを開く
- org-modeでメニューを作る
- リンクを開くときに新しいウィンドウを開かない
- org-captureの保存先
- ファイルの自動同期
- 物理キーボードからのIMEのON/OFF
- line-spacingや文字サイズの調整
- タッチによるスクロールをピクセル単位にする (2025-07-22追記)
- VerticoとCorfuをタッチスクリーンで操作できるようにする (2025-07-27追記)
- タッチスクリーンで慣性スクロールする (2025-11-13追記)
- ツールバーの改善 (2025-11-12追記)
- 仮想キーボードの作成 (2025-12-05追記)
- コンテキストメニューに「Close」を追加 (2025-12-09追記)
- org-captureをタッチで使いやすくする (2025-12-10追記)
起動したらorgファイルを開く
私はこれまでEmacsで起動画面のカスタマイズなどは特にしていませんでした。とは言ってもデフォルトのスプラッシュスクリーンくらいはOFFにしていたので(つまり (setq inhibit-splash-screen t))、起動したらscratchバッファが表示される状態でした。
PCならこれで全く困らずそこから必要に応じてファイルやディレクトリを開けば済むわけですが、Androidスマホだと何を開くにも小さなボタンを何回も押さなければならず苦痛です(メニューバーの中のブックマークの位置と来たら……)。
なのでとりあえずデフォルトのorgファイルを最初から開くことにしました。その名も phone.org 。
とは言ってもやることは init.el の最後でfind-fileするだけです。一応OSとファイルの存在くらいは確認しておきましょうか。
(when (eq system-type 'android) (let ((home-file "~/my-org-files/phone.org")) (when (file-regular-p home-file) (find-file home-file))))
リンクを開くときに新しいウィンドウを開かない
使っていると何かにつけて新しいウィンドウを開いてくるのが気になります。PCでは分割ウィンドウが不要ならC-x 1を押せば済む話ですが、タッチ操作がメインの場合はウィンドウを閉じるのにも一手間必要です。画面が小さいので分割されると見づらくなってしまうということも関係しているのでしょう。
先日の設定(モードラインをドラッグしてウィンドウを消す)でウィンドウを簡単に閉じられるようになったとはいえ、そもそも最初から新しいウィンドウを開かなければいい話です。とは言え別ウィンドウを開くのが必ず悪いかと言われればよく分からないので、とりあえず気になったところだけ直すことにします。display-buffer-alistあたりを変更しようかとも思いましたが、とりあえず個々のコマンドの設定を変更してみます。
;; org-modeのリンクを開くときに別ウィンドウを開かない (setf (alist-get 'file org-link-frame-setup) 'find-file) ;; org-agendaで別ウィンドウを開かない (setq org-agenda-window-setup 'current-window) ;; Dired内でファイルをタップしたときに別ウィンドウを開かない (define-key dired-mode-map [mouse-2] #'dired-mouse-find-file) ;; Diredから他のディレクトリを開くときに元のDiredバッファをkillする ;; (`dired-mouse-find-file'の挙動に影響する。 ;; dired-mouse-find-alter-fileは存在しない) (setq dired-kill-when-opening-new-dired-buffer t)
おそらく他にも同じように感じる場所があると思いますが、気がついたら逐一設定していくことにします。
org-captureの保存先
ディレクトリ構成が変わったのでorg-captureの保存先も変える必要があります。……と思ったのですが、その後 ~/ とシンボリックリンクを組み合わせてPCと同じパスになるようにしてしまったので設定は不要になりました。
ファイルの自動同期
ファイルの同期自体は上に書いたとおりGitを同期ソフト代わりに使うことで実現しています。
その上でPCではファイルの保存やEmacsの終了のタイミングでファイルを同期するような仕組みを整備していましたがスマホでは止めておきました。電波が入らないところで使っている可能性があるので。とりあえず手動で同期しようと思います。
物理キーボードからのIMEのON/OFF
Bluetoothのハードウェアキーボードを接続してみたのですが、IMEのON/OFFの方法がよく分かりませんでした。半角/全角を押すと切り替わるように見えてOFFなのにM-<やM->を押すと<や>が入力されてしまったり、かと思えばそれらはコマンドとして認識されるけど半角/全角切り替えはできなかったり。
調べてみると、これはどうもtext-conversion-styleとoverriding-text-conversion-styleが影響しているようです。
text-conversion-styleはIMEの挙動を指定するバッファローカル変数です。nilのときIME無効、非nilのとき有効になるようです。非nilの中でも、シンボル action やシンボル password といった指定もあります。ザッと検索してみたところ、text-mode(org-modeはここに含まれます)やprog-mode(一般的なプログラミング用のモードはここに含まれます)では t 、comint-mode(shell-mode等がここに含まれます)やminibuffer-modeでは action 、read-passwdでは password が指定されているようでした。つまりバッファ毎にそのバッファに入力される文字の種類・性質を指定するという側面があるようです。
それでtext-conversion-styleがnilのバッファではIMEを介さない入力が可能で、tのバッファでは常にIMEを介した入力になってしまうということのようです。極端だってば。(注: この辺りの挙動はIMEによっても若干異なるようです。Gboardはtext-conversion-styleがnilの時でもGboardのショートカットキーを完全に無効にすることはできませんでした。M->を押すと何か不可解なエラーが出たり、M-tを押すとGoogle翻訳を使おうとしたりします。ATOK Passport Proはショートカットキーが干渉することはありませんでしたが、text-conversion-styleがtのときは半角文字もIME経由でバッファへ直接挿入されるためorg-modeのスピードコマンドやedebugのアルファベット1文字のキーが使えなかったりしました)
text-conversion-styleの効果はグローバル変数overriding-text-conversion-styleで上書きできます。デフォルトの値はシンボル lambda でtext-conversion-styleの値を尊重します。それ以外の値が指定されている場合は、text-conversion-styleは無視してoverriding-text-conversion-styleの値が使われるようです。
ということはこのoverriding-text-conversion-styleを切り替えるコマンドを作ればIMEの挙動をユーザーが明示的に指定出来るようになるはずです。
(defun my-toggle-text-conversion-style () "`overriding-text-conversion-style'を`lambda'とnilとの間で切り替えます。" (interactive) (cond ((eq overriding-text-conversion-style 'lambda) (setq overriding-text-conversion-style nil) (set-text-conversion-style text-conversion-style)) ((null overriding-text-conversion-style) (setq overriding-text-conversion-style 'lambda) (set-text-conversion-style text-conversion-style))))
それを私はCtrl+変換に割り当てました。私は普段PCでもこのキーでIMEのON/OFFを切り替えているので。
(define-key global-map [C-henkan] #'my-toggle-text-conversion-style)
半角/全角は英数/カナ切り替え(カナロック)のようなものだと考えることにします。
ちなみにハードウェアキーボードの細かいレイアウトはshiftrot/caps2ctrlのkcmファイルを独自にカスタマイズして調整しています。
line-spacingや文字サイズの調整
指で位置を指定することを考えるとline-spacingは大きめが良いでしょうね。使うフォントにもよると思いますが。文字サイズは視力との兼ね合いでしょうか。
タッチによるスクロールをピクセル単位にする (2025-07-22追記)
(setq touch-screen-precision-scroll t)
VerticoとCorfuをタッチスクリーンで操作できるようにする (2025-07-27追記)
慣性スクロールを有効にする (2025-11-13追記)
ツールバーの改善 (2025-11-12追記)
ツールバーの項目を整理し、アイコン画像の大きさも調整して押しやすくしました。
仮想キーボードの作成 (2025-12-05追記)
上のツールバーなどでは満足できなくなってしまったので、仮想キーボードを丸丸開発しました。
Emacsの中で動く仮想キーボードを作る | Misohena Blog
標準の(Android OSネイティブの)仮想キーボードを手動で無効化/有効化する vkbd-toggle-native-osk コマンドも含まれています。この切り替えを行うボタンは新しく作った仮想キーボードのタイトルバーに表示されますが、単体でツールバーに置くのも良いかもしれませんね。結局仮想キーボードを表示するかどうかは手動で制御した方が確実な気もします。
コンテキストメニューに「Close」を追加する (2025-12-09追記)
org-captureをタッチで使いやすくする (2025-12-10追記)
テンプレート選択をGUIメニューに置き換え、終了時のキー(C-c C-c 等)もタッチで出来るようにしました。
おしまい
これでAndroid版のEmacsを触って最初に思いついた設定は一通り終わりました。
最初はAndroid版のEmacsなんて使い物になるの~? と疑っていましたが、思っていた以上に使える道具だということが分かってきました。Orgzlyはもう私には必要ありません。Android用に作られた昔からあるテキストエディタアプリも用済みです。タッチ操作で普通に編集できるので遜色ありません。長押しメニューが圧倒的に便利です。Dropbox等のクラウドストレージとの連携が必要な人だとまだその手の機能を搭載したアプリの方に分があるかもしれません……ってTrampのrcloneメソッドがあるんですね(使ったことはありません)。
すごいのはほぼ全ての設定がPCと同一だということです。Androidのためだけに設定したことは、これまでに紹介したものしかありません。
もちろん今後も触っていて思いついた改善をしていこうと思います。決して尽きることはないでしょう。