From f449c0499ca63e653c9829c2e40bff7594e9eb23 Mon Sep 17 00:00:00 2001 From: TJ DeVries Date: Sat, 12 Sep 2020 14:56:58 -0400 Subject: feat: Better border configuration. Started adding `resolve` which will allow you to do some really nice stuff easily with options to get the window options from a variety of inputs. You can see how we do it in pickers.lua for borders & borderchars currently. --- lua/telescope/config/resolve.lua | 155 ++++++++++++++++++++++++++++++ lua/telescope/pickers.lua | 17 ++-- lua/telescope/pickers/config_collapse.lua | 103 -------------------- lua/tests/manual/resolver_spec.lua | 58 +++++++++++ 4 files changed, 222 insertions(+), 111 deletions(-) create mode 100644 lua/telescope/config/resolve.lua delete mode 100644 lua/telescope/pickers/config_collapse.lua create mode 100644 lua/tests/manual/resolver_spec.lua (limited to 'lua') diff --git a/lua/telescope/config/resolve.lua b/lua/telescope/config/resolve.lua new file mode 100644 index 0000000..5aa9c84 --- /dev/null +++ b/lua/telescope/config/resolve.lua @@ -0,0 +1,155 @@ + +--[[ + +Ultimately boils down to getting `height` and `width` for: +- prompt +- preview +- results + +No matter what you do, I will not make prompt have more than one line (atm) + +Result of `resolve` should be a table with: + +{ + preview = { + get_width = function(self, max_columns, max_lines) end + get_height = function(self, max_columns, max_lines) end + }, + + result = { + get_width = function(self, max_columns, max_lines) end + get_height = function(self, max_columns, max_lines) end + }, + + prompt = { + get_width = function(self, max_columns, max_lines) return 1end + get_height = function(self, max_columns, max_lines) end + }, +} + +!!NOT IMPLEMENTED YET!! + +height = + 1. pass between 0 & 1 + This means total height as a percentage + + 2. pass a number > 1 + This means total height as a fixed number + + 3. { + previewer = x, + results = x, + prompt = x, + }, this means I do my best guess I can for these, given your options + + 4. function(max_rows) + -> returns one of the above options + return max.min(110, max_rows * .5) + + if columns > 120 then + return 110 + else + return 0.6 + end + +width = + exactly the same, but switch to width + + +{ + height = 0.5, + width = { + previewer = 0.25, + results = 30, + } +} + +https://github.com/nvim-lua/telescope.nvim/pull/43 + +After we get layout, we should try and make top-down sorting work. +That's the next step to scrolling. + +{ + vertical = { + }, + horizontal = { + }, + + height = ... + width = ... +} + + + +--]] + +local get_default = require('telescope.utils').get_default + +local resolver = {} + +local percentage_resolver = function(selector, percentage) + assert(percentage <= 1) + assert(percentage >= 0) + + return function(...) + return percentage * select(selector, ...) + end +end + +resolver.resolve_percentage_height = function(percentage) + return percentage_resolver(3, percentage) +end + +resolver.resolve_percentage_width = function(percentage) + return percentage_resolver(2, percentage) +end + +--- Win option always returns a table with preview, results, and prompt. +--- It handles many different ways. Some examples are as follows: +-- +-- -- Disable +-- borderschars = false +-- +-- -- All three windows share the same +-- borderchars = { '─', '│', '─', '│', '┌', '┐', '┘', '└'}, +-- +-- -- Each window gets it's own configuration +-- borderchars = { +-- preview = {...}, +-- results = {...}, +-- prompt = {...}, +-- } +-- +-- -- Default to [1] but override with specific items +-- borderchars = { +-- {...} +-- prompt = {...}, +-- } +resolver.win_option = function(val, default) + if type(val) ~= 'table' or vim.tbl_islist(val) then + if val == nil then + val = default + end + + return { + preview = val, + results = val, + prompt = val, + } + elseif type(val) == 'table' then + assert(not vim.tbl_islist(val)) + + local val_to_set = val[1] + if val_to_set == nil then + val_to_set = default + end + + return { + preview = get_default(val.preview, val_to_set), + results = get_default(val.results, val_to_set), + prompt = get_default(val.prompt, val_to_set), + } + end +end + +return resolver diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index cd83b3c..d402b39 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -3,6 +3,7 @@ local popup = require('popup') local actions = require('telescope.actions') local config = require('telescope.config') +local resolve = require('telescope.config.resolve') local layout_strategies = require('telescope.pickers.layout_strategies') local log = require('telescope.log') local mappings = require('telescope.mappings') @@ -134,28 +135,28 @@ function Picker:new(opts) end function Picker:_get_initial_window_options(prompt_title) - local popup_border = self.window.border - local popup_borderchars = self.window.borderchars + local popup_border = resolve.win_option(self.window.border) + local popup_borderchars = resolve.win_option(self.window.borderchars) local preview = { title = 'Preview', - border = popup_border, - borderchars = popup_borderchars, + border = popup_border.preview, + borderchars = popup_borderchars.preview, enter = false, highlight = false } local results = { title = 'Results', - border = popup_border, - borderchars = popup_borderchars, + border = popup_border.results, + borderchars = popup_borderchars.results, enter = false, } local prompt = { title = prompt_title, - border = popup_border, - borderchars = popup_borderchars, + border = popup_border.prompt, + borderchars = popup_borderchars.prompt, enter = true } diff --git a/lua/telescope/pickers/config_collapse.lua b/lua/telescope/pickers/config_collapse.lua deleted file mode 100644 index ee59c10..0000000 --- a/lua/telescope/pickers/config_collapse.lua +++ /dev/null @@ -1,103 +0,0 @@ - ---[[ - -Ultimately boils down to getting `height` and `width` for: -- prompt -- preview -- results - -No matter what you do, I will not make prompt have more than one line (atm) - -Result of `resolve` should be a table with: - -{ - preview = { - get_width = function(self, max_columns, max_lines) end - get_height = function(self, max_columns, max_lines) end - }, - - result = { - get_width = function(self, max_columns, max_lines) end - get_height = function(self, max_columns, max_lines) end - }, - - prompt = { - get_width = function(self, max_columns, max_lines) return 1end - get_height = function(self, max_columns, max_lines) end - }, -} - -!!NOT IMPLEMENTED YET!! - -height = - 1. pass between 0 & 1 - This means total height as a percentage - - 2. pass a number > 1 - This means total height as a fixed number - - 3. { - previewer = x, - results = x, - prompt = x, - }, this means I do my best guess I can for these, given your options - - 4. function(max_rows) - -> returns one of the above options - return max.min(110, max_rows * .5) - - if columns > 120 then - return 110 - else - return 0.6 - end - -width = - exactly the same, but switch to width - - -{ - height = 0.5, - width = { - previewer = 0.25, - results = 30, - } -} - -https://github.com/nvim-lua/telescope.nvim/pull/43 - -After we get layout, we should try and make top-down sorting work. -That's the next step to scrolling. - -{ - vertical = { - }, - horizontal = { - }, - - height = ... - width = ... -} - ---]] - -local resolver = {} - -local percentage_resolver = function(selector, percentage) - assert(percentage <= 1) - assert(percentage >= 0) - - return function(...) - return percentage * select(selector, ...) - end -end - -resolver.resolve_percentage_height = function(percentage) - return percentage_resolver(3, percentage) -end - -resolver.resolve_percentage_width = function(percentage) - return percentage_resolver(2, percentage) -end - -return resolver diff --git a/lua/tests/manual/resolver_spec.lua b/lua/tests/manual/resolver_spec.lua new file mode 100644 index 0000000..b71e560 --- /dev/null +++ b/lua/tests/manual/resolver_spec.lua @@ -0,0 +1,58 @@ +RELOAD('telescope') + +local resolve = require('telescope.config.resolve') + +local eq = function(a, b) + if a ~= b then + error(string.format( + "Expected a == b, got: %s and %s", vim.inspect(a), vim.inspect(b) + )) + end +end + +local opt = nil + +local height_config = 0.8 +opt = resolve.win_option(height_config) + +eq(height_config, opt.preview) +eq(height_config, opt.prompt) +eq(height_config, opt.results) + +opt = resolve.win_option(nil, height_config) + +eq(height_config, opt.preview) +eq(height_config, opt.prompt) +eq(height_config, opt.results) + +local table_val = {'a'} +opt = resolve.win_option(nil, table_val) +eq(table_val, opt.preview) +eq(table_val, opt.prompt) +eq(table_val, opt.results) + +local prompt_override = {'a', prompt = 'b'} +opt = resolve.win_option(prompt_override) +eq('a', opt.preview) +eq('a', opt.results) +eq('b', opt.prompt) + +local all_specified = {preview = 'a', prompt = 'b', results = 'c'} +opt = resolve.win_option(all_specified) +eq('a', opt.preview) +eq('b', opt.prompt) +eq('c', opt.results) + +local some_specified = {prompt = 'b', results = 'c'} +opt = resolve.win_option(some_specified, 'a') +eq('a', opt.preview) +eq('b', opt.prompt) +eq('c', opt.results) + +-- local true_table = {true} +-- opt = resolve.win_option(some_specified, 'a') +-- eq('a', opt.preview) +-- eq('b', opt.prompt) +-- eq('c', opt.results) + +print("DONE!") -- cgit v1.2.3