Androidでemacs-howmでメモ取り

POCO X7 proでEmacsでhowmでのメモ取りできる環境になったので、設定した経緯を取りまとめ

2006年から、Ubuntu linux環境のEmacsにて、howmでメモを取ってきている。
実際には自宅サーバーを立て、sshで繋いでemacs+howm環境にてテキストメモファイルを作っている。

これまではパソコンからEmacsにアクセスするのがほとんどであったが、先日Android版のEmacsがリリースされたことを知った。
ならば、とhowmでメモ取り環境構築をしようと思ったのだが、ちょっと大変だった。

そもそも何年もテキストエディタとしてEmacsを触っているけど、テキストエディタとしてしか使ってないからほとんどEmacsのこと知らないということに気づかされた。

そんなこんなで、あちこちから情報集めて構築したので、以下にとりまとめ。

参照したのは下記のサイトを主に。
https://misohena.jp/blog/2025-02-28-try-emacs-for-android.html

まずEmacsで作ったローカルのメモ(テキストファイル)をrsyncで同期させてやればいいだろう、と思っていたので仮想ターミナルを併せて使おうとTermuxとの併用で環境を構築することを考えた。

EmacsとTermux、連携して使おうと思えば、アプリの署名が同じ、Emacsと一緒に配布されているtermux-appを使えばよいとのことであったが、sourceforgeで配布されていたtermuxはPOCO X7 proでは立ち上がらなかった。

https://sourceforge.net/projects/android-ports-for-gnu-emacs/files

よく判らないなら、ユニバーサル APK を選択せよ、とのことでgithubからtermux-app_v0.118.3+github-debug_universal.apkをダウンロード

https://github.com/termux/termux-app/releases

emacsはemacs-31.0.50-35-arm64-v8a.apkをダウンロードした。

https://sourceforge.net/projects/android-ports-for-gnu-emacs/files

この二つのapkを同じ鍵で署名すればお互いのファイルにアクセスできる、とのことで、下記の再署名を行った。

参考サイトは下記
https://pandanote.info/?p=13835

Ubuntu 25.10デスクトップPC上でAPKファイルをダウンロード。
ダウンロードしたAPKファイルから署名を削除。
$ zip -d emacs-31.0.50-35-arm64-v8a.apk “META-INF/” $ zip -d termux-app_v0.118.1+github-debug_arm64-v8a.apk “META-INF/

APKファイルへの再署名のためのキー及びキーストアを下記のコマンドを作業用PC上で実行して作成
$ keytool -genkey -v -keystore hoge.keystore -storepass -alias hoge-20250925 -keypass -keyalg RSA -validity 1000

下記のコマンドを実行し、APKファイルの中身のアラインメントを揃えます。
$ zipalign -v -p 4 emacs-31.0.50-35-arm64-v8a.apk emacs-31.0.50-35-arm64-v8a-aligned.apk
$ zipalign -v -p 4 termux-app_v0.118.1+github-debug_arm64-v8a.apk termux-app_v0.118.1+github-debug_arm64-v8a-aliened.apk

アラインメントが揃ったところで、下記のコマンドを実行してアプリに(再)署名します。

$ apksigner sign -ks hoge.keystore –ks-key-alias hoge-20250925 –out emacs-31.0.50-35-arm64-v8a.apk emacs-31.0.50-35-arm64-v8a-aligned.apk
$ apksigner sign -ks hoge.keystore –ks-key-alias hoge-20250925 –out termux-app_v0.118.1+github-debug_arm64-v8a.apk termux-app_v0.118.1+github-debug_arm64-v8a-aliened.apk

POCO X7 proへ上記、emacs-31.0.50-35-arm64-v8a-aligned.apk、termux-app_v0.118.1+github-debug_arm64-v8a-aliened.apkをコピー。

emacs、Termuxの順でインストール。
またキーボードとしてF-DroidよりUnexpected Keyboard をインストールした。
https://www.reddit.com/r/termux/comments/r8my5x/unexpected_keyboard_new_app_on_fdroid/?tl=ja

Termuxを立ち上げて
$ pkg upgrade && pkg upgrade
$ termux-setup-storage
上記コマンド後、Termuxアプリの権限設定として、ファイルへのフルアクセスを許可した。

$ pkg install openssh

$ whoami
自身のユーザー名確認 u0_axxx

$ passwd
パスワード設定
u0_axxxのパスワード設定

PCから
$ ssh -p 8822 u0_axxx@192.168.xxx.xxx
ポートは22ではなく、8822

以降、sshの設定をしておく

$ pkg install emacs
追って差異を検討しようと思って、Termux用のEmacsもインストール。
以降、ローカルの設定ファイルはsshで接続してtermux上でemacsから記入した。

Termuxのホームフォルダは
/data/data/com.termux/files/home

/data/data/com.termux/files/home/storage/shared/以下がAndroidのルートディレクトリとなっている

emacsのホームは
/data/data/org.gnu.emacs/files

$ emacs ./.bashrc
export LANG=ja_JP.UTF-8
export LANGUAGE=”ja_JP:ja”

Android側とのクリップボード共有
$ pkg install termux-am-socket termux-api

スマホ上のemacs起動
M-x android-request-storage-access
アプリの設定でファイルにアクセスできるようにする。
スマホ上に
/data/data/org.gnu.emacs/files
上記、Android版emacsのホームディレクトリとなる。

$ mkdir /data/data/org.gnu.emacs/files/fonts

Android版Emacsで日本語表示のために、ホームディレクトリ以下/fontsフォルダにttfファイルを置く

フォントはGoogle Fontsで公開されている日本語Webフォントをダウンロードしてきた
https://fonts.google.com/noto/specimen/Noto+Sans+JP

notosansjp-variablefont_wght.ttfを./fontsフォルダーに入れた。
なお.emacsへの記述はパスの記載が不明だったので、Emacsのoptionからフォントを選択し、saveして.emacsに記述させた。

.emacsファイルの設定
termux上のemacsで
$ emacs /data/data/org.gnu.emacs/files/.emacs

以下、記述
;;; –– lexical-binding: t –

;; 日本語関連
(set-language-environment “Japanese”)
(set-terminal-coding-system ‘utf-8)
(set-keyboard-coding-system ‘utf-8)
;; (set-buffer-fils-coding-system ‘utf-8)
(setq default-buffer-file-coding-system ‘utf-8)
(prefer-coding-system ‘utf-8)
(setq file-name-coding-system ‘utf-8)

; NotoSansJP-VariableFont_wght.ttf

;; 下記フォント設定はemacsのoptionから設定してsave
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won’t work right.
‘(package-selected-packages ‘(calfw-howm howm)))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won’t work right.
‘(default ((t (:family “Noto Sans JP” :foundry “ADBO” :slant normal :weight medium :height 121 :width normal)))))

;; 以下追記
(display-time) ;;時計を表示
(global-set-key “\C-h” ‘backward-delete-char) ;;Ctrl-Hでバックスペース
(setq make-backup-files nil) ;;バックアップファイルを作成しない
(setq visible-bell t) ;;警告音を消す
(setq kill-whole-line t) ;;カーソルが行頭にある場合も行全体を削除
;(when (boundp ‘show-trailing-whitespace) (setq-default show-trailing-whitespace t)) ;;行末のスペースを強調表示

; Emacsで自動改行が禁止
(setq text-mode-hook ‘turn-off-auto-fill)

; スプラッシュスクリーンオフ
(setq inhibit-startup-message t)

;;; package.el
(require ‘package)
;; MELPAを追加
(add-to-list ‘package-archives ‘(“melpa” . “https://melpa.org/packages/”))
;; MELPA-stableを追加
(add-to-list ‘package-archives ‘(“melpa-stable” . “https://stable.melpa.org/packages/”))
;; Marmaladeを追加
(add-to-list ‘package-archives ‘(“marmalade” . “https://marmalade-repo.org/packages/”))
;; Orgを追加
(add-to-list ‘package-archives ‘(“org” . “http://orgmode.org/elpa/”))
;; 初期化
(package-initialize)

;;howm設定
(setq howm-menu-lang ‘ja)
(global-set-key “\C-c,,” ‘howm-menu)

(mapc
(lambda (f)
(autoload f
“howm” “Hitori Otegaru Wiki Modoki” t))
‘(howm-menu howm-list-all howm-list-recent
howm-list-grep howm-create
howm-keyword-to-kill-ring))

;; リンクを TAB で辿る
(eval-after-load “howm-mode”
‘(progn
(define-key howm-mode-map [tab] ‘action-lock-goto-next-link)
(define-key howm-mode-map [(meta tab)] ‘action-lock-goto-previous-link)))
;; 「最近のメモ」一覧時にタイトル表示
(setq howm-list-recent-title t)
;; 全メモ一覧時にタイトル表示
(setq howm-list-all-title t)
;; メニューを 2 時間キャッシュ
(setq howm-menu-expiry-hours 2)

;; howm の時は auto-fill で
; (add-hook ‘howm-mode-on-hook ‘auto-fill-mode)

;; RET でファイルを開く際, 一覧バッファを消す
;; C-u RET なら残る
(setq howm-view-summary-persistent nil)

;; メニューの予定表の表示範囲
;; 10 日前から
(setq howm-menu-schedule-days-before 2)
;; 3 日後まで
(setq howm-menu-schedule-days 20)

;; ディレクトリ設定 dropbox 2012-01-27
(setq howm-directory “~/howm”)
(setq howm-keyword-file “~/howm/.howm-keys”)

;; howm のファイル名
;; 以下のスタイルのうちどれかを選んでください
;; で,不要な行は削除してください
;; 1 日 1 ファイルであれば
(setq howm-file-name-format “%Y/%m/%Y-%m-%d.md”)

(setq howm-view-grep-parse-line
“^\(\([a-zA-Z]:/\)?[^:]\.howm\):\([0-9]\):\(.*\)$”)
;; 検索しないファイルの正規表現
(setq
howm-excluded-file-regexp
“/\.#\|[~#]$\|\.bak$\|/CVS/\|\.doc$\|\.pdf$\|\.ppt$\|\.xls$”)

;; いちいち消すのも面倒なので
;; 内容が 0 ならファイルごと削除する
(if (not (memq ‘delete-file-if-no-contents after-save-hook))
(setq after-save-hook
(cons ‘delete-file-if-no-contents after-save-hook)))
(defun delete-file-if-no-contents ()
(when (and
(buffer-file-name (current-buffer))
(string-match “\.howm” (buffer-file-name (current-buffer)))
(= (point-min) (point-max)))
(delete-file
(buffer-file-name (current-buffer)))))

;; http://howm.sourceforge.jp/cgi-bin/hiki/hiki.cgi?SaveAndKillBuffer
;; C-cC-c で保存してバッファをキルする
(defun my-save-and-kill-buffer ()
(interactive)
(when (and
(buffer-file-name)
(string-match “\.howm”
(buffer-file-name)))
(save-buffer)
(kill-buffer nil)))
(eval-after-load “howm”
‘(progn
(define-key howm-mode-map
“\C-c\C-c” ‘my-save-and-kill-buffer)))

;; メニューを自動更新しない
(setq howm-menu-refresh-after-save nil)
;; 下線を引き直さない
(setq howm-refresh-after-save nil)

;; 仮想キーボードの表示
;; デフォルトだと読み取り専用の場所で仮想キーボードが消えてしまう。
;; 参考サイト https://misohena.jp/blog/2025-02-28-try-emacs-for-android.html

(when (eq system-type ‘android)
(setq touch-screen-display-keyboard t))

;; Gboardが日本語入力にならず、geminiに下記を教えてもらった。
;; Andorid版emacs でG-bordで日本語入力をしたいけれど、qwerty配列キーと数字キーしか表示されず、日本語キーボードにならないのはなぜ?
;; .emacsにEmacs側の「システムIME」設定を変更する記述を教えてください
;; 公式のAndroid版Emacs(Emacs 30以降のベース)において、GboardなどのシステムIMEを「日本語キーボード」として正しく動作させるには、「テキスト変換(Text Conversion)」機能を有効にする設定が必要です。
;; Emacsはデフォルトでは、IMEの干渉を避けるために「生のキーボード」として振る舞いますが、これを有効にすることでAndroidシステムに対し「ここはテキスト入力欄である」と正しく伝え、日本語入力を呼び出せるようになります。

(when (eq system-type ‘android)
;; システムIME(Gboard等)によるテキスト入力・変換を有効にする
(setq-default text-conversion-style t)

;; IMEが勝手に隠れたり挙動が不安定な場合の対策(オプション)
(setq android-system-ime-is-fickle t))

;; Emacs 30で導入される modifier-bar-mode は、修飾キー(Ctrl, Alt, Metaなど)の状態をツールバーに表示・切り替え可能にするモードで、設定するには.emacs(またはinit.el)に (global-modifier-bar-mode 1)を追記
;; emacs 上部にCtrlなどのキーが表示される

(modifier-bar-mode 1)

上記設定の上、Android版emacsのほうへ。

M-x list-package
カーソルをhowmの行に移動し、iキーでインストールマークを付ける
xキーを押して、インストール実行

なお、mozcがインストールできるので、日本語入力をmozcで行うことを検討していたのだけど、mozc_emacs_helperがないので無理、となった。

Emacs 起動
C-c , ,
howm起動!

おおぅ
少し感動

その昔、Linux Zaurusでemacsでhowm使っていた。
物理キーがないから操作はしずらいかな。

改めてtermuxへ
$ pkg install rsync

$ ln -s /data/data/org.gnu.emacs/files/howm /data/data/com.termux/files/home/howm

$ rsync -avz -e ssh ユーザー名@サーバー名:/home/ユーザ名/howm/ ~/howm/

いつものhowmデータと同期
PCで作るファイルは拡張子howm、Android側で作るファイル拡張子はmdとして同一の日付名称でもファイルによる重複を避けるようにした。

ようやく納得のいくメモ取り環境になったかな。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です