我正在尝试向我的键映射绑定之一添加计数。但是,以下内容无法按预期工作:
vim.keymap.set("n", "<leader>o", vim.v.count .. 'o<Esc>')
如果我使用组合键
<leader>5o
,则只会添加一个新行,并且编辑器处于插入模式。只有在我自己按下 <Esc>
键后,才会出现 4 行额外的行,并且编辑器会切换到正常模式。
如何正确使用
vim.v.count
和 vim.keymap.set
?
如果我使用
vim.keymap.set("n", "<leader>o", 5 .. 'o<Esc>')
,它会按预期工作。添加了五行新行,编辑器保持正常模式。
我还尝试将命令包装到函数中
vim.keymap.set("n", "<leader>o", function() ... end)
,但它并没有改变行为。
您需要使用映射表达式(参见
h: map-expression
):
-- Insert 'n' lines below current line staying in normal mode (e.g. use 5<leader>o)
vim.keymap.set("n", "<leader>o", function()
return "m`" .. vim.v.count .. "o<Esc>``"
end, { expr = true })
-- Insert 'n' lines above current line staying in normal mode (e.g. use 5<leader>O)
vim.keymap.set("n", "<leader>O", function()
return "m`" .. vim.v.count .. "O<Esc>``"
end, { expr = true })
-- oo and OO are another good LHS mapping,
-- they roll off the fingers a bit better than <leader>o and <leader>O I think
这会强制映射的右侧首先进行评估,以正确捕获输入计数。现在您可以输入一些计数,然后输入
<leader>o
或 <leader>O
,它将分别在当前行的下方或上方插入输入的行数。
注意:必须在命令的其余部分之前用“m`”设置标记,否则会出现奇怪的行为。我还添加了“``”来跳回到该标记,这样在添加新的空行时光标就不会移动。如果你想让它跳到最后插入的空行,只需删除“``”即可。