用安卓native emacs+termux emacs,抛砖引玉说一下我体验emacs everywhere的个人指南

首先感谢一波oldosfan做的安卓native emacs,更新频繁,功能又多

结合社区各个插件,结合termux 版emacs 和native emacs总体上已达到了比较丝滑的享受

安卓版和termux版可以共用一套配置,做好软链接就能省文件体积

平时安卓版本就能带着随便用,当有大屏如pc设备,如果有wifi的,就能通过ttyd+termux网页访问emacs,遇上不能联网的,还能adb scrcpy直接连接安卓版 emacs,文件随时不中断。不管大屏设备是linux mac 还是windows,都有方法连接上手机的emacs,我感觉速度比windows emacs快多了,哈哈哈

我最初是用vim,后来spacemacs,后来doomemacs,现在自己的配置

在安卓上,我绑了 音量+作为ctrl键,音量-作为tab键,(C-i虽然也是tab,但是毕竟没tab快)

结合evil+general,给SPC绑了一堆功能,活用叠键减少手指一动, SPC SPC是projetile-find,方便查找文件,SPC x x是原来的M-x,SPC t t是toggle terminal,SPC g g是magit status,SPC x e是原来的C-x C-e

org下对于head的移动 SPC o (HJKL) 来升级降级上下移动 包括还有插入 SPC i h来插入heading

字体用了cnfonts,加了触摸屏支持,整体放大缩小调节起来比较方便,普通的移动就直接用手指头了

文件项目管理我直接用 tab-bar + centaur-bars 两个一起,可以形成上下两个tabs,切换起来也方便

文件同步我就用git,写了当侦测到.git的时候自动git pull,保障打开文件的时候是最新的

发个配置 .emacs.d_my 因为有时候要方便抄代码,所以路径写成了 .emacs.d_my

6 个赞

操作录屏1文件编辑项目切换

操作录屏2 magit等

操作录屏3(org-mode)

termux 也有 X 版的emacs, 结合 termux-x11, 显示效果出色,和使用vnc相比,几乎无延迟。

几乎接近 linux 使用体验。 pdf-tool 之类 需要图形的包也可以用。

注意事项:

  1. 如果, termux-x app 显示空白, 只有鼠标可以动。 termux 中 启动 加上 -legacy-drawing 试试。

  2. termux 下的 pip 包是独立的,不是公有的架构。所以,有些包会装不上。 解决方法,比较复杂,要装proot 版的 linux系统,我没有具体用过。

可以参考以下的配置, 国内直接用他的脚本,网络问题,容易失败。

termux的emacs-x我也用的,我也是自己的脚本安装了xfce + vnc,然后直接用novnc跑一个网页来访问vnc,做到浏览器上直接打开,但是感觉稍微有点延迟 我平时的老手机有点旧,换了一个865芯片的手机就感觉不到延迟了

所以我 ssh下TUI noVNC下emacsx的GUI和android native下的GUI都有在用

有时候我甚至用termux中的firefox来上网,做到网络隔离

不好意思,上面的回复,没有表达清楚(已经修改了下)。 本想,强调 termux-x11的方案的。

termux-x11没有使用 vnc 和 ssh 的方法。 个人感觉 termux-x11 和 android native 的显示效果,基本一致。 当然,手势支持,不能和android native 版比较。

1 个赞

Termux 版本也无法访问通过 SAF 提供的储存,或使用系统自带的窗口管理器。

为了配合安卓native Emacs, 我也安装了带有相同emacs keysotre签名的termux。遗憾的是,没法再安装F-droid上的termux相关的其他插件,如termu-api。请教这方面您有解决方案吗

可以用 https://git.savannah.gnu.org/cgit/emacs.git/tree/java/emacs.keystore 重新签名 termux-api

主要是不会签名app这个操作。请教有相关教程吗?

卡在了获取emacs keystore的alias这一步:

>java -jar uber-apk-signer-1.3.0.jar -a api.apk --ks ./emacs.keystore -o api-signed.apk
must provide alias if keystore is given for sign config 0

>"C:\Program Files\Java\jre1.8.0_361\bin\keytool.exe" -list -v -keystore emacs.keystore
keytool error: java.io.IOException: toDerInputStream rejects tag type 60
java.io.IOException: toDerInputStream rejects tag type 60
        at sun.security.util.DerValue.toDerInputStream(Unknown Source)
        at sun.security.pkcs12.PKCS12KeyStore.isPasswordless(Unknown Source)
        at sun.security.tools.keytool.Main.doCommands(Unknown Source)
        at sun.security.tools.keytool.Main.run(Unknown Source)
        at sun.security.tools.keytool.Main.main(Unknown Source)

alias 为 “Emacs keystore”,密码是 emacs1

1 个赞

请问,您是通过什么方法,把音量键映射成ctrl的呢?

;;改成音量上改ctrl

(define-key key-translation-map (kbd “”) #'tool-bar-event-apply-control-modifier)

;;音量下改tab

(define-key key-translation-map (kbd “”) (kbd “TAB”))

1 个赞

貌似还需要一次密码: Please enter the key password for config [0] alias ‘Emacs keystore’ and keystore ‘./emacs.keystore’:

E:\New folder>java -jar uber-apk-signer-1.3.0.jar -a api.apk --ks ./emacs.keystore --ksAlias "Emacs keystore" -o api-signed.apk
source:
        E:\New folder
binary-lib/windows-33_0_2/libwinpthread-1.dll
C:\Users\ADMINI~1\AppData\Local\Temp\uapksigner-3225727481626847506
zipalign location: BUILT_IN
        C:\Users\ADMINI~1\AppData\Local\Temp\uapksigner-3225727481626847506\win-zipalign_33_0_2.exe8613112883617323995.tmp
keystore:
Please enter the keystore password for config [0] './emacs.keystore':

Please enter the key password for config [0] alias 'Emacs keystore' and keystore './emacs.keystore':

        [0] f2f5a9df E:\New folder\emacs.keystore (RELEASE_CUSTOM)

01. api.apk
        - already signed SKIP

[Mon May 27 07:00:25 CST 2024][v1.3.0]
Successfully processed 0 APKs and 1 errors in 0.34 seconds.

另外再请教一下,有时候安卓native Emacs卡住,强制退出,然后再打开就会闪退。这时候我一般就只能重装了。请教有没有更好的办法。

收到,试了一下,确实可以。多谢!

上面说了,密码是 “emacs1”,无括号

能提供 logcat 吗?

我两次都输入了这个密码,但仍旧得到同样的结果:

Please enter the key password for config [0] alias 'Emacs keystore' and keystore './emacs.keystore':

        [0] f2f5a9df E:\New folder\emacs.keystore (RELEASE_CUSTOM)

01. api.apk
        - already signed SKIP

[Mon May 27 16:34:38 CST 2024][v1.3.0]
Successfully processed 0 APKs and 1 errors in 0.35 seconds.

这里的提示是already signed SKIP,我得先去掉termux-api.apk的签名,才能重新签对吗?

按照这个android - Can I re-sign an .apk with a different certificate than what it came with? - Stack Overflow 教程重新签名,得到报错:

E:\New folder
λ java -jar uber-apk-signer-1.3.0.jar -a api.apk --ks ./emacs.keystore --ksAlias "Emacs keystore" -o api-signed.apk
source:
        E:\New folder
binary-lib/windows-33_0_2/libwinpthread-1.dll
C:\Users\ADMINI~1\AppData\Local\Temp\uapksigner-1008921029735434035
zipalign location: BUILT_IN
        C:\Users\ADMINI~1\AppData\Local\Temp\uapksigner-1008921029735434035\win-zipalign_33_0_2.exe2132147367002101563.tmp
keystore:
Please enter the keystore password for config [0] './emacs.keystore':

Please enter the key password for config [0] alias 'Emacs keystore' and keystore './emacs.keystore':

        [0] f2f5a9df E:\New folder\emacs.keystore (RELEASE_CUSTOM)

01. api.apk

        SIGN
        file: E:\New folder\api.apk (2.6 MiB)
        checksum: 60461669a5b414feaf4859bb034bd7a0f4c68e2027c640963023340c3369219 (sha256)
        - zipalign success
Failed to load signer "signer #1"
java.io.IOException: Invalid keystore format
        at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
        at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
        at sun.security.provider.KeyStoreDelegator.engineLoad(Unknown Source)
        at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(Unknown Source)
        at java.security.KeyStore.load(Unknown Source)
        at com.android.apksigner.SignerParams.loadKeyStoreFromFile(SignerParams.java:362)
        at com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:248)
        at com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(SignerParams.java:181)
        at com.android.apksigner.ApkSignerTool.getSignerConfig(ApkSignerTool.java:419)
        at com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:336)
        at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:92)
        at at.favre.tools.apksigner.SignTool.sign(SignTool.java:314)
        at at.favre.tools.apksigner.SignTool.execute(SignTool.java:150)
        at at.favre.tools.apksigner.SignTool.mainExecute(SignTool.java:45)
        at at.favre.tools.apksigner.SignTool.main(SignTool.java:33)

这个 uber-apk-signer 是什么玩意儿?我建议使用官方 SDK 的 “apksigner”: apksigner  |  Android Studio  |  Android Developers