Neovim Lua:可视选中区域执行命令报错,如何解决?
问题原因及解决方案
问题原因
在Visual模式触发按键映射后,Neovim会自动切换到Normal模式,此时直接通过vim.cmd(":'<,'>AIEdit " .. phrase)执行命令时,Vim无法正确识别'<和'>这两个选区标记的上下文,导致出现"标记未找到"的错误。而手动输入命令时,是在Command-line模式下直接引用选区标记,此时标记的上下文仍然有效,所以能正常执行。
解决方案
方案1:直接获取选区行号构造命令
通过vim.fn.getpos获取选区的起始和结束行号,直接使用行号范围执行命令,避免依赖选区标记的上下文:
local function ai_edit_prompt() -- 获取选区起始行和结束行 local start_line = vim.fn.getpos("'<")[2] local end_line = vim.fn.getpos("'>")[2] local phrase = vim.fn.input("Prompt for AI: ") -- 用行号范围构造并执行命令 vim.cmd(string.format("%d,%dAIEdit %s", start_line, end_line, phrase)) end vim.keymap.set("v", "<space>ae", ai_edit_prompt)
方案2:使用vim.fn.execute执行命令
vim.fn.execute可以更可靠地处理包含选区标记的命令,确保标记上下文被正确识别:
local function ai_edit_prompt() local phrase = vim.fn.input("Prompt for AI: ") vim.fn.execute(":'<,'>AIEdit " .. phrase) end vim.keymap.set("v", "<space>ae", ai_edit_prompt)
两种方案都能解决标记未找到的问题,方案1通过直接使用行号避免了标记依赖,稳定性更强;方案2则简化了代码,保留了原有的标记引用方式。
内容的提问来源于stack exchange,提问作者synic
相关产品推荐
相关产品推荐

