Zed Linux vim 模式输入法切换

4 天前
 kuanat

最近重度体验了一下 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 续航从七个小时下降到五个半的样子。

128 次点击
所在节点    Zed
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1097009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX