diff --git a/src/dot_config/nvim/lua/scope.lua b/src/dot_config/nvim/lua/scope.lua index a00dd5e..fd8f803 100644 --- a/src/dot_config/nvim/lua/scope.lua +++ b/src/dot_config/nvim/lua/scope.lua @@ -1,4 +1,4 @@ --- telescope without telescope +-- telescope without telescope80 -- depends on: fzf, bat M = {} @@ -28,7 +28,7 @@ end ---@field mode ("window" | "float")? Sets the window used to show the scope. Defaults to "window". --- - "window": fills the entire window --- - "float": floating window ----@field float_opts vim.api.keyset.win_config? Options if mode is set to "float". +---@field float_opts vim.api.keyset.win_config? Options to pass to `nvim_open_win` if mode is set to "float". ---Generic brand fuzzy selector ---@param choice_gen string | function Lua function or shell command that generates choices to display in fzf. @@ -112,7 +112,7 @@ end --- - format_item (function item -> text) --- - kind (string|nil) ---@param on_choice fun(item: any|nil, idx: integer|nil) -local function picker(items, opts, on_choice) +local function select_new(items, opts, on_choice) vim.validate({ items = { items, 'table', false }, on_choice = { on_choice, 'function', false }, @@ -151,9 +151,65 @@ local function picker(items, opts, on_choice) ) end +--- Replacement for `vim.ui.input`. +---@param opts table? Additional options. See |input()| +--- - prompt (string|nil) +--- - default (string|nil) +---@param on_confirm function ((input|nil) -> ()) +local function input_new(opts, on_confirm) + vim.validate({ + opts = { opts, 'table', true }, + on_confirm = { on_confirm, 'function', false }, + }) + + opts = (opts and not vim.tbl_isempty(opts)) and opts or vim.empty_dict() + + opts.on_confirm = opts.on_confirm or function() end + + local buf = vim.api.nvim_create_buf(false, true) + vim.api.nvim_open_win(buf, true, + { + relative = "cursor", + width = 30, + height = 1, + col = 1, + row = 1, + border = "rounded", + title = opts.prompt, + }) + + if opts.default then + vim.api.nvim_buf_set_lines(buf, 0, 1, true, { opts.default }) + end + + vim.wo.number = false + vim.wo.relativenumber = false + vim.cmd [[startinsert!]] + + local map_opts = { noremap = true, buffer = buf } + + local function close_win() + vim.api.nvim_win_close(0, false) + vim.cmd.stopinsert() + end + + vim.keymap.set({ "i", "n" }, "", + function() + on_confirm(table.concat(vim.api.nvim_buf_get_lines(buf, 0, -1, true), "\n")) + close_win() + end, + map_opts + ) + vim.keymap.set({ "i" }, "", function () + on_confirm(nil) + close_win() + end, map_opts) +end + ---Sets up `vim.ui` hooks to use scope. function M.setup() - vim.ui.select = picker + vim.ui.select = select_new + vim.ui.input = input_new end --------------------------------