Neovim中通过寄存器将可视选区转发至Telescope Live-Grep-Args
Vim/Neovim Yank寄存器相关问题解答
问题1:在Vim/Neovim中执行yank(复制)操作时,是否总会修改无名寄存器?(即使将选区存入指定寄存器)
是的,这是Vim/Neovim的默认行为。除了使用黑洞寄存器"_进行yank操作外,任何指定其他寄存器的yank动作,都会同时将内容写入目标寄存器和无名寄存器("`)。
问题2:是否存在不修改无名寄存器的实现方案?
当然有,以下是几种实用方案:
方案1:直接读取可视选区内容(推荐)
通过Neovim的API直接获取可视选区的文本,完全跳过yank操作,从根源上避免修改任何寄存器:
local function grep_visual_selection() -- 获取可视选区的起始和结束位置 local start = vim.fn.getpos("'<") local end_ = vim.fn.getpos("'>") local buf = 0 -- 当前缓冲区 -- 读取选区覆盖的所有行 local lines = vim.api.nvim_buf_get_lines(buf, start[2]-1, end_[2], false) -- 处理部分行的选区内容 if #lines == 1 then lines[1] = lines[1]:sub(start[3], end_[3]) else lines[1] = lines[1]:sub(start[3]) lines[#lines] = lines[#lines]:sub(1, end_[3]) end -- 拼接成完整选区文本并转义空格 local visual_selection = table.concat(lines, '\n') visual_selection = vim.fn.escape(visual_selection, ' ') -- 调用Telescope vim.cmd('Telescope live_grep default_text=' .. visual_selection) end
方案2:备份并恢复无名寄存器
先保存无名寄存器的原始内容,执行yank后再恢复,确保用户的无名寄存器内容不受影响:
local function grep_visual_selection() -- 备份无名寄存器的内容和类型 local orig_content = vim.fn.getreg('"') local orig_type = vim.fn.getregtype('"') -- 将选区yank到a寄存器 vim.cmd('normal! "ay') -- 恢复无名寄存器的原始状态 vim.fn.setreg('"', orig_content, orig_type) -- 后续处理逻辑不变 local visual_selection = vim.fn.escape(vim.fn.getreg('a'), ' ') vim.cmd('Telescope live_grep default_text=' .. visual_selection) end
内容的提问来源于stack exchange,提问作者salkin
相关产品推荐
相关产品推荐

