sudo helix 编辑文件时Esc崩溃

现象

用 sudo helix 编辑配置文件(如 /etc/vmware-tools/tools.conf)时,按 Esc 退出插入模式,终端跳出报错:

terminate called after throwing an instance of ‘std::runtime_error’ what(): Failed to create dbus connection

Helix 本身没崩,但会打断阅读体验。

根本原因

自己在 ~/.config/helix/config.toml 里配置了退出插入模式时自动关闭输入法:

toml [keys.insert] esc = [“normal_mode”, “:sh fcitx5-remote -c”] # 退出插入模式后关闭输入法 fcitx5-remote 需要连接用户会话 DBus(session bus)才能和 fcitx5 输入法守护进程通信。 sudo 默认会清空大部分环境变量,包括 DBUS_SESSION_BUS_ADDRESS。 用 sudo helix 时,虽然因为 env_keep 里保留了 HOME,Helix 依然能读到自己的用户配置(所以这个 esc 绑定照常触发),但执行 fcitx5-remote -c 这个子进程时环境里没有 DBus 地址,导致连接失败、抛出未捕获异常、SIGABRT 崩溃。 排查过程(关键工具)

用 coredumpctl list 查看系统崩溃记录,直接定位到真正崩溃的进程:

bash coredumpctl list

输出中找到:

TIME PID UID GID SIG EXE Sun … 12:59:17 CST 9888 0 0 SIGABRT /usr/bin/fcitx5-remote

UID=0(root)+ 时间点吻合 + SIGABRT,确认元凶就是它。

解决方法

  • 方法一(根治):给 sudo 保留 DBUS_SESSION_BUS_ADDRESS 环境变量 bash sudo visudo

找到(或添加)这一行:

Defaults env_keep+=“XDG_CONFIG_HOME HOME DBUS_SESSION_BUS_ADDRESS”

⚠️ 注意拼写,容易手滑打错(踩过的坑):

❌ XDG_COFIG_HOME → ✅ XDG_CONFIG_HOME ❌ DBUS_SEESION_BUS_ADDRESS → ✅ DBUS_SESSION_BUS_ADDRESS

改完保存退出,用以下命令验证是否生效:

bash sudo -l

确认 env_keep 列表里的变量名完全正确无误。

之后 sudo helix 编辑任何文件,按 Esc 都不会再崩溃。

  • 方法二(临时应急,不改系统配置)

手动把当前用户的 DBus 地址传给 sudo 会话:

bash sudo DBUS_SESSION_BUS_ADDRESS=“$DBUS_SESSION_BUS_ADDRESS” helix /path/to/file

  • 方法三(更推荐的日常习惯):改用 sudoedit

编辑需要 root 权限的配置文件时,优先用:

bash sudoedit /etc/vmware-tools/tools.conf

sudoedit 会以普通用户身份在临时文件里编辑,编辑器(Helix)运行环境完全正常,不存在 DBus 缺失问题,保存时才用 root 权限写回原文件。从根源上避免这个问题,比每次都要处理环境变量更省心。

  • 方法四(配置容错,双保险)

给 Helix 的 esc 绑定加个错误抑制,避免子命令崩溃刷屏:

toml [keys.insert] esc = [“normal_mode”, “:sh fcitx5-remote -c 2>/dev/null || true”] # 退出插入模式后关闭输入法

这不解决根本问题(root 会话下依然连不上 DBus,输入法切换本身还是会静默失败),但至少不会有报错信息打断视线。

额外踩坑:visudo 找不到编辑器

卸载 vim 后运行 sudo visudo 报错:

visudo: no editor found (editor path = /usr/bin/vi)

原因:visudo 出于安全考虑不完全信任 $EDITOR,需要系统里存在传统的 /usr/bin/vi(或在 sudoers 里显式配置了可信编辑器列表)。

解决:

bash sudo EDITOR=/usr/bin/helix visudo

(用绝对路径指定编辑器,一般可以绕开这个限制;如果还是不行,可以临时装回 vi 包应急)

总结

层级 结论 触发条件 sudo helix + 按 Esc 触发自定义关闭输入法命令 崩溃进程 fcitx5-remote(不是 Helix 本身) 根本原因 sudo 清空了 DBUS_SESSION_BUS_ADDRESS,导致连不上用户 session bus 最佳实践 日常优先用 sudoedit;需要 sudo helix 时,env_keep 加上 DBUS_SESSION_BUS_ADDRESS