跳转到内容
来自 Arch Linux 中文维基

本文主要讲解了在使用 Emacs 的过程中可能遇到的问题及其解决方案。

Emacs 启动失败,提示错误信息 'Undefined color: "WINDOW_FOREGROUND"'

您需要安装 mcpp 软件包或 gcc 软件包。xrdb 使用 C 预处理器 cppX 资源进行预处理。如果系统中未安装 C 预处理器,xrdb 会自动跳过运行 C 预处理器,并且符号 WINDOW_FOREGROUND 不会扩展为十六进制颜色代码。

使用 Gccemacs 时 Emacs systemd 服务无法启动

使用 Gccemacs(分支 emacs-native-comppgtk-nativecomp)并尝试为其启动 systemd 服务时,可能会记录一条提示未找到 .eln 文件的错误信息:

$ journalctl --user -xb -g eln
emacs[7507]: emacs: ../native-lisp/28.0.50-x86_64-pc-linux-gnu-fc9c33938bf279333039c28064d363e8/lisp-mode-410874a46ab8852855281f021ca61fe7-1738806322de892570d69dfc55b437c2.eln: cannot open shared object file: No such file or directory

作为一种解决方法,编辑 emacs.service中 [Service] 部分的 WorkingDirectory 行。

emacs.service
[Service]
...
WorkingDirectory=/usr/lib/emacs/28.0.50/x86_64-pc-linux-gnu/
...
注意:必须在可能存在的 Restart 参数之前定义 WorkingDirectory 参数。

彩色输出问题

默认情况下,Emacs shell 会显示用于打印颜色的原始转义序列。换句话说,它会显示奇怪的符号来代替所需的彩色输出。

~/.emacs 中加入以下内容后,问题就迎刃而解了:

(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

在 X 窗口中显示字符的问题

如果在 X 窗口中启动 emacs 时,主窗口中的所有字符都是带黑边的白框(即在尝试查看未安装正确字体的字符时看到的白框),则需要安装 xorg-fonts-75dpi 和/或 xorg-fonts-100dpi 并重启 X 窗口。

启动缓慢

提示:为了减少启动时间,用户可以考虑运行 Emacs #作为 Systemd 单元

启动时间慢通常由以下两种情况之一造成。

要确定是哪种情况,请使用以下命令运行 Emacs:

$ emacs -q
  • 错误,尤其是在 /etc/hosts 中的错误,往往会导致 Emacs 启动时出现 5 秒以上的延迟。有关信息,请参阅网络配置指南中的"设置主机名"。
  • 您可能需要监控从计算机发送的任何网络数据包(使用 Wireshark 等程序),查看是否有任何奇怪的行为。
  • 查找原因的一个简单方法是注释掉(即在行前加上";")~/.emacs 中的可疑部分(或 ~/.emacs.d/init.el (或 ~/.emacs.d/init.el)中的可疑部分,然后再次启动 Emacs 看看是否有任何变化。请注意,使用 “require” 和 “load” 可能会减慢启动速度,尤其是在使用较大的扩展时。原则上,只有在以下情况下才可使用它们:Emacs 启动后需要,或只为扩展提供“自动加载”功能。否则,请直接使用 “autoload” 函数。例如
    (require 'anything)
    你可以使用
    (autoload 'anything "anything" "Select anything" t)

无法打开加载文件: ...

导致此错误的最常见原因是 “load-path” 变量未包含扩展所在目录的路径。要解决这个问题,可在尝试加载扩展之前将适当的路径添加到要搜索的列表中:

 (add-to-list 'load-path "/path/to/directory/")

如果尝试使用扩展包,而 Emacs 的配置前缀又不是 /usr,则需要更新加载路径。在软件包提供的说明之前,将以下内容放入 ~/.emacs 中:

 (add-to-list 'load-path "/usr/share/emacs/site-lisp")

如果手动编译 Emacs,请注意默认前缀为 /usr/local

坏掉的变音符号键问题:“<dead-acute> is undefined”

本文或本章节的语言、语法或风格需要改进。参考:帮助:风格

原因:文风需要调整。(在Talk:Emacs/疑难解答讨论)

在谷歌上搜索这个错误,我们找到了这个链接:https://lists.gnu.org/archive/html/help-gnu-emacs/2009-05/msg00167.html ,解释了这个问题。使用变音符号键的正常方法无法达到预期效果。如果尝试对 “fiancé” 这样的单词使用变音符号,就会产生上述信息。

解决方法是在启动文件 ~/.emacs 中加入下面一行:

  (require 'iso-transl)

不,这不是一个 bug,而是新 Emacs 版本的一项功能。通过阅读邮件列表中的相关信息,我们发现了它 [1]

因为需要选择 iso-transl 或 iso-acc,所以似乎什么都不会自动加载。这两种输入法似乎都提供了 C-x 8 或 Alt-<accent> 前缀,但你我现在做的只是按一个死键(^、´、`、~、¨)来输入变音符号,然后再按另一个键来“组成”变音符号。在此过程中没有使用 Alt 键!根据文档,它似乎适用于 8 位编码,因此在 UTF-8 中应该没什么用。这个错误出现时我就报告过,但这个错误似乎被归类为一个功能……也许这只是因为文件是自动加载的,虽然很没用。

C-M-% 和其他一些绑定在 emacs nox 中不起作用

这是因为终端比 Xorg 更受局限。不过,某些终端可能比其他终端处理更多的绑定。两种解决方案:

  • 要么使用图形版本,
  • 要么将绑定更改为受支持的绑定。

示例:

.emacs
(global-set-key (kbd "C-M-y") 'query-replace-regexp)

Emacs 挂起

由于 Emacs 的单线程特性,许多操作都会阻塞。这种情况可能有几种。例如,Emacs 可能正在等待你的输入(例如,你在一帧中打开了 minibuffer,却在另一帧中尝试工作)。或者,Emacs 正在运行的代码需要一段时间才能完成。又或者,你遇到了一个错误。有几种方法可以在不杀死 Emacs 进程的情况下解锁 Emacs。

  • 试试按 C-g。根据 Emacs 的操作,您可能需要按多次。
  • 尝试按 ESC ESC ESC
  • 在另一个终端运行 killall -SIGUSR2 emacs

Emacs-nox 输出变得凌乱

在终端中工作时,颜色、缩进或任何与输出相关的内容都可能变得疯狂。这(很可能?)是因为 Emacs 在某一时刻发送了一个特殊字符,而该字符可能与当前终端冲突。 如果出现这种情况,你可以执行 M-x redraw-display,这将重绘终端显示。如果这个问题经常出现,你可能需要将命令绑定到某个按键上,例如:M-x redraw-display

(global-set-key (kbd "<f7>") 'redraw-display)

在您的 .emacs 文件中。

图形化 Emacs 没有这个问题。

在 emacs 终端中显示奇怪的转义数字 (utf-8)

将这些值导出到 .bashrc.zshrc 中:

$ ~/.bashrc or ~/.zshrc 
export LANG\='en_US.UTF-8'
export LC_ALL\="en_US.UTF-8"
export TERM\=xterm-256color

这可能会导致错误,因为在 Linux 发行版中,正确值使用的是小写 utf(例如 en_US.utf-8

要查看所有可用的本地语言,请使用 locale -a

在 tmux 的 emacs 中,Shift + 方向键不起作用

tmux 配置中启用 xterm 键:

~/.tmux.conf
setw -g xterm-keys on

因为这会破坏其他组合键,所以请在 emacs 配置中加入以下内容。

~/.emacs
(defadvice terminal-init-screen
  ;; The advice is named `tmux', and is run before `terminal-init-screen' runs.
  (before tmux activate)
  ;; Docstring. This describes the advice and is made available inside emacs;
  ;; for example when doing C-h f terminal-init-screen RET
  "Apply xterm keymap, allowing use of keys passed through tmux."
  ;; This is the elisp code that is run before `terminal-init-screen'.
  (if (getenv "TMUX")
    (let ((map (copy-keymap xterm-function-map)))
    (set-keymap-parent map (keymap-parent input-decode-map))
(set-keymap-parent input-decode-map map))))

详见 tmux FAQ

KDE 中不正确的窗口大小调整

KDE 用户可能会发现 Emacs 窗口不能正确调整大小,而是调整后的部分是透明的,鼠标点击会被发送到底层窗口。要纠正这种行为,请将 KDE 的 GTK3 主题改为 oxygen-gtk 以外的其他主题。例如,使用 gtk3 附带的 Emacs 主题。

要强制 Emacs 在 KDE 中完全最大化,点击标题栏中的 Emacs 图标,然后选择 More Actions > Special Window Settings。然后在 Size & Position 选项卡中选择 Obey geometry restrictions,在下拉菜单中选择 Force,并从右侧的单选按钮中选择 No