最近重度体验了一下 Linux 版本的 Zed ,然后又遇到了所有带 vim 模式编辑器的通用需求:退出插入模式的时候切回英文输入法。
这事的主要难点是 fcitx5 没办法获得编辑器到底是插入还是普通状态,所以 fcitx5 lua 模块也用不上。之前用 vscode vim 模式的话有插件,后来换成了 vscode 内嵌一个 neovim 实例,可以直接在 neovim 的配置里加一句 autocmd InsertLeave * :silent !fcitx5-remote -s keyboard-us
。
到了 Zde 这边,一开始想用 SendKeystrokes
这个按键映射来做,结果发现它只是对窗口发消息,而不是真正触发按键,fcitx5 也就捕获不到。
本来已经开始对着文档写插件了,写测试的时候用了一下内置 task 功能,突发奇想能不能绑定一个按键到 task ,然后执行按键映射,结果真的可行,就有了下面的这个方案。
首先是 ~/.config/zed/tasks.json
全局任务里面增加一个任务,label
就是后面要执行的任务名,具体执行的就是 fcitx5-remote -s keyboard-us
,强制切换到英文键盘。其他参数基本上是静默执行用的。
{
"label": "Switch fcitx5 to English",
"command": "fcitx5-remote -s keyboard-us",
"env": {},
"use_new_terminal": true,
"allow_concurrent_runs": true,
"reveal": "never",
"hide": "always",
"shell": "system",
"show_summary": false,
"show_output": false
}
然后是按键映射 ~/.config/zed/tasks.json
里面,给前面的任务随便绑定一个不常用的按键,比如这里 ctrl-f11
。同时将插入模式下的 escape
映射成 ctrl-f11 escape
的序列。
{
"context": "vim_mode == insert",
"bindings": {
"escape": ["workspace::SendKeystrokes", "ctrl-f11 escape"],
"ctrl-f11": ["task::Spawn", { "task_name": "Switch fcitx5 to English" }]
}
}
这样就达到曲线救国的目的了,退出插入模式自动执行任务切换至英文。就是有个缺陷,tasks 列表里这个任务会覆盖 rerun 快捷列表。
要是谁有更好的方法欢迎指教,实在忍不了的话我就去把插件写了……
PS
Zed 的 vim 模式相比 neovim 还是有些特色优势的,可以看官方文档体验一下。
另外 Zed 的渲染模式还是相对传统编辑器更耗电的,虽然没有客观数据支撑,但是体感差不多的工作状态下,用 Zed 比用 Codium 续航从七个小时下降到五个半的样子。