diff --git a/doc/telescope.txt b/doc/telescope.txt index 56cb6c8..2c5e712 100644 --- a/doc/telescope.txt +++ b/doc/telescope.txt @@ -91,6 +91,37 @@ telescope.extensions() *telescope.extensions()* +================================================================================ + *telescope.themes* + +Themes are ways to combine several elements of styling together. + +They are helpful for managing the several differnt UI aspects for telescope and +provide a simple interface for users to get a particular "style" of picker. + +themes.get_dropdown() *themes.get_dropdown()* + Dropdown style theme. + + Usage: + + `local builtin = require('telescope.builtin')` + `local themes = require('telescope.themes')` + `builtin.find_files(themes.get_dropdown())` + + + +themes.get_ivy() *themes.get_ivy()* + Ivy style theme. + + Usage: + + `local builtin = require('telescope.builtin')` + `local themes = require('telescope.themes')` + `builtin.find_files(themes.get_ivy())` + + + + ================================================================================ *telescope.actions.set* diff --git a/lua/telescope/pickers/layout_strategies.lua b/lua/telescope/pickers/layout_strategies.lua index b4c9fda..21994b3 100644 --- a/lua/telescope/pickers/layout_strategies.lua +++ b/lua/telescope/pickers/layout_strategies.lua @@ -61,38 +61,7 @@ local config = require('telescope.config') local resolve = require("telescope.config.resolve") -local function get_initial_window_options(picker) - local popup_border = resolve.win_option(picker.window.border) - local popup_borderchars = resolve.win_option(picker.window.borderchars) - - local preview = { - title = picker.preview_title, - border = popup_border.preview, - borderchars = popup_borderchars.preview, - enter = false, - highlight = false - } - - local results = { - title = picker.results_title, - border = popup_border.results, - borderchars = popup_borderchars.results, - enter = false, - } - - local prompt = { - title = picker.prompt_title, - border = popup_border.prompt, - borderchars = popup_borderchars.prompt, - enter = true - } - - return { - preview = preview, - results = results, - prompt = prompt, - } -end +local p_window = require('telescope.pickers.window') -- Check if there are any borders. Right now it's a little raw as @@ -139,7 +108,7 @@ layout_strategies.horizontal = function(self, max_columns, max_lines) scroll_speed = "The speed when scrolling through the previewer", }) - local initial_options = get_initial_window_options(self) + local initial_options = p_window.get_initial_window_options(self) local preview = initial_options.preview local results = initial_options.results local prompt = initial_options.prompt @@ -237,7 +206,7 @@ end --- +--------------+ --- layout_strategies.center = function(self, columns, lines) - local initial_options = get_initial_window_options(self) + local initial_options = p_window.get_initial_window_options(self) local preview = initial_options.preview local results = initial_options.results local prompt = initial_options.prompt @@ -307,7 +276,7 @@ layout_strategies.vertical = function(self, max_columns, max_lines) scroll_speed = "The speed when scrolling through the previewer", }) - local initial_options = get_initial_window_options(self) + local initial_options = p_window.get_initial_window_options(self) local preview = initial_options.preview local results = initial_options.results local prompt = initial_options.prompt @@ -447,4 +416,67 @@ layout_strategies.current_buffer = function(self, _, _) } end +layout_strategies.bottom_pane = function(self, max_columns, max_lines) + local layout_config = validate_layout_config(self.layout_config or {}, { + height = "The height of the layout", + }) + + local initial_options = p_window.get_initial_window_options(self) + local results = initial_options.results + local prompt = initial_options.prompt + local preview = initial_options.preview + + local result_height = layout_config.height or 25 + + local prompt_width = max_columns + local col = 0 + + local has_border = not not self.window.border + if has_border then + col = 1 + prompt_width = prompt_width - 2 + end + + local result_width + if self.previewer then + result_width = math.floor(prompt_width / 2) + + local base_col = result_width + 1 + if has_border then + preview = vim.tbl_deep_extend("force", { + col = base_col + 2, + line = max_lines - result_height + 1, + width = prompt_width - result_width - 2, + height = result_height - 1, + }, preview) + else + preview = vim.tbl_deep_extend("force", { + col = base_col, + line = max_lines - result_height, + width = prompt_width - result_width, + height = result_height, + }, preview) + end + else + preview = nil + result_width = prompt_width + end + + return { + preview = preview, + prompt = vim.tbl_deep_extend("force", prompt, { + line = max_lines - result_height - 1, + col = col, + height = 1, + width = prompt_width, + }), + results = vim.tbl_deep_extend("force", results, { + line = max_lines - result_height, + col = col, + height = result_height, + width = result_width, + }), + } +end + return layout_strategies diff --git a/lua/telescope/pickers/window.lua b/lua/telescope/pickers/window.lua index 76c1fe0..533fe30 100644 --- a/lua/telescope/pickers/window.lua +++ b/lua/telescope/pickers/window.lua @@ -1,10 +1,10 @@ -local p_layouts = require('telescope.pickers.layout_strategies') +local resolve = require("telescope.config.resolve") local p_window = {} function p_window.get_window_options(picker, max_columns, max_lines) local layout_strategy = picker.layout_strategy - local getter = p_layouts[layout_strategy] + local getter = require('telescope.pickers.layout_strategies')[layout_strategy] if not getter then error("Not a valid layout strategy: " .. layout_strategy) @@ -13,5 +13,38 @@ function p_window.get_window_options(picker, max_columns, max_lines) return getter(picker, max_columns, max_lines) end +function p_window.get_initial_window_options(picker) + local popup_border = resolve.win_option(picker.window.border) + local popup_borderchars = resolve.win_option(picker.window.borderchars) + + local preview = { + title = picker.preview_title, + border = popup_border.preview, + borderchars = popup_borderchars.preview, + enter = false, + highlight = false + } + + local results = { + title = picker.results_title, + border = popup_border.results, + borderchars = popup_borderchars.results, + enter = false, + } + + local prompt = { + title = picker.prompt_title, + border = popup_border.prompt, + borderchars = popup_borderchars.prompt, + enter = true + } + + return { + preview = preview, + results = results, + prompt = prompt, + } +end + return p_window diff --git a/lua/telescope/themes.lua b/lua/telescope/themes.lua index eba3d11..f2af1a7 100644 --- a/lua/telescope/themes.lua +++ b/lua/telescope/themes.lua @@ -2,10 +2,27 @@ -- Currently certain designs need a number of parameters. -- -- local opts = themes.get_dropdown { winblend = 3 } --- + +---@tag telescope.themes + +---@brief [[ +--- Themes are ways to combine several elements of styling together. +--- +--- They are helpful for managing the several differnt UI aspects for telescope and provide +--- a simple interface for users to get a particular "style" of picker. +---@brief ]] local themes = {} +--- Dropdown style theme. +---
+---
+--- Usage:
+---
+---     `local builtin = require('telescope.builtin')`
+---     `local themes = require('telescope.themes')`
+---     `builtin.find_files(themes.get_dropdown())`
+--- 
function themes.get_dropdown(opts) opts = opts or {} @@ -21,14 +38,49 @@ function themes.get_dropdown(opts) width = 80, results_height = 15, borderchars = { - { '─', '│', '─', '│', '╭', '╮', '╯', '╰'}, + { "─", "│", "─", "│", "╭", "╮", "╯", "╰"}, prompt = {"─", "│", " ", "│", "╭", "╮", "│", "│"}, results = {"─", "│", "─", "│", "├", "┤", "╯", "╰"}, - preview = { '─', '│', '─', '│', '╭', '╮', '╯', '╰'}, + preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰"}, }, } return vim.tbl_deep_extend("force", theme_opts, opts) end +--- Ivy style theme. +---
+---
+--- Usage:
+---
+---     `local builtin = require('telescope.builtin')`
+---     `local themes = require('telescope.themes')`
+---     `builtin.find_files(themes.get_ivy())`
+--- 
+function themes.get_ivy(opts) + opts = opts or {} + + return vim.tbl_deep_extend("force", { + theme = "ivy", + + sorting_strategy = "ascending", + + preview_title = "", + + layout_strategy = "bottom_pane", + layout_config = { + height = 25, + }, + + border = true, + borderchars = { + "z", + prompt = { "─", " ", " ", " ", "─", "─", " ", " " }, + results = { " " }, + -- results = { "a", "b", "c", "d", "e", "f", "g", "h" }, + preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰"}, + }, + }, opts) +end + return themes diff --git a/scratch/ivy.lua b/scratch/ivy.lua new file mode 100644 index 0000000..65d9049 --- /dev/null +++ b/scratch/ivy.lua @@ -0,0 +1,31 @@ + +RELOAD('telescope') +require('telescope.builtin').find_files(require('telescope.themes').get_ivy { previewer = false }) + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/gendocs.lua b/scripts/gendocs.lua index ead868a..53423f2 100644 --- a/scripts/gendocs.lua +++ b/scripts/gendocs.lua @@ -15,6 +15,7 @@ docs.test = function() "./lua/telescope/actions/state.lua", "./lua/telescope/actions/set.lua", "./lua/telescope/previewers/init.lua", + "./lua/telescope/themes.lua", } table.sort(input_files, function(a, b)