如何在 Neovim 中使用 vim.keymap.set 和 vim.v.count

问题描述 投票:0回答:1

我正在尝试向我的键映射绑定之一添加计数。但是,以下内容无法按预期工作:

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)
,但它并没有改变行为。

neovim keymapping
1个回答
0
投票

您需要使用映射表达式(参见

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`”设置标记,否则会出现奇怪的行为。我还添加了“``”来跳回到该标记,这样在添加新的空行时光标就不会移动。如果你想让它跳到最后插入的空行,只需删除“``”即可。

© www.soinside.com 2019 - 2024. All rights reserved.