Zed Linux vim 模式输入法切换 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kuanat
V2EX    Zed

Zed Linux vim 模式输入法切换

  •  
  •   kuanat 301 天前 1004 次点击
    这是一个创建于 301 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    2 条回复    2025-09-23 03:30:50 +08:00
    zooey2021
        1
    zooey2021  
       17 天前 via iPhone
    请问现在插件写了没?我也受不了 zed 的反人类快捷键系统了,默认的 key 绑定只能 override 不能取消,导致我 fcitx5 的 ctrl-space ,ctrl-;都不能用……
    kuanat
        2
    kuanat  
    OP
       16 天前   1
    unbind key 的语法类似于

    ```
    [
    {
    "context": "Editor",
    "bindings": {
    "ctrl-space": null,
    }
    }
    ]
    ```

    回复里可能排版不正常,你可以看一下默认 key bindings 的写法,context 是上下文状态,将对应按键设置成 null 就可以。


    插件我没有做,执行 `fcitx5-remote -s keyboard-us` 切换是很容易的,官方扩展 api 里面有个 process 模块。但是没有一个好的切入点让这个插件版的命令在 vim 退出插入模式的时候自动执行,最后还要回到 task 上面来。跟我这个方案没区别。

    另外 zed 在某个版本之后修改了底层 key handling 的逻辑,比较接近 DirectX 这样从底层取按键状态,而不是取窗口管理器传递的按键消息,所以对输入法造成了很大影响,特别是在 pre-edit 状态下,输入法和 zed 本身在按键处理上可能产生混乱。开发者明显是不懂 ime 的,所以 cjk 用户提的方案很难被接受,尽管开发者很努力地尝试理解,但在这个底层处理机制之上做修改还是太难了。现在什么情况我不太清楚。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     937 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:58 PVG 02:58 LAX 11:58 JFK 14:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86