如何创建一个为vim (neovim)运动调用的lua函数



Vim有动作的概念,可以通过动作作用于文本对象。例如,diw将删除(动作)内部单词(动作)。我想创建一个函数,可以应用/执行这些运动。例如,如果我的函数附加到某个寄存器,我可以通过执行myFunction + motion for what I want to add来附加任何我想要的内容。

唯一的方法是使用g@映射和opfunc全局变量。需要修改opfuncc以指向一个全局可调用对象,然后调用g@+运动键图。vim文档甚至建议这样做,他们创建了一个映射,其中设置了opfunc,然后在同一命令上调用g@运动。在他们提供更好的lua集成之前,这似乎是您可以使用lua的最接近的方法

function format_range_operator()
local old_func = vim.go.operatorfunc -- backup previous reference
-- set a globally callable object/function
_G.op_func_formatting = function()
-- the content covered by the motion is between the [ and ] marks, so get those
local start = vim.api.nvim_buf_get_mark(0, '[')
local finish = vim.api.nvim_buf_get_mark(0, ']')
vim.lsp.buf.range_formatting({}, start, finish)
vim.go.operatorfunc = old_func -- restore previous opfunc
_G.op_func_formatting = nil -- deletes itself from global namespace
end
vim.go.operatorfunc = 'v:lua.op_func_formatting'
vim.api.nvim_feedkeys('g@', 'n', false)
end
vim.api.nvim_set_keymap("n", "gm", "<cmd>lua format_range_operator()<CR>", {noremap = true})

选自:https://github.com/neovim/nvim-lspconfig/wiki/User-contributed-tips#range-formatting-with-a-motion

最新更新