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)