【已解决】WSL 下 vertico + marginalia 会导致绑定键异常

表现

正常在 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)

verticomarginalia 都是最新的版本。

emacs 版本:

image

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 也不会出现问题,所以我觉得可能和这个关系不大?

-nw 是终端模式,在此模式下按键绑定会有所更改,因为有的终端会忽略某些按键组合,在论坛里能搜到类似的帖子

我找找看。

我一直都是用终端模式,之前都没啥问题。

终端模式下,确实有的组合键无法发送到 Emacs,例如 Ctrl +;

这个大多数都是终端本身的行为,与Emacs自身没啥关系。WSL中我也遇到了,需要配置下Windows Terminal(但似乎有些快捷键无法配置)

尝试换了 tabby,依然有问题。

目前碰到的几个奇怪现象都能通过一些方法修复,但每次启动都会出现问题,很烦恼,而且还不知道原因是什么,挺闹心的。

以下是目前的解决办法:

  1. delete 和 ctrl-h 的问题,用 (normal-erase-is-backspace-mode 0) 解决
  2. 绑定键被覆盖问题: 重新触发按键绑定
  3. 乱码问题:重新设置编码 (prefer-coding-system 'utf-8)

问题出现是在我更新了 Windows 系统之后,怀疑可能有关。

看起来像是 Emacs 突然识别错误了环境,本来是在 WSL 的 Ubuntu 中运行不应该出现问题,但可能中途误以为是 Windows 环境?导致出现了很多奇怪的表现。

又用了一阵子,表现上感觉是:

  1. 开始的时候会加载我自己的配置
  2. 用了一段时间,会加载默认的 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

:mirror: 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) ···

恰好刷到一个介绍视频:

Emacs Lucid vs GTK: Debunking the Lightweight Myth

目前切换之后暂时没啥问题,没有轻量化的追求,先凑合用着。

2 个赞

感觉环境问题是个迷。控制变量法没办法做。

我的 wsl 环境是 opensuse,使用的是 zypper 官方包管理器提供的 emacs30-gtk,我使用 evil+vertico+marginalia。在终端和 gui 里所有的键位绑定都正常,不管是退格还是 M-? 都符合常规预期的行为(当然有一些按键本身终端就是用不了的,这些按键我们不考虑)。不需要做任何的额外配置。

确实迷,主要是不太知道该怎么排查,只能通过问题的表现猜。

原来我也没有细究是不是 gtk 的版本,只是问题的表现像是我的配置被重新覆盖了一次,就问了问 LLM,它觉得可能是运行了多个 Emacs,导致了配置的覆盖。

于是我就 ps 看了一下,发现我用的是 gtk 的版本,而之前搜索问题,又看到过 wayland 之类的内容,就好奇看了一下 snap 安装的 emacs 都有啥,发现有 emacs-30.1eamcs-gtkemacs-wayland 3 个版本,再了解了一下它们 3 个的区别,换成了 emacs-30.1 就正常了。

我不记得配置过用 emacs-gtk,也是莫名其妙就出了问题,碰到的时候真的很迷,也很闹心。

(因为是更新了系统后出现的,就怀疑是不是系统更新问题,或者 WSL,window terminal 的更新问题)

所幸切换到 emacs-30.1之后用了一天,基本不再出现问题了,开心了。

(PS:今天穿了论坛的人做的 Emacs T-shirt,难不成有运气加成,哈哈哈)

我在wsl终端也遇到了,输入全乱了。干脆只用GUI版本了。

如果你还是倾向终端使用的话,可以看看是不是和我同样的问题,我调整之后就没出现问题了。