最近、開発環境を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