summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2021-05-15 12:02:14 -0700
committerGitHub <noreply@github.com>2021-05-15 15:02:14 -0400
commit4da66dab44f37d0de4b88cedf9e114c5b0855c20 (patch)
treeea0179d0d0c8be5e716ce70d6dab14aa4fc4fcac
parentb78d4ef10c72597c322baaa3830c760a26734b21 (diff)
feat: add ivy-style layout strategy (#771)
* feat: add new layout strategy * [docgen] Update doc/telescope.txt skip-checks: true Co-authored-by: Github Actions <actions@github>
-rw-r--r--doc/telescope.txt31
-rw-r--r--lua/telescope/pickers/layout_strategies.lua102
-rw-r--r--lua/telescope/pickers/window.lua37
-rw-r--r--lua/telescope/themes.lua58
-rw-r--r--scratch/ivy.lua31
-rw-r--r--scripts/gendocs.lua1
6 files changed, 220 insertions, 40 deletions
diff --git a/doc/telescope.txt b/doc/telescope.txt
index 56cb6c8..2c5e712 100644
--- a/doc/telescope.txt
+++ b/doc/telescope.txt
@@ -92,6 +92,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*
Telescope action sets are used to provide an interface for managing actions
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
--- +--------------+
--- </pre>
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.
+--- <pre>
+---
+--- Usage:
+---
+--- `local builtin = require('telescope.builtin')`
+--- `local themes = require('telescope.themes')`
+--- `builtin.find_files(themes.get_dropdown())`
+--- </pre>
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.
+--- <pre>
+---
+--- Usage:
+---
+--- `local builtin = require('telescope.builtin')`
+--- `local themes = require('telescope.themes')`
+--- `builtin.find_files(themes.get_ivy())`
+--- </pre>
+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)