summaryrefslogtreecommitdiff
path: root/lua/telescope/pickers.lua
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2020-12-21 16:03:48 -0500
committerGitHub <noreply@github.com>2020-12-21 16:03:48 -0500
commit2aa8bcb87898ed4f45d67c640fe1d6a60b184637 (patch)
tree2207ccb7546112fdc03700525e79c55ffaed7679 /lua/telescope/pickers.lua
parent1e7ef41c704f027a989325c0171a852e8207ec24 (diff)
feat: Add better highlighting and new CI abilities (#355)
* Revert "Revert "fix: Better highlights (#344)" (#350)" This reverts commit 7950fc8ba0accfcf6c540c7810feee646281fd8a. * better highlights take 2 * fixup * install fd find for sameness * add some debug output * more deterministic * better ci
Diffstat (limited to 'lua/telescope/pickers.lua')
-rw-r--r--lua/telescope/pickers.lua123
1 files changed, 59 insertions, 64 deletions
diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua
index a5079f0..96af5b6 100644
--- a/lua/telescope/pickers.lua
+++ b/lua/telescope/pickers.lua
@@ -14,6 +14,7 @@ local utils = require('telescope.utils')
local layout_strategies = require('telescope.pickers.layout_strategies')
local entry_display = require('telescope.pickers.entry_display')
+local p_highlights = require('telescope.pickers.highlights')
local p_scroller = require('telescope.pickers.scroller')
local EntryManager = require('telescope.entry_manager')
@@ -39,8 +40,6 @@ local extend = function(opts, defaults)
return result
end
-local ns_telescope_selection = a.nvim_create_namespace('telescope_selection')
-local ns_telescope_entry = a.nvim_create_namespace('telescope_entry')
local ns_telescope_matching = a.nvim_create_namespace('telescope_matching')
local ns_telescope_prompt = a.nvim_create_namespace('telescope_prompt')
local ns_telescope_prompt_prefix = a.nvim_create_namespace('telescope_prompt_prefix')
@@ -130,6 +129,14 @@ function Picker:new(opts)
obj.sorting_strategy
)
+ obj.highlighter = p_highlights.new(obj)
+
+ if opts.on_complete then
+ for _, on_complete_item in ipairs(opts.on_complete) do
+ obj:register_completion_callback(on_complete_item)
+ end
+ end
+
return obj
end
@@ -178,7 +185,7 @@ function Picker:get_window_options(max_columns, max_lines)
end
--- Take a row and get an index.
----@note: Rows are 0-indexed, and `index` is 1 indexed (table index)
+--- @note: Rows are 0-indexed, and `index` is 1 indexed (table index)
---@param index number: The row being displayed
---@return number The row for the picker to display in
function Picker:get_row(index)
@@ -252,7 +259,7 @@ function Picker:highlight_displayed_rows(results_bufnr, prompt)
vim.api.nvim_buf_clear_namespace(results_bufnr, ns_telescope_matching, 0, -1)
local displayed_rows = vim.api.nvim_buf_get_lines(results_bufnr, 0, -1, false)
- for row_index = 1, #displayed_rows do
+ for row_index = 1, math.min(#displayed_rows, self.max_results) do
local display = displayed_rows[row_index]
self:highlight_one_row(results_bufnr, prompt, display, row_index - 1)
@@ -374,6 +381,7 @@ function Picker:find()
a.nvim_buf_add_highlight(prompt_bufnr, ns_telescope_prompt_prefix, 'TelescopePromptPrefix', 0, 0, #prompt_prefix)
end
+ self.prompt_prefix = prompt_prefix
-- Temporarily disabled: Draw the screen ASAP. This makes things feel speedier.
-- vim.cmd [[redraw]]
@@ -421,10 +429,7 @@ function Picker:find()
return
end
- local prompt = vim.trim(
- vim.api.nvim_buf_get_lines(prompt_bufnr, first_line, last_line, false)[1]:sub(#prompt_prefix)
- )
-
+ local prompt = self:_get_prompt()
if self.sorter then
self.sorter:_start(prompt)
end
@@ -555,6 +560,8 @@ function Picker:find()
vim.api.nvim_buf_attach(prompt_bufnr, false, {
on_lines = on_lines,
on_detach = vim.schedule_wrap(function()
+ self:_reset_highlights()
+
on_lines = nil
-- TODO: Can we add a "cleanup" / "teardown" function that completely removes these.
@@ -683,19 +690,21 @@ function Picker:add_selection(row)
end
function Picker:display_multi_select(results_bufnr)
- for entry, _ in pairs(self.multi_select) do
- local index = self.manager:find_entry(entry)
- if index then
- vim.api.nvim_buf_add_highlight(
- results_bufnr,
- ns_telescope_selection,
- "TelescopeMultiSelection",
- self:get_row(index),
- 0,
- -1
- )
- end
- end
+ if true then return end
+
+ -- for entry, _ in pairs(self.multi_select) do
+ -- local index = self.manager:find_entry(entry)
+ -- if index then
+ -- vim.api.nvim_buf_add_highlight(
+ -- results_bufnr,
+ -- ns_telescope_selection,
+ -- "TelescopeMultiSelection",
+ -- self:get_row(index),
+ -- 0,
+ -- -1
+ -- )
+ -- end
+ -- end
end
function Picker:reset_selection()
@@ -740,26 +749,27 @@ function Picker:set_selection(row)
return
end
- local prompt = vim.api.nvim_buf_get_lines(self.prompt_bufnr, 0, 1, false)[1]
+ local prompt = self:_get_prompt()
-- Handle adding '> ' to beginning of selections
if self._selection_row then
- local old_selection = a.nvim_buf_get_lines(results_bufnr, self._selection_row, self._selection_row + 1, false)[1]
+ local display, display_highlights = entry_display.resolve(self, self._selection_entry)
- if old_selection then
- local old_display = ' ' .. old_selection:sub(3)
- a.nvim_buf_set_lines(results_bufnr, self._selection_row, self._selection_row + 1, false, {old_display})
+ if display then
+ display = ' ' .. display
+ a.nvim_buf_set_lines(results_bufnr, self._selection_row, self._selection_row + 1, false, {display})
- if prompt and self.sorter and self.sorter.highlighter then
- self:highlight_one_row(results_bufnr, prompt, old_display, self._selection_row)
- end
+ self.highlighter:hi_display(self._selection_row, ' ', display_highlights)
+ self.highlighter:hi_sorter(self._selection_row, prompt, display)
end
end
local caret = '>'
- local display = string.format('%s %s', caret,
- (a.nvim_buf_get_lines(results_bufnr, row, row + 1, false)[1] or ''):sub(3)
- )
+ -- local display = string.format('%s %s', caret,
+ -- (a.nvim_buf_get_lines(results_bufnr, row, row + 1, false)[1] or ''):sub(3)
+ -- )
+ local display, display_highlights = entry_display.resolve(self, entry)
+ display = caret .. ' ' .. display
-- TODO: You should go back and redraw the highlights for this line from the sorter.
-- That's the only smart thing to do.
@@ -769,29 +779,12 @@ function Picker:set_selection(row)
end
a.nvim_buf_set_lines(results_bufnr, row, row + 1, false, {display})
- a.nvim_buf_clear_namespace(results_bufnr, ns_telescope_selection, 0, -1)
- a.nvim_buf_add_highlight(
- results_bufnr,
- ns_telescope_selection,
- 'TelescopeSelectionCaret',
- row,
- 0,
- #caret
- )
- a.nvim_buf_add_highlight(
- results_bufnr,
- ns_telescope_selection,
- 'TelescopeSelection',
- row,
- #caret,
- -1
- )
-
- self:display_multi_select(results_bufnr)
+ self.highlighter:hi_selection(row, caret)
+ self.highlighter:hi_display(row, ' ', display_highlights)
+ self.highlighter:hi_sorter(row, prompt, display)
- if prompt and self.sorter and self.sorter.highlighter then
- self:highlight_one_row(results_bufnr, prompt, display, row)
- end
+ -- TODO: Actually implement this for real TJ, don't leave around half implemented code plz :)
+ -- self:display_multi_select(results_bufnr)
end)
if not set_ok then
@@ -850,15 +843,7 @@ function Picker:entry_adder(index, entry, score)
local set_ok = pcall(vim.api.nvim_buf_set_lines, self.results_bufnr, row, row + 1, false, {display})
if set_ok and display_highlights then
- -- TODO: This should actually be done during the cursor moving stuff annoyingly.... didn't see this bug yesterday.
- for _, hl_block in ipairs(display_highlights) do
- a.nvim_buf_add_highlight(self.results_bufnr,
- ns_telescope_entry,
- hl_block[2],
- row,
- #prefix + hl_block[1][1],
- #prefix + hl_block[1][2])
- end
+ self.highlighter:hi_display(row, prefix, display_highlights)
end
-- This pretty much only fails when people leave newlines in their results.
@@ -917,7 +902,7 @@ end
function Picker:_on_complete()
for _, v in ipairs(self._completion_callbacks) do
- v(self)
+ pcall(v, self)
end
end
@@ -946,6 +931,16 @@ function pickers.on_close_prompt(prompt_bufnr)
picker.close_windows(status)
end
+function Picker:_get_prompt()
+ return vim.trim(
+ vim.api.nvim_buf_get_lines(self.prompt_bufnr, 0, 1, false)[1]:sub(#self.prompt_prefix)
+ )
+end
+
+function Picker:_reset_highlights()
+ self.highlighter:clear_display()
+end
+
pickers._Picker = Picker