本文主要讲解了在使用 Emacs 的过程中可能遇到的问题及其解决方案。
Emacs 启动失败,提示错误信息 'Undefined color: "WINDOW_FOREGROUND"'
您需要安装 mcpp包 软件包或 gcc包 软件包。xrdb 使用 C 预处理器 cpp 对 X 资源进行预处理。如果系统中未安装 C 预处理器,xrdb 会自动跳过运行 C 预处理器,并且符号 WINDOW_FOREGROUND 不会扩展为十六进制颜色代码。
使用 Gccemacs 时 Emacs systemd 服务无法启动
使用 Gccemacs(分支 emacs-native-comp
或 pgtk-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:
$ 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”
在谷歌上搜索这个错误,我们找到了这个链接: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。