« ^ »

AndroidのアプリケーションをEmacsから起動できるようにする

所要時間: 約 3分

最近、開発環境をAndroidにできるかどうかを試している。例えば文章の執筆のような作業というのは、PCほどのマシンパワーがなくても作業はできる。必要なのは拡張性の高いエディタだった。ただEmacsはAndroid上でも動作するため、多少の支障はあれど、使えないという程ではなかった。Dockerといったコンテナ技術や、QEMUなどのVM、又はPythonでWebサーバを起動するといったような作業は、Android上で行うにはパワー不足や、様々な制約によってやりづらい。そういった作業はPCで行う方が良さそうだった。

Androidでの開発で問題だった小さい画面は、ヘッドマウントディスプレイを使いお茶を濁したのだけれど、これはこれで慣れると悪くなかった。広い画面というのは、様々なものを表示できるけれど、一方でそれによって気が散るという問題もある。

僕は元々現在の作業以外の情報が表示されないような工夫をEmacsにしていた。それこそモードラインも消していた。消す事で不都合もあたけれど、「気が散る」という最大の不都合の影響を小さく出来た事は大きな成果だった。Androidではカーソル色を変更できないという点で、モードラインを消せてはいないけれど、それは今回の話とは直接関係がないので、別の機会に書く事にする。

話を戻す。今までmacOSで作業をしていた時も、Emacsを起点にしていた。Webブラウザやチャットアプリを開く時、 M-x macos-app とし、アプリケーションを選択する事で起動していた。macOSからAndroidに主戦場を移したため、macOSと同様にEmacsからAndroidアプリを起動できるようにする事にした。

調べた所、 am start -n アプリケーション名 のようなコマンドを実行する事で、アプケーションを起動できる事が分かった。アプリケーション名は単純な名前ではなく、 com.package.name/com.package.name.ActivityName のような形式の名前になる。

例えばGoogleマップは com.google.android.apps.maps/com.google.android.maps.MapsActivity という名前らしい。この名前の調べ肩は今の所よく分からないけれど、現時点でアプリケーション起動用のラッパーコマンドは作成できる。そこで今出来る範囲で小さなEmacs Lispを書く事にした。

android.el

;;; android --- Android Utility. -*- lexical-binding: t -*-

;; Copyright (C) 2024 TakesxiSximada

;; Author: TakesxiSximada <[email protected]>
;; Maintainer: TakesxiSximada <[email protected]>
;; Version: 1
;; Package-Version: 20240506.0000
;; Package-Requires: ((emacs "29.1"))
;; Date: 2024-05-06

;; This file is not part of GNU Emacs.

;;; License:

;; This program is free software: you can redistribute it and/or
;; modify it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with this program.  If not, see
;; <https://www.gnu.org/licenses/>.

;;; Code:

(defcustom android-app-buffer-name "*Android App*"
  "Buffer name of open command"
  :group 'android
  :type 'string)

(defvar android-app-list nil)

(defvar android-app-process nil)

(defun android-app-refresh ()
  (interactive)
  (setq android-app-list
	'("com.google.android.apps.maps/com.google.android.maps.MapsActivity")))

;;;###autoload
(defun android-app (&optional app)
  "Start Android application from Emacs"
  (interactive (list (completing-read "Application: " android-app-list)))

  (setq android-app-process
	(make-process :name "*App*"
		      :buffer (get-buffer-create android-app-buffer-name)
  		      :command `("am" "start" "-n" ,app)
  		      )))

(provide 'android)
;; android.el ends here