You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Which Key按键映射中执行多条命令?

解决Which Key映射中ZkNew后后续命令不执行的问题

问题原因

你用|链式执行命令的方式无效,是因为ZkNew是异步创建并打开文件的,后续的<S-g>$<Insert>命令会在原窗口中执行,而非新创建的inbox文件窗口。

可行解决方案

方案1:利用Zk的API回调(最可靠)

直接调用Zk的Lua API,通过onCreated回调在文件创建完成后执行后续操作:

t = {
  function()
    require("zk").new({
      title = "inbox",
      dir = "",
      onCreated = function(bufnr)
        -- 切换到新创建的文件缓冲区
        vim.api.nvim_set_current_buf(bufnr)
        -- 执行跳转和插入操作:G到文件末尾,$到行尾,i进入插入模式
        vim.cmd("normal! G$i")
      end
    })
  end,
  "Add todo"
}

方案2:用自动命令监听新缓冲区

通过BufEnter自动命令,在进入新创建的文件窗口时执行操作:

t = {
  function()
    vim.cmd("ZkNew { title = 'inbox', dir = '' }")
    -- 只监听一次BufEnter事件,避免重复触发
    vim.api.nvim_create_autocmd("BufEnter", {
      once = true,
      callback = function()
        vim.cmd("normal! G$i")
      end
    })
  end,
  "Add todo"
}

方案3:延迟执行(简易但可靠性稍低)

给ZkNew预留加载时间,用vim.defer_fn延迟执行后续命令(时间可根据自己的机器调整):

t = {
  function()
    vim.cmd("ZkNew { title = 'inbox', dir = '' }")
    vim.defer_fn(function()
      vim.cmd("normal! G$i")
    end, 100) -- 延迟100毫秒执行
  end,
  "Add todo"
}

说明

  • 所有方案中都用normal! G$i替代了原按键序列,normal!会忽略用户的映射,确保执行原生Vim命令,避免冲突。
  • 优先选择方案1,因为它是Zk官方提供的回调机制,能精准在文件创建完成后触发操作,不会受加载速度影响。

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:35:18