You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neovim Lua可视化选中文本映射Telescope时旧内容缓存问题求助

解决Neovim可视化模式下Telescope映射选中内容不更新的问题

你的问题并非Lua缓存机制导致,而是依赖'</'>标记获取选中内容的方式存在缺陷:当在可视化模式触发映射时,Neovim会自动退出可视化模式,此时这些标记的更新可能被后续操作(比如输入弹窗)干扰,导致始终返回第一次的选中内容。

以下是两种可靠的修复方案:

方案1:通过寄存器捕获选中内容

直接在可视化模式下将选中内容复制到寄存器,再读取寄存器内容,避免依赖标记:

local builtin = require('telescope.builtin')

-- 普通模式映射保持不变
vim.keymap.set('n', '<leader>ps', function()
    builtin.grep_string({ search = vim.fn.input("Grep > ") });
end)

-- 修复后的可视化模式映射
vim.keymap.set('v', '<leader>ps', function()
    -- 无自动命令干扰下,复制选中内容到无名寄存器
    vim.cmd('noau normal! "vy"')
    local sel = vim.fn.getreg('"')
    -- 移除多行选中时末尾多余的换行符
    sel = sel:gsub('\n$', '')
    builtin.grep_string({ search = vim.fn.input("Grep > " .. sel) })
end)

方案2:使用内置函数获取选中内容

利用Vim内置的getvisualselection()函数直接获取当前可视化选中的文本,代码更简洁:

local builtin = require('telescope.builtin')

vim.keymap.set('n', '<leader>ps', function()
    builtin.grep_string({ search = vim.fn.input("Grep > ") });
end)

vim.keymap.set('v', '<leader>ps', function()
    local sel = vim.fn.getvisualselection()
    builtin.grep_string({ search = vim.fn.input("Grep > " .. sel) })
end)

两种方案都能确保每次获取的是最新的可视化选中内容,解决重复返回第一次选中文本的问题。

内容的提问来源于stack exchange,提问作者Sbu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:50:39