diff --git a/README.md b/README.md index d616998..383989c 100644 --- a/README.md +++ b/README.md @@ -248,6 +248,10 @@ Many familiar mapping patterns are set up as defaults. | `` | Go to a file in a new tab | | `` | Scroll up in preview window | | `` | Scroll down in preview window | +| `` | Scroll left in preview window | +| `` | Scroll right in preview window | +| `` | Scroll left in results window | +| `` | Scroll right in results window | | `` | Show mappings for picker actions (insert mode) | | `?` | Show mappings for picker actions (normal mode) | | `` | Close telescope | diff --git a/doc/telescope.txt b/doc/telescope.txt index 15d5b6f..a6c1e64 100644 --- a/doc/telescope.txt +++ b/doc/telescope.txt @@ -2532,6 +2532,22 @@ actions.preview_scrolling_down({prompt_bufnr}) *telescope.actions.preview_scroll {prompt_bufnr} (number) The prompt bufnr +actions.preview_scrolling_left({prompt_bufnr}) *telescope.actions.preview_scrolling_left()* + Scroll the preview window to the left + + + Parameters: ~ + {prompt_bufnr} (number) The prompt bufnr + + +actions.preview_scrolling_right({prompt_bufnr}) *telescope.actions.preview_scrolling_right()* + Scroll the preview window to the right + + + Parameters: ~ + {prompt_bufnr} (number) The prompt bufnr + + actions.results_scrolling_up({prompt_bufnr}) *telescope.actions.results_scrolling_up()* Scroll the results window up @@ -2548,6 +2564,22 @@ actions.results_scrolling_down({prompt_bufnr}) *telescope.actions.results_scroll {prompt_bufnr} (number) The prompt bufnr +actions.results_scrolling_left({prompt_bufnr}) *telescope.actions.results_scrolling_left()* + Scroll the results window to the left + + + Parameters: ~ + {prompt_bufnr} (number) The prompt bufnr + + +actions.results_scrolling_right({prompt_bufnr}) *telescope.actions.results_scrolling_right()* + Scroll the results window to the right + + + Parameters: ~ + {prompt_bufnr} (number) The prompt bufnr + + actions.center({prompt_bufnr}) *telescope.actions.center()* Center the cursor in the window, can be used after selecting a file to edit You can just map `actions.select_default + actions.center` @@ -3407,6 +3439,7 @@ previewers.Previewer() *telescope.previewers.Previewer()* - `:teardown()` - `:send_input(input)` - `:scroll_fn(direction)` + - `:scroll_horizontal_fn(direction)` `Previewer:new()` expects a table as input with following keys: - `setup` function(self): Will be called the first time preview will be @@ -3422,6 +3455,8 @@ previewers.Previewer() *telescope.previewers.Previewer()* `termopen_previewer` and it can be used to send input to the terminal application, like less. - `scroll_fn` function(self, direction): Used to make scrolling work. + - `scroll_horizontal_fn` function(self, direction): Used to make + horizontal scrolling work. diff --git a/lua/telescope/actions/init.lua b/lua/telescope/actions/init.lua index 08f062e..a401ec9 100644 --- a/lua/telescope/actions/init.lua +++ b/lua/telescope/actions/init.lua @@ -222,6 +222,18 @@ actions.preview_scrolling_down = function(prompt_bufnr) action_set.scroll_previewer(prompt_bufnr, 1) end +--- Scroll the preview window to the left +---@param prompt_bufnr number: The prompt bufnr +actions.preview_scrolling_left = function(prompt_bufnr) + action_set.scroll_horizontal_previewer(prompt_bufnr, -1) +end + +--- Scroll the preview window to the right +---@param prompt_bufnr number: The prompt bufnr +actions.preview_scrolling_right = function(prompt_bufnr) + action_set.scroll_horizontal_previewer(prompt_bufnr, 1) +end + --- Scroll the results window up ---@param prompt_bufnr number: The prompt bufnr actions.results_scrolling_up = function(prompt_bufnr) @@ -234,6 +246,18 @@ actions.results_scrolling_down = function(prompt_bufnr) action_set.scroll_results(prompt_bufnr, 1) end +--- Scroll the results window to the left +---@param prompt_bufnr number: The prompt bufnr +actions.results_scrolling_left = function(prompt_bufnr) + action_set.scroll_horizontal_results(prompt_bufnr, -1) +end + +--- Scroll the results window to the right +---@param prompt_bufnr number: The prompt bufnr +actions.results_scrolling_right = function(prompt_bufnr) + action_set.scroll_horizontal_results(prompt_bufnr, 1) +end + --- Center the cursor in the window, can be used after selecting a file to edit --- You can just map `actions.select_default + actions.center` ---@param prompt_bufnr number: The prompt bufnr diff --git a/lua/telescope/actions/set.lua b/lua/telescope/actions/set.lua index 1f8041d..d535df5 100644 --- a/lua/telescope/actions/set.lua +++ b/lua/telescope/actions/set.lua @@ -241,6 +241,27 @@ action_set.scroll_previewer = function(prompt_bufnr, direction) previewer:scroll_fn(math.floor(speed * direction)) end +--- Scrolls the previewer to the left or right. +--- Defaults to a half page scroll, but can be overridden using the `scroll_speed` +--- option in `layout_config`. See |telescope.layout| for more details. +---@param prompt_bufnr number: The prompt bufnr +---@param direction number: The direction of the scrolling +-- Valid directions include: "1", "-1" +action_set.scroll_horizontal_previewer = function(prompt_bufnr, direction) + local previewer = action_state.get_current_picker(prompt_bufnr).previewer + local status = state.get_status(prompt_bufnr) + + -- Check if we actually have a previewer and a preview window + if type(previewer) ~= "table" or previewer.scroll_horizontal_fn == nil or status.preview_win == nil then + return + end + + local default_speed = vim.api.nvim_win_get_height(status.preview_win) / 2 + local speed = status.picker.layout_config.scroll_speed or default_speed + + previewer:scroll_horizontal_fn(math.floor(speed * direction)) +end + --- Scrolls the results up or down. --- Defaults to a half page scroll, but can be overridden using the `scroll_speed` --- option in `layout_config`. See |telescope.layout| for more details. @@ -261,6 +282,24 @@ action_set.scroll_results = function(prompt_bufnr, direction) action_set.shift_selection(prompt_bufnr, math.floor(speed) * direction) end +--- Scrolls the results to the left or right. +--- Defaults to a half page scroll, but can be overridden using the `scroll_speed` +--- option in `layout_config`. See |telescope.layout| for more details. +---@param prompt_bufnr number: The prompt bufnr +---@param direction number: The direction of the scrolling +-- Valid directions include: "1", "-1" +action_set.scroll_horizontal_results = function(prompt_bufnr, direction) + local status = state.get_status(prompt_bufnr) + local default_speed = vim.api.nvim_win_get_height(status.results_win) / 2 + local speed = status.picker.layout_config.scroll_speed or default_speed + + local input = direction > 0 and [[zl]] or [[zh]] + + vim.api.nvim_win_call(status.results_win, function() + vim.cmd([[normal! ]] .. math.floor(speed) .. input) + end) +end + -- ================================================== -- Transforms modules and sets the corect metatables. -- ================================================== diff --git a/lua/telescope/mappings.lua b/lua/telescope/mappings.lua index 6c218ee..45d9afa 100644 --- a/lua/telescope/mappings.lua +++ b/lua/telescope/mappings.lua @@ -148,9 +148,13 @@ mappings.default_mappings = config.values.default_mappings [""] = actions.preview_scrolling_up, [""] = actions.preview_scrolling_down, + [""] = actions.preview_scrolling_left, + [""] = actions.preview_scrolling_right, [""] = actions.results_scrolling_up, [""] = actions.results_scrolling_down, + [""] = actions.results_scrolling_left, + [""] = actions.results_scrolling_right, [""] = actions.toggle_selection + actions.move_selection_worse, [""] = actions.toggle_selection + actions.move_selection_better, diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua index cf25616..37cd994 100644 --- a/lua/telescope/previewers/buffer_previewer.lua +++ b/lua/telescope/previewers/buffer_previewer.lua @@ -189,6 +189,19 @@ local scroll_fn = function(self, direction) end) end +local scroll_horizontal_fn = function(self, direction) + if not self.state then + return + end + + local input = direction > 0 and [[zl]] or [[zh]] + local count = math.abs(direction) + + vim.api.nvim_win_call(self.state.winid, function() + vim.cmd([[normal! ]] .. count .. input) + end) +end + previewers.file_maker = function(filepath, bufnr, opts) opts = vim.F.if_nil(opts, {}) -- TODO(conni2461): here shouldn't be any hardcoded magic numbers ... @@ -462,6 +475,10 @@ previewers.new_buffer_previewer = function(opts) opts.scroll_fn = scroll_fn end + if not opts.scroll_horizontal_fn then + opts.scroll_horizontal_fn = scroll_horizontal_fn + end + return Previewer:new(opts) end diff --git a/lua/telescope/previewers/init.lua b/lua/telescope/previewers/init.lua index 4d19f75..1c99259 100644 --- a/lua/telescope/previewers/init.lua +++ b/lua/telescope/previewers/init.lua @@ -47,6 +47,7 @@ local previewers = {} --- - `:teardown()` --- - `:send_input(input)` --- - `:scroll_fn(direction)` +--- - `:scroll_horizontal_fn(direction)` --- --- `Previewer:new()` expects a table as input with following keys: --- - `setup` function(self): Will be called the first time preview will be @@ -64,6 +65,8 @@ local previewers = {} --- used to send input to the terminal --- application, like less. --- - `scroll_fn` function(self, direction): Used to make scrolling work. +--- - `scroll_horizontal_fn` function(self, direction): Used to make +--- horizontal scrolling work. previewers.Previewer = Previewer --- A shorthand for creating a new Previewer. diff --git a/lua/telescope/previewers/previewer.lua b/lua/telescope/previewers/previewer.lua index f986dac..b217a56 100644 --- a/lua/telescope/previewers/previewer.lua +++ b/lua/telescope/previewers/previewer.lua @@ -26,6 +26,7 @@ function Previewer:new(opts) _teardown_func = opts.teardown, _send_input = opts.send_input, _scroll_fn = opts.scroll_fn, + _scroll_horizontal_fn = opts.scroll_horizontal_fn, preview_fn = opts.preview_fn, _empty_bufnr = nil, }, Previewer) @@ -95,4 +96,12 @@ function Previewer:scroll_fn(direction) end end +function Previewer:scroll_horizontal_fn(direction) + if self._scroll_horizontal_fn then + self:_scroll_horizontal_fn(direction) + else + vim.api.nvim_err_writeln "scroll_horizontal_fn is not defined for this previewer" + end +end + return Previewer