如何在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
相关产品推荐
相关产品推荐

