Skip to content

Commit 01c957e

Browse files
committed
修复 insearch 模式下光标的闪烁的问题
1 parent 5a4bf2d commit 01c957e

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

lua/easycomplete/cmdline.lua

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,21 @@ function this.pum_redraw()
9292
if vim.g.easycomplete_cmdline_pattern == '/' then
9393
redraw_queued = true
9494
local ch = vim.fn.nr2char(0x200F)
95-
-- cmdline 模式下模拟 redraw,即要避免整个界面重绘,也要能正确的绘出pumwindow
96-
-- 还要不干扰 cmdline 原本输入的内容,nvim__redraw 和 redraw 都不行,这里用
97-
-- feedkey 一个字符来模拟,目前还不完美,这会导致在大文件时光标有一次闪烁
98-
-- 功能是没问题的,nvim-cmp 用 " <bs>",我感觉"<c-]>"更好一些
99-
-- " <bs>" "<c-]>" <c-t> "<c-a><c-h>" "<c-r><c-r><c-r>" "<c-r><c-r><end>"
100-
-- "<c-g>":匹配下一个
101-
local termcode = vim.api.nvim_replace_termcodes("<c-]>", true, true, true)
95+
-- cmdline 中模拟 redraw:
96+
-- 问题现象:cmdline动作不会直接redraw主屏,会慢一拍,需要手动触发 redraw 才
97+
-- 能正确的渲染出 PUM,否则 PUM 中的内容是上一次匹配的结果。
98+
-- 1. ":" 命令模式下,主界面没有变更,直接 redraw 即可
99+
-- 2. "/" 搜索模式下,会导致不断刷新匹配词,导致不断闪烁,不能直接 redraw
100+
-- 而要用cmdline按键来模拟,常用的是 " <bs>"/"<c-]>"/"<c-a><c-h>" 等,但
101+
-- 这些指令会导致在大文件中光标闪烁,虽然功能没问题,但明显不流畅
102+
-- 这里用了一个 hack,默认选中第一项,然后执行一次<s-tab>,可以避免光标
103+
-- 闪烁的问题。
104+
local termcode = vim.api.nvim_replace_termcodes("<s-tab>", true, true, true)
102105
vim.schedule(function()
103106
vim.api.nvim_win_call(this.pum_winid(), function()
104107
if vim.o.incsearch then
105-
vim.api.nvim_feedkeys(termcode, 'ni', true)
108+
this.pum_select(1)
109+
vim.api.nvim_feedkeys(termcode, 't', true)
106110
end
107111
end)
108112
redraw_queued = false

0 commit comments

Comments
 (0)