表现
正常在 emacs 中,使用 backspace 会往前(左边)删除字符。
但是在启用了 vertico + marginalia 之后,在 minibuffer 输入一些内容,使用 backspace 删除,会发现 backspace 变成了 DEL,无法向前删除,而是向后删除。
53.8 If DEL Fails to Delete 可以临时解决 backspace 的问题。
但除此之外,我发现其他的一些绑定键也会被莫名其妙修改。
例如原来 M-? 我绑定了 (global-set-key (kbd "M-?") 'sanityinc/consult-ripgrep-at-point)
但是莫名其妙会变成:
同时一些中文也会变成乱码 (sanityinc/consult-ripgrep-at-point 的搜索结果):
看起来像是 vertico + marginalia 引起的问题,但我不太确定,看了最新的提交我也看不出来问题(我不太熟悉 Elisp)。
禁用 marginalia,可以在一段时间内避免问题,但是过了一段时间,又会触发。
这个问题是我更新 Windows 系统后出现的,不太清楚是不是和什么更新有关。
不知道有没有人有更具体的排查办法,我想先排查看看,不行的话我再去提个 issue.
另外如果你有空,可以帮我试试这样的配置,在你的终端使用会有问题吗?
(在 macOS 终端测试看起来没问题。)
相关环境
测试方法: emacs -nw -Q -l test.el
test.el:
(load-file "~/git/vertico/vertico.el")
(load-file "~/git/marginalia/marginalia.el")
(vertico-mode)
(marginalia-mode)
vertico 和 marginalia 都是最新的版本。
emacs 版本:

WSL:
Windows Terminal Preview:
Ubuntu:
补充:
用上面的配置操作我目前能稳定复现问题。
仅关闭 marginalia,一段时间内不会出现什么问题,但是不知道什么时候突然又会出问题,具体是什么操作触发的目前还不太清楚。
1 个赞
Thanks :)
这个配置我尝试过了,可以修复 backspace 异常问题,但奇怪的是除了 backspace,它还会引发其他绑定键的异常= =
例如原来 M-? 我绑定了 (global-set-key (kbd "M-?") 'sanityinc/consult-ripgrep-at-point)
但是触发问题之后,会绑定到 xref 对应的函数。
而且我原来没有设置 normal-erase-is-backspace-mode
也不会出现问题,所以我觉得可能和这个关系不大?
yu86
4
-nw 是终端模式,在此模式下按键绑定会有所更改,因为有的终端会忽略某些按键组合,在论坛里能搜到类似的帖子
我找找看。
我一直都是用终端模式,之前都没啥问题。
终端模式下,确实有的组合键无法发送到 Emacs,例如 Ctrl +;
。
这个大多数都是终端本身的行为,与Emacs自身没啥关系。WSL中我也遇到了,需要配置下Windows Terminal(但似乎有些快捷键无法配置)
尝试换了 tabby,依然有问题。
目前碰到的几个奇怪现象都能通过一些方法修复,但每次启动都会出现问题,很烦恼,而且还不知道原因是什么,挺闹心的。
以下是目前的解决办法:
- delete 和 ctrl-h 的问题,用
(normal-erase-is-backspace-mode 0)
解决
- 绑定键被覆盖问题: 重新触发按键绑定
- 乱码问题:重新设置编码
(prefer-coding-system 'utf-8)
问题出现是在我更新了 Windows 系统之后,怀疑可能有关。
看起来像是 Emacs 突然识别错误了环境,本来是在 WSL 的 Ubuntu 中运行不应该出现问题,但可能中途误以为是 Windows 环境?导致出现了很多奇怪的表现。
又用了一阵子,表现上感觉是:
- 开始的时候会加载我自己的配置
- 用了一段时间,会加载默认的 emacs 配置,把和我配置冲突的部分都覆盖了,而且似乎被识别成了 Windows 环境,所以导致 backspace,绑定键,编码(这也是我的配置中指定过的)都被修改了。
spike 4988 1.6 2.2 655148 467072 pts/0 S+ 00:40 11:00 /snap/emacs/2844/usr/bin/emacs-gtk -nw
ps 看到现在用的是 emacs-gtk,这个是支持 GUI 的,但实际上我在终端用,不需要 GUI,可能是因为这个导致的问题。
我现在改为默认使用纯文本的的版本: emacs-30.1, 看起来没问题了。
用一段时间再看看。
Debian上可以试一下emacs-lucid,人工智能的比较,
emacs-gtk
- Uses: GTK (GIMP Toolkit), typically GTK3 or GTK4
- Pros:
- Modern look and feel
- Better integration with desktop environments like GNOME
- Supports features like native file dialogs, drag-and-drop, and smooth scrolling
- Cons:
- Heavier on resources
- Can have issues with input methods or rendering on some systems
emacs-lucid
- Uses: Lucid (Xaw3d-based toolkit)
- Pros:
- Lightweight and fast
- More stable in minimal or older environments
- Fewer dependencies
- Cons:
- Outdated UI appearance
- Lacks some modern features (e.g., native dialogs)
···
感觉环境问题是个迷。控制变量法没办法做。
我的 wsl 环境是 opensuse,使用的是 zypper 官方包管理器提供的 emacs30-gtk,我使用 evil+vertico+marginalia。在终端和 gui 里所有的键位绑定都正常,不管是退格还是 M-?
都符合常规预期的行为(当然有一些按键本身终端就是用不了的,这些按键我们不考虑)。不需要做任何的额外配置。
确实迷,主要是不太知道该怎么排查,只能通过问题的表现猜。
原来我也没有细究是不是 gtk 的版本,只是问题的表现像是我的配置被重新覆盖了一次,就问了问 LLM,它觉得可能是运行了多个 Emacs,导致了配置的覆盖。
于是我就 ps 看了一下,发现我用的是 gtk 的版本,而之前搜索问题,又看到过 wayland 之类的内容,就好奇看了一下 snap 安装的 emacs 都有啥,发现有 emacs-30.1
,eamcs-gtk
,emacs-wayland
3 个版本,再了解了一下它们 3 个的区别,换成了 emacs-30.1
就正常了。
我不记得配置过用 emacs-gtk,也是莫名其妙就出了问题,碰到的时候真的很迷,也很闹心。
(因为是更新了系统后出现的,就怀疑是不是系统更新问题,或者 WSL,window terminal 的更新问题)
所幸切换到 emacs-30.1
之后用了一天,基本不再出现问题了,开心了。
(PS:今天穿了论坛的人做的 Emacs T-shirt,难不成有运气加成,哈哈哈)
我在wsl终端也遇到了,输入全乱了。干脆只用GUI版本了。
如果你还是倾向终端使用的话,可以看看是不是和我同样的问题,我调整之后就没出现问题了。