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
相关产品推荐
相关产品推荐

