Skip to content

Commit 1cdc1bf

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

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

lua/mini/misc.lua

Lines changed: 51 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,55 @@ 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+
117+
local function save_win_state(winnr)
118+
win_states[winnr] = {
119+
foldenable = vim.api.nvim_get_option_value('foldenable', { win = winnr }),
120+
cursorline = vim.api.nvim_get_option_value('cursorline', { win = winnr }),
121+
cursor = vim.api.nvim_win_get_cursor(winnr),
122+
}
123+
end
124+
125+
local function restore_win_state(winnr)
126+
if not win_states[winnr] then return end
127+
128+
vim.api.nvim_set_option_value('foldenable', win_states[winnr].foldenable, { win = winnr })
129+
vim.api.nvim_set_option_value('cursorline', win_states[winnr].cursorline, { win = winnr })
130+
vim.api.nvim_win_set_cursor(winnr, win_states[winnr].cursor)
131+
132+
win_states[winnr] = nil
133+
end
134+
135+
local goto_linenr = function(winnr, linenr)
136+
linenr = math.max(math.min(linenr, vim.api.nvim_buf_line_count(vim.api.nvim_win_get_buf(winnr))), 1)
137+
138+
if not win_states[winnr] then save_win_state(winnr) end
139+
140+
vim.api.nvim_set_option_value('foldenable', false, { win = winnr })
141+
vim.api.nvim_set_option_value('cursorline', true, { win = winnr })
142+
143+
vim.api.nvim_win_set_cursor(winnr, { linenr, 1 })
144+
145+
vim.cmd('redraw')
146+
end
147+
148+
vim.api.nvim_create_autocmd('CmdlineChanged', {
149+
pattern = '*',
150+
callback = function()
151+
local cmdline_str = vim.api.nvim_call_function('getcmdline', {})
152+
if tonumber(cmdline_str) then goto_linenr(vim.api.nvim_get_current_win(), tonumber(cmdline_str)) end
153+
end,
154+
})
155+
156+
vim.api.nvim_create_autocmd('CmdlineLeave', {
157+
pattern = '*',
158+
callback = function() restore_win_state(vim.api.nvim_get_current_win()) end,
159+
})
160+
end
161+
111162
--- Print Lua objects in command line
112163
---
113164
---@param ... any Any number of objects to be printed each on separate line.

0 commit comments

Comments
 (0)