diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index 3ee8dec..a5079f0 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -14,7 +14,6 @@ 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') @@ -40,6 +39,8 @@ 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') @@ -129,8 +130,6 @@ function Picker:new(opts) obj.sorting_strategy ) - obj.highlighter = p_highlights.new(obj) - return obj end @@ -253,7 +252,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, math.min(#displayed_rows, self.max_results) do + for row_index = 1, #displayed_rows do local display = displayed_rows[row_index] self:highlight_one_row(results_bufnr, prompt, display, row_index - 1) @@ -375,7 +374,6 @@ 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]] @@ -423,7 +421,10 @@ function Picker:find() return end - local prompt = self:_get_prompt() + local prompt = vim.trim( + vim.api.nvim_buf_get_lines(prompt_bufnr, first_line, last_line, false)[1]:sub(#prompt_prefix) + ) + if self.sorter then self.sorter:_start(prompt) end @@ -554,8 +555,6 @@ 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. @@ -684,21 +683,19 @@ function Picker:add_selection(row) end function Picker:display_multi_select(results_bufnr) - 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 + 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() @@ -743,27 +740,26 @@ function Picker:set_selection(row) return end - local prompt = self:_get_prompt() + local prompt = vim.api.nvim_buf_get_lines(self.prompt_bufnr, 0, 1, false)[1] -- Handle adding '> ' to beginning of selections if self._selection_row then - local display, display_highlights = entry_display.resolve(self, self._selection_entry) + local old_selection = a.nvim_buf_get_lines(results_bufnr, self._selection_row, self._selection_row + 1, false)[1] - if display then - display = ' ' .. display - a.nvim_buf_set_lines(results_bufnr, self._selection_row, self._selection_row + 1, false, {display}) + 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}) - self.highlighter:hi_display(self._selection_row, ' ', display_highlights) - self.highlighter:hi_sorter(self._selection_row, prompt, display) + if prompt and self.sorter and self.sorter.highlighter then + self:highlight_one_row(results_bufnr, prompt, old_display, self._selection_row) + end 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, display_highlights = entry_display.resolve(self, entry) - display = caret .. ' ' .. display + local display = string.format('%s %s', caret, + (a.nvim_buf_get_lines(results_bufnr, row, row + 1, false)[1] or ''):sub(3) + ) -- TODO: You should go back and redraw the highlights for this line from the sorter. -- That's the only smart thing to do. @@ -773,12 +769,29 @@ function Picker:set_selection(row) end a.nvim_buf_set_lines(results_bufnr, row, row + 1, false, {display}) - self.highlighter:hi_selection(row, caret) - self.highlighter:hi_display(row, ' ', display_highlights) - self.highlighter:hi_sorter(row, prompt, 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 + ) - -- TODO: Actually implement this for real TJ, don't leave around half implemented code plz :) - -- self:display_multi_select(results_bufnr) + self:display_multi_select(results_bufnr) + + if prompt and self.sorter and self.sorter.highlighter then + self:highlight_one_row(results_bufnr, prompt, display, row) + end end) if not set_ok then @@ -837,7 +850,15 @@ 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 - self.highlighter:hi_display(row, prefix, display_highlights) + -- 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 end -- This pretty much only fails when people leave newlines in their results. @@ -925,16 +946,6 @@ 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 diff --git a/lua/telescope/pickers/highlights.lua b/lua/telescope/pickers/highlights.lua deleted file mode 100644 index 2ba5311..0000000 --- a/lua/telescope/pickers/highlights.lua +++ /dev/null @@ -1,76 +0,0 @@ -local a = vim.api - -local highlights = {} - -local ns_telescope_selection = a.nvim_create_namespace('telescope_selection') -local ns_telescope_entry = a.nvim_create_namespace('telescope_entry') - -local Highlighter = {} -Highlighter.__index = Highlighter - -function Highlighter:new(picker) - return setmetatable({ - picker = picker, - }, self) -end - -function Highlighter:hi_display(row, prefix, display_highlights) - local results_bufnr = assert(self.picker.results_bufnr, "Must have a results bufnr") - - a.nvim_buf_clear_namespace(results_bufnr, ns_telescope_entry, row, row + 1) - local len_prefix = #prefix - - for _, hl_block in ipairs(display_highlights) do - a.nvim_buf_add_highlight( - results_bufnr, - ns_telescope_entry, - hl_block[2], - row, - len_prefix + hl_block[1][1], - len_prefix + hl_block[1][2] - ) - end -end - -function Highlighter:clear_display() - a.nvim_buf_clear_namespace(self.picker.results_bufnr, ns_telescope_entry, 0, -1) -end - -function Highlighter:hi_sorter(row, prompt, display) - local picker = self.picker - if not picker.sorter or not picker.sorter.highlighter then - return - end - - local results_bufnr = assert(self.picker.results_bufnr, "Must have a results bufnr") - picker:highlight_one_row(results_bufnr, prompt, display, row) -end - -function Highlighter:hi_selection(row, caret) - local results_bufnr = assert(self.picker.results_bufnr, "Must have a results bufnr") - - 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 - ) -end - -highlights.new = function(...) - return Highlighter:new(...) -end - -return highlights diff --git a/scratch/digia_init.vim b/scratch/digia_init.vim deleted file mode 100644 index 06c9c7a..0000000 --- a/scratch/digia_init.vim +++ /dev/null @@ -1,16 +0,0 @@ -set rtp+=. -set rtp+=../plenary.nvim/ -set rtp+=../popup.nvim/ - - -set statusline="" -set statusline+=%<%f:%l:%v " filename:col:line/total lines -set statusline+=\ " -set statusline+=%h%m%r " help/modified/readonly -set statusline+=\ " -set statusline+=[%{&ft}] " filetype -set statusline+=%= " alignment group -set statusline+=\ " - -" nnoremap :lua require('telescope.builtin').git_files() -nnoremap :lua require("telescope.builtin").find_files{ find_command = { "rg", "--smart-case", "--files", "--hidden", "--follow", "-g", "!.git/*" } }