Skip to content

Commit 99fdee2

Browse files
committed
feat(misc): add peek functionality
1 parent 7bbafa4 commit 99fdee2

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

lua/mini/misc.lua

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
--- - |MiniMisc.bench_time()| to benchmark function execution time.
1010
--- Useful in combination with `stat_summary()`.
1111
---
12+
--- - |MiniMisc.peek()| to peek a line by entering the linenr in cmdline.
13+
---
1214
--- - |MiniMisc.put()| and |MiniMisc.put_text()| to pretty print its arguments
1315
--- into command line and current buffer respectively.
1416
---
@@ -108,6 +110,57 @@ MiniMisc.get_gutter_width = function(win_id)
108110
return vim.fn.getwininfo(win_id)[1].textoff
109111
end
110112

113+
--- Peek a line by entering the linenr in cmdline.
114+
MiniMisc.peek = function()
115+
local win_states = {}
116+
local options = { foldenable = false, cursorline = true, number = true, relativenumber = false }
117+
118+
local function save_win_state(winnr)
119+
win_states[winnr] = {}
120+
for option, _ in pairs(options) do
121+
win_states[winnr][option] = vim.api.nvim_get_option_value(option, { win = winnr })
122+
end
123+
win_states[winnr].cursor = vim.api.nvim_win_get_cursor(winnr)
124+
end
125+
126+
local function restore_win_state(winnr)
127+
if not win_states[winnr] then return end
128+
129+
for option, _ in pairs(options) do
130+
vim.api.nvim_set_option_value(option, win_states[winnr][option], { win = winnr })
131+
end
132+
vim.api.nvim_win_set_cursor(winnr, win_states[winnr].cursor)
133+
134+
win_states[winnr] = nil
135+
end
136+
137+
local goto_linenr = function(winnr, linenr)
138+
linenr = math.max(math.min(linenr, vim.api.nvim_buf_line_count(vim.api.nvim_win_get_buf(winnr))), 1)
139+
140+
if not win_states[winnr] then save_win_state(winnr) end
141+
142+
for option, value in pairs(options) do
143+
vim.api.nvim_set_option_value(option, value, { win = winnr })
144+
end
145+
vim.api.nvim_win_set_cursor(winnr, { linenr, 1 })
146+
147+
vim.cmd('redraw')
148+
end
149+
150+
vim.api.nvim_create_autocmd('CmdlineChanged', {
151+
pattern = '*',
152+
callback = function()
153+
local cmdline_str = vim.api.nvim_call_function('getcmdline', {})
154+
if tonumber(cmdline_str) then goto_linenr(vim.api.nvim_get_current_win(), tonumber(cmdline_str)) end
155+
end,
156+
})
157+
158+
vim.api.nvim_create_autocmd('CmdlineLeave', {
159+
pattern = '*',
160+
callback = function() restore_win_state(vim.api.nvim_get_current_win()) end,
161+
})
162+
end
163+
111164
--- Print Lua objects in command line
112165
---
113166
---@param ... any Any number of objects to be printed each on separate line.

0 commit comments

Comments
 (0)