From ea821260ce098166d5115db96cf2ca6bcc3467af Mon Sep 17 00:00:00 2001 From: Anshuman Date: Mon, 10 Apr 2023 19:49:27 +0800 Subject: [PATCH 1/2] filter out floats (or any other window configs) --- lua/window-picker/config.lua | 5 ++++ .../filters/default-window-filter.lua | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lua/window-picker/config.lua b/lua/window-picker/config.lua index eb2e7b5..238e5cf 100644 --- a/lua/window-picker/config.lua +++ b/lua/window-picker/config.lua @@ -71,6 +71,11 @@ local config = { -- filter using window options wo = {}, + -- filter using window config + window_configs = { + relative = true, -- checks if this key exists and nonempty (checks for floating windows) + }, + -- if the file path contains one of following names, the window -- will be ignored file_path_contains = {}, diff --git a/lua/window-picker/filters/default-window-filter.lua b/lua/window-picker/filters/default-window-filter.lua index 739bd17..a78b0b9 100644 --- a/lua/window-picker/filters/default-window-filter.lua +++ b/lua/window-picker/filters/default-window-filter.lua @@ -3,6 +3,7 @@ local util = require('window-picker.util') --- @class DefaultWindowFilter --- @field filter_stack function[] --- @field window_options table window options to filter +--- @field window_configs table window configs to filter --- @field buffer_options table buffer options to filter --- @field file_name_contains string[] file names to filter --- @field file_path_contains string[] file paths to filter @@ -15,6 +16,7 @@ function M:new() self.__index = self o.filter_stack = { + o._window_config_filter, o._window_option_filter, o._buffer_options_filter, o._file_path_contains_filter, @@ -28,6 +30,7 @@ end function M:set_config(config) self.window_options = config.wo or {} self.buffer_options = config.bo or {} + self.window_configs = config.window_configs or {} self.file_name_contains = config.file_name_contains or {} self.file_path_contains = config.file_path_contains or {} self.include_current_win = config.include_current_win @@ -43,6 +46,33 @@ function M:filter_windows(windows) return filtered_windows end +function M:_window_config_filter(windows) + if self.window_configs and vim.tbl_count(self.window_configs) > 0 then + return util.tbl_filter(windows, function(winid) + local config = vim.api.nvim_win_get_config(winid) + for cfg_key, cfg_values in pairs(self.window_configs) do + local actual_opt = config[cfg_key] + + local has_value = false + + if type(cfg_values) == 'table' then + has_value = vim.tbl_contains(cfg_values, actual_opt) + elseif cfg_values == true then + has_value = actual_opt ~= '' and actual_opt ~= nil + end + + if has_value then + return false + end + end + + return true + end) + else + return windows + end +end + function M:_window_option_filter(windows) if self.window_options and vim.tbl_count(self.window_options) > 0 then return util.tbl_filter(windows, function(winid) From da53ea61ead56967f8175216d9e21afc679bcd33 Mon Sep 17 00:00:00 2001 From: Anshuman Date: Mon, 10 Apr 2023 19:52:45 +0800 Subject: [PATCH 2/2] window id filter --- .../filters/default-window-filter.lua | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lua/window-picker/filters/default-window-filter.lua b/lua/window-picker/filters/default-window-filter.lua index a78b0b9..432530f 100644 --- a/lua/window-picker/filters/default-window-filter.lua +++ b/lua/window-picker/filters/default-window-filter.lua @@ -4,6 +4,8 @@ local util = require('window-picker.util') --- @field filter_stack function[] --- @field window_options table window options to filter --- @field window_configs table window configs to filter +--- @field window_ids table window ids to include +--- @field not_window_ids table window ids to exclude --- @field buffer_options table buffer options to filter --- @field file_name_contains string[] file names to filter --- @field file_path_contains string[] file paths to filter @@ -21,6 +23,8 @@ function M:new() o._buffer_options_filter, o._file_path_contains_filter, o._file_path_contains_filter, + o._window_id_filter, + o._not_window_id_filter, o._current_window_filter, } @@ -33,6 +37,8 @@ function M:set_config(config) self.window_configs = config.window_configs or {} self.file_name_contains = config.file_name_contains or {} self.file_path_contains = config.file_path_contains or {} + self.window_ids = config.window_ids or {} + self.not_window_ids = config.not_window_ids or {} self.include_current_win = config.include_current_win end @@ -93,6 +99,24 @@ function M:_window_option_filter(windows) end end +function M:_window_id_filter(windows) + if self.window_ids and vim.tbl_count(self.window_ids) > 0 then + windows = util.tbl_filter(windows, function(winid) + return vim.tbl_contains(self.window_ids, winid) + and not vim.tbl_contains(self.not_window_ids, winid) + end) + end + return windows +end +function M:_not_window_id_filter(windows) + if self.not_window_ids and vim.tbl_count(self.not_window_ids) > 0 then + windows = util.tbl_filter(windows, function(winid) + return not vim.tbl_contains(self.not_window_ids, winid) + end) + end + return windows +end + function M:_buffer_options_filter(windows) if self.buffer_options and vim.tbl_count(self.buffer_options) > 0 then return util.tbl_filter(windows, function(winid)