怎么使用原生 Android 版本的 Emacs: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
Tags: Mobile edit Mobile web edit
 
(52 intermediate revisions by the same user not shown)
Line 25: Line 25:


== 文件夹 ==
== 文件夹 ==
怎么让安卓版本的 Emacs 访问你的安卓里的文件夹呢?
怎么让原生安卓版本的 Emacs 访问你的安卓里的文件夹呢?
<syntaxhighlight lang="elisp">
<syntaxhighlight lang="elisp">
# 授予管理所有文件的权限
# 授予管理所有文件的权限
Line 34: Line 34:
</syntaxhighlight>
</syntaxhighlight>


== 设置工作目录 ==
== 字体 ==
<syntaxhighlight lang="elisp">
怎么让原生安卓版本的 Emacs 识别并正常显示中文字体,而不是 16 进制的字符块呢?
(setq default-directory "/sdcard/Emacs/")
 
</syntaxhighlight>
首先,去下载某个字体。


其次,把它复制进原生安卓版本的 Emacs 的私有目录下的 fonts 文件夹。
<syntaxhighlight lang="elisp">
<syntaxhighlight lang="elisp">
M-x setenv RET HOME RET /sdcard/Emacs
M-x mkdir RET fonts
M-x copy-file RET /sdcard/Downloads/NotoSansSC-Regular.ttf RET ~/fonts/NotoSansSC-Regular.ttf RET
</syntaxhighlight>
</syntaxhighlight>


再次,验证 Emacs 是否看到了你复制进去的字体。
<syntaxhighlight lang="elisp">
<syntaxhighlight lang="elisp">
;; ---------------------------
(insert
;; Android: 将新建文件的默认目录设为 /storage/sdcard0/Emacs/
"\n"
;; 直接粘贴到 init.el 并尽早加载(建议放文件头部)
(mapconcat
;; ---------------------------
  #'identity
 
   (seq-filter (lambda (font)
 
                 (or (string-match-p "SC" font)
(defvar my-android-emacs-dir "/storage/sdcard0/Emacs/"
                    (string-match-p "wqy" font)
  "默认用于新建文件的目录(Android)。")
                    (string-match-p "WenQuanYi" font)))
 
              (font-family-list))
;; 1) 对未来 buffer 生效
  "\n")
(setq-default default-directory (expand-file-name my-android-emacs-dir))
"\n")
 
;; 2) 尝试创建该目录(若权限允许),失败则给出提示
(condition-case err
    (unless (file-directory-p (expand-file-name my-android-emacs-dir))
      (make-directory (expand-file-name my-android-emacs-dir) t)
      (message "Created directory: %s" (expand-file-name my-android-emacs-dir)))
   (error
  (message "无法在 %s 创建目录:%s 。若为权限问题,请运行 M-x android-request-directory-access 并选择该目录,或在系统设置中为 Emacs 打开 All files access。"
            (expand-file-name my-android-emacs-dir) err)))
 
;; 3) 启动后把已经存在的 buffer 的 default-directory 也改掉(确保 *scratch* 等被覆盖)
(add-hook 'emacs-startup-hook
          (lambda ()
            (let ((d (expand-file-name my-android-emacs-dir)))
              (dolist (buf (buffer-list))
                 (with-current-buffer buf
                  (setq default-directory d))))))
 
;; 4) 确保 minibuffer 在调用 find-file 时也使用该目录
(defun my-android-find-file-minibuffer-setup ()
  "在用 find-file 打开 minibuffer 时把 default-directory 设为 my-android-emacs-dir。"
  (when (memq this-command '(find-file find-file-other-window))
    (setq default-directory (expand-file-name my-android-emacs-dir))))
(add-hook 'minibuffer-setup-hook #'my-android-find-file-minibuffer-setup)
 
;; 5) 辅助函数:检查访问并提示如何授权
(defun my-android-ensure-emacs-dir-access ()
  "检查 /storage/sdcard0/Emacs/ 是否可访问;若不可访问,提示下一步操作。"
  (interactive)
  (let ((d (expand-file-name my-android-emacs-dir)))
    (cond
    ((file-directory-p d)
      (message "目录可访问:%s" d))
    ((fboundp 'android-request-directory-access)
      (message "目录不可访问:%s。运行 `M-x android-request-directory-access` 并在选择器中选择该目录以授权 Emacs 访问。" d))
    (t
      (message "目录不可访问:%s。请在 系统 → 应用 → 特殊应用访问 → All files access 中为 Emacs 打开权限,并授予「文件与媒体」权限。" d)))))


;; 可选:绑定一个快捷键,方便调用检查
(global-set-key (kbd "C-c e d") #'my-android-ensure-emacs-dir-access)
</syntaxhighlight>
</syntaxhighlight>
== 字体 ==
怎么让原生安卓版本的 Emacs 识别并正常显示中文字体,而不是 16 进制的字符块呢?
首先,去下载某个字体。
其次,把它复制进原生安卓版本的 Emacs 的工作目录下的 fonts 文件夹。


最后,在 ~/.emacs.d/init.el 里调用该字体。
最后,在 ~/.emacs.d/init.el 里调用该字体。
Line 110: Line 67:
(set-language-environment "UTF-8")
(set-language-environment "UTF-8")


(set-face-attribute 'default nil :height 300)
;; 因为屏幕素质不同,字体设计时字高不同,emacs 也不一定按屏幕真实 DPI 来渲染
(set-fontset-font t 'han "Noto Sans SC:pixelsize=50")
;; 所以追求数学上相近的比如都 30pt 没用
;; 得看不同屏幕上的实际观感来确定中英文的不同 pt
(set-face-attribute 'default nil :height 240) ;; 单位 1/10 pt
(set-fontset-font t 'han (font-spec :family "Noto Sans SC" :size 40)) ;; 单位 1 pt
</syntaxhighlight>
</syntaxhighlight>


== 美化 ==
<syntaxhighlight lang="elisp">
(setq inhibit-startup-message t)
(setq make-backup-files nil)  ;; 禁止生成 xxx~
(setq auto-save-default nil)  ;; 禁止生成 #xxx#
(setq create-lockfiles nil)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(global-auto-revert-mode t)
(setq suggest-key-bindings 10) ;十秒后建议才消失
(add-hook 'dired-mode-hook  'dired-hide-details-mode t)
(defalias 'yes-or-no-p 'y-or-n-p)


私有目录,一般是 /data/data/org.gnu.emacs/files/fonts。
;; 之前我一直在纠结 Emacs 处理安卓公开目录如 /storage/sdcard0/Emacs 时会导致 Find file 有长长的路径。洗把脸发现嫌弃路径长我自己写个短路径不就行了吗
<syntaxhighlight lang="elisp">
(setq initial-buffer-choice (lambda () (dired "/sdcard/a/")))
M-x copy-file RET /sdcard/Downloads/NotoSansSC-Regular.ttf RET ~/fonts/NotoSansSC-Regular.ttf RET
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 00:52, 3 October 2025

原生安卓版本的 Emacs,令安卓上的编程出现了很大的想象力。或许未来,在安卓上编程,会成为更方便的事情。以前,大家都绕道,用 Termux 安装 Emacs,终究是隔了一层。现在,gnu 本身发布了原生安卓版本的 Emacs,可以从 FDroid 分流下载。但是安装后,你会发现你遇到了重重难题。

不迷路

怎么让自己不迷路,知道自己在哪里?

# 查看 HOME 环境变量
M-: (getenv "HOME")
# 示例输出"/data/data/org.gnu.emacs/files"

# 查看 ~ 的展开路径
M-: (expand-file-name "~")
# 示例输出"/data/data/org.gnu.emacs/files"

# 查看工作起始目录
M-: default-directory
# 示例输出"~/"

# M-: 运行命令
# 注意 default 别写成 defualt
# 评估变量不用括号
# 调用函数要括号
# 输出就算一样也是各有所用并不重复
# 可以单独设置

文件夹

怎么让原生安卓版本的 Emacs 访问你的安卓里的文件夹呢?

# 授予管理所有文件的权限
M-x android-request-storage-access

# 授予管理某个文件夹的权限
M-x android-request-directory-access

字体

怎么让原生安卓版本的 Emacs 识别并正常显示中文字体,而不是 16 进制的字符块呢?

首先,去下载某个字体。

其次,把它复制进原生安卓版本的 Emacs 的私有目录下的 fonts 文件夹。

M-x mkdir RET fonts
M-x copy-file RET /sdcard/Downloads/NotoSansSC-Regular.ttf RET ~/fonts/NotoSansSC-Regular.ttf RET

再次,验证 Emacs 是否看到了你复制进去的字体。

(insert
 "\n"
 (mapconcat
  #'identity
  (seq-filter (lambda (font)
                (or (string-match-p "SC" font)
                    (string-match-p "wqy" font)
                    (string-match-p "WenQuanYi" font)))
              (font-family-list))
  "\n")
 "\n")

最后,在 ~/.emacs.d/init.el 里调用该字体。

(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8-unix)
(set-language-environment "UTF-8")

;; 因为屏幕素质不同,字体设计时字高不同,emacs 也不一定按屏幕真实 DPI 来渲染
;; 所以追求数学上相近的比如都 30pt 没用
;; 得看不同屏幕上的实际观感来确定中英文的不同 pt
(set-face-attribute 'default nil :height 240) ;; 单位 1/10 pt
(set-fontset-font t 'han (font-spec :family "Noto Sans SC" :size 40)) ;; 单位 1 pt

美化

(setq inhibit-startup-message t)
(setq make-backup-files nil)   ;; 禁止生成 xxx~
(setq auto-save-default nil)   ;; 禁止生成 #xxx#
(setq create-lockfiles nil)

(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)

(global-auto-revert-mode t)
(setq suggest-key-bindings 10) ;十秒后建议才消失

(add-hook 'dired-mode-hook  'dired-hide-details-mode t)
(defalias 'yes-or-no-p 'y-or-n-p)

;; 之前我一直在纠结 Emacs 处理安卓公开目录如 /storage/sdcard0/Emacs 时会导致 Find file 有长长的路径。洗把脸发现嫌弃路径长我自己写个短路径不就行了吗
(setq initial-buffer-choice (lambda () (dired "/sdcard/a/")))