From 7229d48b515fa7c4f7a56a335188f169702a3d3a Mon Sep 17 00:00:00 2001 From: August Masquelier Date: Fri, 2 Apr 2021 14:16:22 -0600 Subject: [PATCH 1/2] Circumvent nvim segmentation fault by avoiding operations on highlights in unfocused windows. --- lua/specs/init.lua | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lua/specs/init.lua b/lua/specs/init.lua index 3895a44..d7b9cbf 100644 --- a/lua/specs/init.lua +++ b/lua/specs/init.lua @@ -16,6 +16,7 @@ end function M.show_specs() local buftype = vim.api.nvim_buf_get_option(0, 'buftype') + local start_win_id = vim.api.nvim_get_current_win() if buftype == 'nofile' then return end local cursor_col = vim.fn.wincol()-1 @@ -24,7 +25,7 @@ function M.show_specs() local win_id = vim.api.nvim_open_win(bufh, false, { relative='win', width = 1, - height = 1, + height = 1, col = cursor_col, row = cursor_row, style = 'minimal' @@ -35,8 +36,22 @@ function M.show_specs() local cnt = 0 local config = vim.api.nvim_win_get_config(win_id) local timer = vim.loop.new_timer() + local closed = false vim.loop.timer_start(timer, opts.popup.delay_ms, opts.popup.inc_ms, vim.schedule_wrap(function() + if closed or vim.api.nvim_get_current_win() ~= start_win_id then + if not closed then + pcall(vim.loop.close, timer) + pcall(vim.api.nvim_win_close, win_id, true) + + -- Callbacks might stack up before the timer actually gets closed, track that state + -- internally here instead + closed = true + end + + return + end + if vim.api.nvim_win_is_valid(win_id) then local bl = opts.popup.fader(opts.popup.blend, cnt) local dm = opts.popup.resizer(opts.popup.width, cursor_col, cnt) @@ -77,7 +92,7 @@ end --[[ ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁ ]]-- - + function M.pulse_fader(blend, cnt) if cnt < (100-blend)/2 then return cnt @@ -123,7 +138,7 @@ local DEFAULT_OPTS = { show_jumps = true, min_jump = 30, popup = { - delay_ms = 10, + delay_ms = 10, inc_ms = 5, blend = 10, width = 20, From bd6af0a28a6c3b2e328bcf08be03d622c655f777 Mon Sep 17 00:00:00 2001 From: August Masquelier Date: Fri, 2 Apr 2021 14:44:54 -0600 Subject: [PATCH 2/2] Add ability to not show specs based on buffer/file type. --- README.md | 6 +++++- lua/specs/init.lua | 43 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7573dd7..d16650d 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,11 @@ require('specs').setup{ winhl = "PMenu", fader = require('specs').linear_fader, resizer = require('specs').shrink_resizer - } + }, + ignore_filetypes = {}, + ignore_buftypes = { + nofile = true, + }, } ``` diff --git a/lua/specs/init.lua b/lua/specs/init.lua index d7b9cbf..c9cba4b 100644 --- a/lua/specs/init.lua +++ b/lua/specs/init.lua @@ -6,7 +6,7 @@ local old_cur function M.on_cursor_moved() local cur = vim.api.nvim_win_get_cursor(0) if old_cur then - jump = math.abs(cur[1]-old_cur[1]) + local jump = math.abs(cur[1]-old_cur[1]) if jump >= opts.min_jump then M.show_specs() end @@ -14,10 +14,37 @@ function M.on_cursor_moved() old_cur = cur end +function M.should_show_specs(start_win_id) + if not vim.api.nvim_win_is_valid(start_win_id) then + return false + end + + if type(opts.ignore_filetypes) ~= 'table' or type(opts.ignore_buftypes) ~= 'table' then + return true + end + + local buftype, filetype, ok + ok, buftype = pcall(vim.api.nvim_buf_get_option, 0, 'buftype') + + if ok and opts.ignore_buftypes[buftype] then + return false + end + + ok, filetype = pcall(vim.api.nvim_buf_get_option, 0, 'filetype') + + if ok and opts.ignore_filetypes[filetype] then + return false + end + + return true +end + function M.show_specs() - local buftype = vim.api.nvim_buf_get_option(0, 'buftype') local start_win_id = vim.api.nvim_get_current_win() - if buftype == 'nofile' then return end + + if not M.should_show_specs(start_win_id) then + return + end local cursor_col = vim.fn.wincol()-1 local cursor_row = vim.fn.winline()-1 @@ -103,7 +130,7 @@ end --[[ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ]]-- -function M.empty_fader(blend, cnt) +function M.empty_fader(_, _) return nil end @@ -144,8 +171,12 @@ local DEFAULT_OPTS = { width = 20, winhl = "PMenu", fader = M.exp_fader, - resizer = M.shrink_resizer - } + resizer = M.shrink_resizer, + }, + ignore_filetypes = {}, + ignore_buftypes = { + nofile = true, + }, } function M.setup(user_opts)