From bdc177e3206df4b0e8dba99b18805a0f71956268 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 3 Jun 2024 22:11:58 +0800 Subject: [PATCH] perf(guide): use timer to display win --- lua/spacevim/api/vim/statusline.lua | 70 +++++++++++++++++------------ lua/spacevim/plugin/guide.lua | 37 ++++++++++++--- 2 files changed, 71 insertions(+), 36 deletions(-) diff --git a/lua/spacevim/api/vim/statusline.lua b/lua/spacevim/api/vim/statusline.lua index a132f9162..0e99dd71c 100644 --- a/lua/spacevim/api/vim/statusline.lua +++ b/lua/spacevim/api/vim/statusline.lua @@ -1,43 +1,55 @@ local M = {} function M.support_float() - return vim.fn.exists('*nvim_open_win') == 1 + return vim.fn.exists('*nvim_open_win') == 1 end function M.opened() - return vim.fn.win_id2tabwin(M.__winid)[1] == vim.fn.tabpagenr() + return vim.fn.win_id2tabwin(M.__winid)[1] == vim.fn.tabpagenr() end -function M.open_float(sl) - if M.__bufnr == nil or vim.fn.bufexists(M.__bufnr) == 0 then - M.__bufnr = vim.api.nvim_create_buf(false, true) - end - if M.__winid == nil or not M.opened() then - M.__winid = vim.api.nvim_open_win(M.__bufnr, false, { - relative = 'editor', - width = vim.o.columns, - height = 1, - -- highlight = 'SpaceVim_statusline_a_bold', - row = vim.o.lines - 2, - col = 0 - }) - end - vim.fn.setwinvar(M.__winid, '&winhighlight', 'Normal:SpaceVim_statusline_a_bold') - vim.fn.setbufvar(M.__bufnr, '&relativenumber', 0) - vim.fn.setbufvar(M.__bufnr, '&number', 0) - vim.fn.setbufvar(M.__bufnr, '&bufhidden', 'wipe') - vim.fn.setbufvar(M.__bufnr, '&cursorline', 0) - vim.fn.setbufvar(M.__bufnr, '&modifiable', 1) - vim.fn.setwinvar(vim.fn.win_id2win(M.__winid), '&cursorline', 0) - vim.api.nvim_buf_set_virtual_text( M.__bufnr, -1, 0, sl, {}) - vim.fn.setbufvar(M.__bufnr, '&modifiable', 0) - return M.__winid +function M.show() + if vim.api.nvim_win_is_valid(M.__winid) then + vim.api.nvim_win_set_config(M.__winid, { hide = false }) + end +end + +function M.open_float(sl, ...) + local hide = select(1, ...) + if hide == true or hide == false then + else + hide = false + end + if M.__bufnr == nil or vim.fn.bufexists(M.__bufnr) == 0 then + M.__bufnr = vim.api.nvim_create_buf(false, true) + end + if M.__winid == nil or not M.opened() then + M.__winid = vim.api.nvim_open_win(M.__bufnr, false, { + relative = 'editor', + width = vim.o.columns, + height = 1, + -- highlight = 'SpaceVim_statusline_a_bold', + row = vim.o.lines - 2, + col = 0, + hide = hide, + }) + end + vim.fn.setwinvar(M.__winid, '&winhighlight', 'Normal:SpaceVim_statusline_a_bold') + vim.fn.setbufvar(M.__bufnr, '&relativenumber', 0) + vim.fn.setbufvar(M.__bufnr, '&number', 0) + vim.fn.setbufvar(M.__bufnr, '&bufhidden', 'wipe') + vim.fn.setbufvar(M.__bufnr, '&cursorline', 0) + vim.fn.setbufvar(M.__bufnr, '&modifiable', 1) + vim.fn.setwinvar(vim.fn.win_id2win(M.__winid), '&cursorline', 0) + vim.api.nvim_buf_set_virtual_text(M.__bufnr, -1, 0, sl, {}) + vim.fn.setbufvar(M.__bufnr, '&modifiable', 0) + return M.__winid end function M.close_float() - if M.__winid ~= nil then - vim.api.nvim_win_close(M.__winid, true) - end + if M.__winid ~= nil then + vim.api.nvim_win_close(M.__winid, true) + end end return M diff --git a/lua/spacevim/plugin/guide.lua b/lua/spacevim/plugin/guide.lua index 3f2b1e4da..21595e4d1 100644 --- a/lua/spacevim/plugin/guide.lua +++ b/lua/spacevim/plugin/guide.lua @@ -469,7 +469,7 @@ end local cursor_highlight_info local function highlight_cursor() -cursor_highlight_info = hl.group2dict('Cursor') + cursor_highlight_info = hl.group2dict('Cursor') local hlinfo = { name = 'SpaceVimGuideCursor', guibg = cursor_highlight_info.guibg, @@ -545,7 +545,7 @@ local function updateStatusline() { sep .. ' ', 'LeaderGuiderSep2' }, { guide_help_msg(false), 'LeaderGuiderFill' }, { string.rep(' ', 999), 'LeaderGuiderFill' }, - }) + }, true) end local function setlocalopt(buf, win, opts) @@ -567,12 +567,13 @@ local function winopen() if not vim.api.nvim_buf_is_valid(bufnr) then bufnr = buffer.create_buf(false, true) end - winid = vim.api.nvim_open_win(bufnr, true, { + winid = vim.api.nvim_open_win(bufnr, false, { relative = 'editor', width = vim.o.columns, height = 12, row = vim.o.lines - 14, col = 0, + hide = true, }) guide_help_mode = false setlocalopt(bufnr, winid, { @@ -653,8 +654,15 @@ local function handle_input(input) end local function page_down() - -- vim.api.nvim_feedkeys(Key.t(''), 'n', false) - vim.api.nvim_feedkeys(Key.t(''), 'x', false) + if vim.api.nvim_win_is_valid(winid) then + local cursor = vim.api.nvim_win_get_cursor(winid)[1] + local height = vim.api.nvim_win_get_config(winid).height + if cursor + height < vim.api.nvim_buf_line_count(bufnr) then + vim.api.nvim_win_set_cursor(winid, {cursor + height, 1}) + else + vim.api.nvim_win_set_cursor(winid, {vim.api.nvim_buf_line_count(bufnr), 1}) + end + end vim.cmd('redraw!') wait_for_input() end @@ -670,8 +678,15 @@ local function page_undo() end local function page_up() - -- vim.api.nvim_feedkeys(Key.t(''), 'n', false) - vim.api.nvim_feedkeys(Key.t(''), 'x', false) + if vim.api.nvim_win_is_valid(winid) then + local cursor = vim.api.nvim_win_get_cursor(winid)[1] + local height = vim.api.nvim_win_get_config(winid).height + if cursor - height > 1 then + vim.api.nvim_win_set_cursor(winid, {cursor - height, 1}) + else + vim.api.nvim_win_set_cursor(winid, {1, 1}) + end + end vim.cmd('redraw!') wait_for_input() end @@ -704,9 +719,17 @@ local function warn_not_defined(mpt) }, false, {}) end +local function show_win(_) + if vim.api.nvim_win_is_valid(winid) then + vim.api.nvim_win_set_config(winid, { hide = false }) + end + SL.show() +end + wait_for_input = function() log.debug('wait for input:') local t = Key.t + vim.fn.timer_start(10, show_win) local inp = VIM.getchar() log.debug('inp is:' .. inp) if inp == t('') then