diff options
Diffstat (limited to 'lua/telescope/pickers.lua')
| -rw-r--r-- | lua/telescope/pickers.lua | 123 |
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 |
