Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add cursor layout #878

Merged
merged 18 commits into from
Jul 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ We have some built in themes but are looking for more cool options.
| Themes | Description |
|--------------------------|---------------------------------------------------------------------------------------------|
| `themes.get_dropdown` | A list like centered list. [dropdown](https://i.imgur.com/SorAcXv.png) |
| `themes.get_cursor` | A cursor relative list. |
| `themes.get_ivy` | Bottom panel overlay. [Ivy #771](https://github.com/nvim-telescope/telescope.nvim/pull/771) |

To use a theme, simply append it to a built-in function:
Expand Down
37 changes: 37 additions & 0 deletions doc/telescope.txt
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ telescope.setup({opts}) *telescope.setup()*
center = {
preview_cutoff = 40
},
cursor = {
preview_cutoff = 40
},
height = 0.9,
horizontal = {
preview_cutoff = 120,
Expand Down Expand Up @@ -890,6 +893,17 @@ themes.get_dropdown() *themes.get_dropdown()*



themes.get_cursor() *themes.get_cursor()*
Cursor style theme.

Usage:

`local builtin = require('telescope.builtin')`
`local themes = require('telescope.themes')`
`builtin.lsp_code_actions(themes.get_cursor())`



themes.get_ivy() *themes.get_ivy()*
Ivy style theme.

Expand Down Expand Up @@ -1012,6 +1026,29 @@ layout_strategies.center() *layout_strategies.center()*
- preview_cutoff: When lines are less than this value, the preview will be disabled


layout_strategies.cursor() *layout_strategies.cursor()*
Cursor layout dynamically positioned below the cursor if possible. If there
is no place below the cursor it will be placed above.

┌──────────────────────────────────────────────────┐
│ │
│ █ │
│ ┌──────────────┐┌─────────────────────┐ │
│ │ Prompt ││ Preview │ │
│ ├──────────────┤│ Preview │ │
│ │ Result ││ Preview │ │
│ │ Result ││ Preview │ │
│ └──────────────┘└─────────────────────┘ │
│ █ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘



layout_strategies.vertical() *layout_strategies.vertical()*
Vertical layout stacks the items on top of each other. Particularly useful
with thinner windows.
Expand Down
4 changes: 4 additions & 0 deletions lua/telescope/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ local layout_config_defaults = {
center = {
preview_cutoff = 40,
},

cursor = {
preview_cutoff = 40,
}
}

local layout_config_description = string.format([[
Expand Down
93 changes: 93 additions & 0 deletions lua/telescope/pickers/layout_strategies.lua
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,99 @@ layout_strategies.center = make_documented_layout("center", vim.tbl_extend("erro
}
end)

--- Cursor layout dynamically positioned below the cursor if possible.
--- If there is no place below the cursor it will be placed above.
---
--- <pre>
--- ┌──────────────────────────────────────────────────┐
--- │ │
--- │ █ │
--- │ ┌──────────────┐┌─────────────────────┐ │
--- │ │ Prompt ││ Preview │ │
--- │ ├──────────────┤│ Preview │ │
--- │ │ Result ││ Preview │ │
--- │ │ Result ││ Preview │ │
--- │ └──────────────┘└─────────────────────┘ │
--- │ █ │
--- │ │
--- │ │
--- │ │
--- │ │
--- │ │
--- └──────────────────────────────────────────────────┘
--- </pre>
layout_strategies.cursor = make_documented_layout("cursor", vim.tbl_extend("error", shared_options, {
preview_width = { "Change the width of Telescope's preview window", "See |resolver.resolve_width()|", },
preview_cutoff = "When columns are less than this value, the preview will be disabled",
}), function(self, max_columns, max_lines, layout_config)
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

local height_opt = layout_config.height
local height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)

local width_opt = layout_config.width
local width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)

local max_width = (width > max_columns and max_columns or width)

local bs = get_border_size(self)

prompt.height = 1
results.height = height
preview.height = results.height + prompt.height + bs

if self.previewer and max_columns >= layout_config.preview_cutoff then
preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols)
-- By default, previewer takes 2/3 of the layout
return 2 * math.floor(max_width / 3)
end))(self, max_width, max_lines)
else
preview.width = 0
end

prompt.width = max_width - preview.width
results.width = prompt.width

local total_height = preview.height + (bs*2)
local total_width = prompt.width + (bs*2) + preview.width + bs

local position = vim.api.nvim_win_get_position(0)
local top_left = {
line = vim.fn.winline() + position[1] + bs,
col = vim.fn.wincol() + position[2]
}
local bot_right = {
line = top_left.line + total_height - 1,
col = top_left.col + total_width - 1
}

if bot_right.line > max_lines then
-- position above current line
top_left.line = top_left.line - total_height - 1
end
if bot_right.col >= max_columns then
-- cap to the right of the screen
top_left.col = max_columns - total_width
end

prompt.line = top_left.line
results.line = prompt.line + bs + 1
preview.line = prompt.line

prompt.col = top_left.col
results.col = prompt.col
preview.col = results.col + (bs*2) + results.width

return {
preview = self.previewer and preview.width > 0 and preview,
results = results,
prompt = prompt
}
end)

--- Vertical layout stacks the items on top of each other.
--- Particularly useful with thinner windows.
---
Expand Down
38 changes: 38 additions & 0 deletions lua/telescope/themes.lua
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,44 @@ function themes.get_dropdown(opts)
return vim.tbl_deep_extend("force", theme_opts, opts)
end

--- Cursor style theme.
--- <pre>
---
--- Usage:
---
--- `local builtin = require('telescope.builtin')`
--- `local themes = require('telescope.themes')`
--- `builtin.lsp_code_actions(themes.get_cursor())`
--- </pre>
function themes.get_cursor(opts)
opts = opts or {}

local theme_opts = {
theme = 'cursor',

sorting_strategy = 'ascending',
results_title = false,
layout_strategy = 'cursor',
layout_config = {
width = function(_, _, _)
return 80
end,

height = function(_, _, _)
return 6
end,
},
borderchars = {
{ '─', '│', '─', '│', '╭', '╮', '╯', '╰'},
prompt = {'─', '│', ' ', '│', '╭', '╮', '│', '│'},
results = {'─', '│', '─', '│', '├', '┤', '╯', '╰'},
preview = { '─', '│', '─', '│', '╭', '╮', '╯', '╰'},
},
}

return vim.tbl_deep_extend('force', theme_opts, opts)
end

--- Ivy style theme.
--- <pre>
---
Expand Down