You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I work between a very large monitor at work where I have 120+ lines of code and my laptop screen where sometimes I might only have 20-30 lines visible. I've noticed that scrolling up and down feels significantly different between the two situations, mainly because while the time to complete the scroll is the same, the number of lines it moves to do that is different.
It'd be nice to have the option of setting the scroll speed instead of time, as the number of lines needed to do a specific operation changes depending on the window size.
Additionally/alternatively, it'd be really nice to allow for setting a user defined function to determine how long a scrolling operation should take. I'd imagine neoscroll would pass the number of lines for the operation and the function would return the time (in milliseconds) that should be take for the operation.
The text was updated successfully, but these errors were encountered:
Not sure why it was taken down, but this is the reply from "Tonico" (username in the email notification):
I came up with the following function to compute the relative image runtime:
local function rel_time(n)
local win_height = vim.fn.winheight(0)
n = n or win_height
if n % 1 ~= 0 then
n = n * win_height
end
-- n is the numof lines we want to scroll
local lines_ratio = n / win_height
local threshold = 46 -- windows smaller thant this scroll faster
local win_ratio = win_height / threshold
local factor = win_ratio * lines_ratio
local log_factor = 1 / math.log(1 / factor + 1, 2)
local time = 300 * log_factor
print(time)
return time
end
The function takes as input the number (or fraction) of lines we want to scroll. It has hard coded in the number (46) of lines where the scrolling speed is "normal" and the "normal" scrolling time (300). It returns the normal scroll time scaled by a logarithmic factor that depends on the ratio between lines and win_height, and the ratio between win_height and normal height. Of course, this is very specific to my setup.
Examples:
n = 46 and win_height = 46 -> time = 300
n = 23 and win_height = 46 -> time = 189
n = 0.33 and win_height = 46 -> time = 149
n = 23 and win_height = 23 -> time = 189
n = 11 and win_height = 23 -> time = 126
n = 0.33 and win_height = 23 -> time = 106
The function is used in my config like this:
local neoscroll = require("neoscroll")
neoscroll.setup({
mappings = {}, -- no default mappings
})
local function map_key(lhs, rhs)
vim.keymap.set({ "x", "n" }, lhs, rhs)
end
map_key("<C-u>", function()
neoscroll.scroll(-vim.wo.scroll, true, rel_time(vim.wo.scroll))
end)
map_key("<C-d>", function()
neoscroll.scroll(vim.wo.scroll, true, rel_time(vim.wo.scroll))
end)
-- other mappings ...
map_key("zz", function()
neoscroll.zz(rel_time(0.33))
end)
@tonico if you'd like this to be taken down again, let me know. I haven't tried this to verify whether this works.
I work between a very large monitor at work where I have 120+ lines of code and my laptop screen where sometimes I might only have 20-30 lines visible. I've noticed that scrolling up and down feels significantly different between the two situations, mainly because while the time to complete the scroll is the same, the number of lines it moves to do that is different.
It'd be nice to have the option of setting the scroll speed instead of time, as the number of lines needed to do a specific operation changes depending on the window size.
Additionally/alternatively, it'd be really nice to allow for setting a user defined function to determine how long a scrolling operation should take. I'd imagine neoscroll would pass the number of lines for the operation and the function would return the time (in milliseconds) that should be take for the operation.
The text was updated successfully, but these errors were encountered: