Emacs Issue

前言

这个文章是 记录个人使用 Emacs 相关信息/问题

它可能不适用于所有人

这可能会给遇到相同问题时的 Emacser 有所帮助!

如果你遇到了某些 Emacs 相关问题, 并解决了, 可以在下面 评论区 记录下来, 我会尝试添加到文章当中

Issue

Minibuffer 如何换行?

C-q C-j

让 Minibuffer 支持使用 拼音 查找

  • 例如在 org-mode 中使用 consult-imenu 命令时, 弹出的内容可以使用 拼音 查找
  • 以下方法本人是使用 orderless, vertico, consult, 三个包配合用的
(use-package vertico
  :ensure t
  :hook (after-init . vertico-mode))
(use-package consult :ensure t)
(use-package orderless
  :ensure t
  :config
  (setq completion-styles '(orderless basic)
        completion-category-defaults nil
        completion-category-overrides '((file (styles partial-completion))))

  ;; 对 vertico 进行拼音查找, 全拼的第一个字母, 例如找 配置, 输入 pz 两个字母
  (defun completion--regex-pinyin (str)
    (orderless-regexp (pinyinlib-build-regexp-string str)))
  (add-to-list 'orderless-matching-styles 'completion--regex-pinyin)
  )
;; 如果使用的 小鹤双拼, 可以使用 https://github.com/ISouthRain/pinyinlib.el 仓库, 配置:   (setq pinyinlib-use-method 'xiaohe)

Windows org-mode 使用 GnuPG(GPG) 加密后无法解密, 加密信息出现 ^M

  • 比如使用 org-crypt 这个包进行 GPG 加密时, 却无法解密
  • 原因是 文件换行符 问题, Windows 系统的默认换行符是 CRLF, 只需将 CRLF 改为再加密就不会出现 CRLF
  • 方法一: 添加函数, 删除 ^M 结尾的信息再进行解密
;; 解决 ^M 解密问题
(defun freedom-org-decrypt-entry ()
  "移除行尾 ^M(CRLF) 并解密 Org-decrypt Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
  (goto-char (point-min))
  (while (search-forward "\r" nil t) (replace-match ""))
  (org-decrypt-entry))
  • 方法二: 加密之前 将文件的换行符改为 LF , 例如: C-x <RET> f utf-8-unix <RET>

Windows Emacs 使用 Daemon 方式打开文件时, 文件名乱码导致无法打开对应文件

  • 我使用添加以下配置修复
    (require 'server)
    ;; 如果没有启动 daemon server 就启动
    (unless (server-running-p)
      (server-start))
    ;; 防止 windows 使用 server 打开中文文件名乱名导致无法打开文件
    (when (eq system-type 'windows-nt)
      (setq locale-coding-system 'gb18030)  ;此句保证中文字体设置有效
      (setq w32-unicode-filenames 'nil)       ; 确保file-name-coding-system变量的设置不会无效
      (setq file-name-coding-system 'gb18030) ; 设置文件名的编码为gb18030
      )
    

Org-mode 的 Table 表格没有对齐问题

(when (eq system-type 'darwin)
  (setq fonts '("SF Mono" "冬青黑体简体中文"))
  (set-fontset-font t 'unicode "Apple Color Emoji" nil 'prepend)
  (set-fontset-font t 'unicode "Hack Nerd Font Mono" nil 'append)
  (set-face-attribute 'default nil :font
                      (format "%s:pixelsize=%d" (car fonts) 16k)))

(when (eq system-type 'windows-nt)
  ;; (setq fonts '("Iosevka" "霞鹜文楷"))
  (setq fonts '("Iosevka" "微软雅黑"))
  (set-fontset-font t 'unicode "Segoe UI Emoji" nil 'prepend)
  (set-fontset-font t 'unicode "Segoe UI Symbol" nil 'append)
  (set-fontset-font t 'unicode "Hack Nerd Font Mono" nil 'append)
  (set-face-attribute 'default nil :font
                      (format "%s:pixelsize=%d" (car fonts) 20)));; 只有 双数 才能 对齐

(when (eq system-type 'gnu/linux)
  (unless IS-Termux
    (setq fonts '("Iosevka" "微软雅黑"))
    (set-fontset-font t 'unicode "Segoe UI Emoji" nil 'prepend)
    (set-fontset-font t 'unicode "Segoe UI Symbol" nil 'append)
    (set-fontset-font t 'unicode "Hack Nerd Font Mono" nil 'append)
    (set-face-attribute 'default nil :font
                        (format "%s:pixelsize=%d" (car fonts) 20))))

(if (display-graphic-p)
    (dolist (charset '(kana han symbol cjk-misc bopomofo))
      (set-fontset-font (frame-parameter nil 'font) charset
                        (font-spec :family (car (cdr fonts))))))

Ripgrep 无法搜索中文

  • 例如使用以下命令无法搜索中文:
    • consult-ripgrep
    • ripgrep-regexp
;; 解决 ripgrep 无法搜索中文和 consult-ripgrep 无法搜索中文
(setq default-process-coding-system '(utf-8-unix . gbk)) ;; 默认(utf-8-dos . utf-8-unix)