对比 Android-native Emacs 和 Termux中安装的emacs

三星galaxy tab s8+,12.4 的设备,目前计划主要是移动端写作和笔记。

笔记方面,orgzly我没有办法显示图片,Logseq的性能欠佳,解析大文件太卡顿。 写作方面,需要参考已有的笔记等资料,所以纯粹的写作软件不适合我。

GUI版无法弹出键盘的问题有解决方案吗? touch-screen-display-keyboard 的设置不起作用

这里不是应该运行 ./doom install 吗? doom 中的 shebang 可能也需要调整一下。

touch-screen-display-keyboard 具体怎么不起作用?

(setq touch-screen-display-keyboard t) 这样设置之后点击GUI版启动之后的scratch,仍旧无法弹出键盘。 我用的是unexpected keyboard

点击的是 scratch 还是 *GNU Emacs* 启动界面?

我关注更多的是应用层,底层所知不多,抱歉可能会问一些蠢问题。

不管是doom, ./doom,或者是绝对路径在emacs的shell中执行都提示找不到:

:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ ls
ls
doom  doom.cmd	doomscript  org-capture  org-tangle
:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ ./doom install
./doom install
/system/bin/sh: ./doom: No such file or directory
126|:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ doom
doom
/system/bin/sh: /data/data/com.termux/files/usr/bin/doom: No such file or directory
:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ /data/data/org.gnu.emacs/files/.emacs.d.doom/bin/doom
/data/data/org.gnu.emacs/files/.emacs.d.doom/bin/doom
/system/bin/sh: /data/data/org.gnu.emacs/files/.emacs.d.doom/bin/doom: No such file or directory

但是ls看是有的,这让我很困惑。 在termux中运行doom提示找不到emacs,这意味着至少doom是能正常找到的。而在emacs中,libandroid-emacs.so映射的emacs可以执行:

:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ emacs --version
emacs --version
GNU Emacs 30.0.50
Copyright (C) 2024 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

termux安装的工具链也可以在emacs中调用

:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ which git
which git
/data/data/com.termux/files/usr/bin/git

但就是找不到doom……

另外,termux安装的工具链有的能用,有的不能,例如mpv就会报错:

CANNOT LINK EXECUTABLE "mpv": cannot locate symbol "_Z17createHeifDecoderv" referenced by "/system/lib64/libhwui.so"

安卓Emacs感觉挺底层的,只是读了安装说明还不够,确实需要研究一下manual 中android的部分🤦🏻‍♀️

:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin $ emacs --version
emacs --version
GNU Emacs 30.0.50
Copyright (C) 2024 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

./doom 可能需要调整其中的 shebang,将:

#!/usr/bin/env sh

改变为

#!/system/bin/sh

CANNOT LINK EXECUTABLE "mpv": cannot locate symbol "_Z17createHeifDecoderv" referenced by "/system/lib64/libhwui.so"

可能需要去除 .emacs 中的 (setenv "LD_LIBRARY_PATH…

点击的是scratch 是不是要点GNU Emacs的欢迎页才行?

不是,你的设备有没有连接或自带硬件键盘?

在我看来,是以下这个问题没有彻底解决好,相比emacs下不够灵活,所以直接放弃

非常感谢!MPV的问题已经解决。

doom-emacs虽然还没有成功安装,但是至少开始执行,看上去是在正确的方向。目前git命令执行出错:

/data/data/org.gnu.emacs/files/.emacs.d.doom/bin/doom install
Installing Doom Emacs!

- Skipping /storage/4A21-0000/dotfiles/.doom.d/ (already exists)
  - Skipping init.el (already exists)
  - Skipping config.el (already exists)
  - Skipping packages.el (already exists)
- Envvar file already exists, skipping
Installing plugins
> Installing packages...
  > Updating recipe repos...

Error: error ("Failed to run \"git\"; see buffer *straight-process*")
  signal(error ("Failed to run \"git\"; see buffer *straight-process*"))
  error("Failed to run %S; see buffer %s" "git" "*straight-process*")
  (if success (let ((output (concat stdout stderr))) (if straight--process-trim (string-trim output) output)) (error "Failed to run %S; see buffer %s" program straight-process-buffer))

    x The package manager threw an error
    x Last 16 lines of straight's error log:
      $ cd /data/data/org.gnu.emacs/files/.emacs.d.doom/.local/straight/repos/melpa/
      $ git rev-parse HEAD
      [Return code: 127]
    ! Wrote extended straight log to ~/.emacs.d.doom/.local/state/logs/cli.doom.240126180427.17784.error
    ✓ Finished in 10.15682s
255|:/data/data/org.gnu.emacs/files $ 

试着在emacs shell中执行,没有问题。

      $ cd /data/data/org.gnu.emacs/files/.emacs.d.doom/.local/straight/repos/melpa/
      $ git rev-parse HEAD

看了下doom的env文件,termux bin加入到PATH变量了

 "LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib:/data/app/~~FOrmtXdz6CyU88YA-WPLlA==/org.gnu.emacs-DGEUkxV3UgrhX0UlLlMaAg==/lib/arm64"
 "PATH=/data/data/com.termux/files/usr/bin:/data/data/org.gnu.emacs/files/.emacs.d.doom/bin:/data/data/com.termux/files/usr/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin"
 "SHELL=/system/bin/sh"

尝试执行doom-call-process “git” 也是正常的

 (doom-call-process "git" "-C" "/data/data/org.gnu.emacs/files/.emacs.d.doom/.local/straight/repos/melpa/" "rev-parse" "HEAD")

还在研究doom的机制,但是说实话,doom这种方式在android emacs上没有Spacemacs友好啊

又学到了,才知道doom原来是可以编辑的,emacs原来也可以有这种类似python argparser的功能。

那确实,感谢指出问题所在,我不会为兼容orgzly去改现有的文件。

还是接着折腾android emacs吧,至少现在已经可以正常显示中文和图片了

再次感谢 @oldosfan 的工作!

把 android-use-exec-loader 设置为 nil 能解决吗?

好像eshell可以,shell会报错?我再跑跑

现在复现不了之前(“Failed to run "git"; see buffer straight-process”) 的错误,就算android-use-exec-loader 设置为 t,在eshell还是shell都能跑成功。没太搞明白原因。

在您的帮助下,doom-emacs已经成功安装在android emacs!非常感谢!

接下来就是优化调整了,处理一下字体、按键、package的兼容问题。等我整理一下在单独发一篇说明如何在android emacs中使用doom-emacs。

此外,发现加载lsp会报错:

debug-init 发现是因为lsp-mode中有调用:

(defvar lsp-json-rpc-mutex (make-mutex))

而make-mutex函数在android emacs中不存在。

这是否意味着在android emacs无法使用lsp?

是的,目前建议用 Eglot.

没有连接或自带硬件键盘

lsp-mode 应该可以使用了。

不知道是换了输入法还是换了emacs版本,又不需要控制evil-insert-state了,直接normal下能了 下面是原来的方案:

我是用evil的,evil情况下默认即使设置 touch-screen-display-keyboard 为t后 点scratch确实默认弹不出键盘,如果切换到其他页面后,最小化app重新进来就能弹出键盘了。我的解决方法是判断在android后,当前buffer是scrtach后,evil切换成insert,就能弹出键盘了

(defun android-insert()
  ;; 在这里添加您要执行的命令或配置
  (when (equal (buffer-name) "*scratch*")
    (evil-insert-state)
    (message "default insert in scratch")
    )
  )
(when (string-equal system-type "android")
    (add-hook 'emacs-startup-hook 'android-insert)
)