From af3cfec88749bf5bce97d061aec7b117940e2f9a Mon Sep 17 00:00:00 2001 From: CPea Date: Sun, 5 Apr 2026 05:01:03 +0700 Subject: [PATCH] feat: display icon as extmark --- lua/input/config.lua | 9 --------- lua/input/init.lua | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lua/input/config.lua b/lua/input/config.lua index 39512e3..398d553 100644 --- a/lua/input/config.lua +++ b/lua/input/config.lua @@ -21,7 +21,6 @@ local defaults = { list = true, listchars = "precedes:…,extends:…", sidescrolloff = 0, - statuscolumn = [[%!v:lua.require("input.config").statuscolumn()]], }, buf_options = { swapfile = false, @@ -58,14 +57,6 @@ function config.extend(opts) options = vim.tbl_deep_extend("force", options, opts) end -function config.statuscolumn() - if vim.fn.hlexists "InputIcon" == 0 then - vim.api.nvim_set_hl(0, "InputIcon", { fg = "#56b6c2" }) - end - - return (" %%#InputIcon#%s "):format(options.icon) -end - setmetatable(config, { __index = function(_, k) return options[k] diff --git a/lua/input/init.lua b/lua/input/init.lua index 4a56737..220afc3 100644 --- a/lua/input/init.lua +++ b/lua/input/init.lua @@ -49,7 +49,10 @@ local function input(opts, on_confirm) confirm(nil) end - vim.fn.prompt_setprompt(bufnr, "") + local prompt_icon = (" %s "):format(config.icon) + local icon_end_col = #prompt_icon + + vim.fn.prompt_setprompt(bufnr, prompt_icon) vim.fn.prompt_setcallback(bufnr, confirm) vim.fn.prompt_setinterrupt(bufnr, cancel) @@ -57,7 +60,14 @@ local function input(opts, on_confirm) vim.api.nvim_put({ default }, "", true, false) vim.cmd.startinsert() end) - vim.api.nvim_win_set_cursor(winid, { 1, #default }) + vim.api.nvim_win_set_cursor(winid, { 1, #default + icon_end_col }) + + local ns = vim.api.nvim_create_namespace "input" + + vim.api.nvim_buf_set_extmark(bufnr, ns, 0, 1, { + hl_group = "InputIcon", + end_col = icon_end_col - 1, + }) vim.keymap.set("n", "", cancel, { buffer = bufnr }) vim.keymap.set("n", "q", cancel, { buffer = bufnr }) @@ -76,11 +86,29 @@ local function input(opts, on_confirm) once = true, callback = cancel, }) + + vim.api.nvim_create_autocmd("CursorMoved", { + group = augroup, + desc = "Constrain prompt cursor position", + buffer = bufnr, + nested = true, + callback = function() + local row, col = unpack(vim.api.nvim_win_get_cursor(winid)) + + if col < icon_end_col then + vim.api.nvim_win_set_cursor(winid, { row, icon_end_col }) + end + end, + }) end function M.setup(opts) local config = require "input.config" + if vim.fn.hlexists "InputIcon" == 0 then + vim.api.nvim_set_hl(0, "InputIcon", { link = "Keyword" }) + end + config.extend(opts) vim.ui.input = input