-- Implementation of middle mark. This mark is always in the middle of the -- viewport. local api = vim.api -- Compatibility check. if not api.nvim_call_function('has', {'usermarks'}) then return nil end local usermark = require("vim.usermark") -- The middle mark is on the middle of the screen. local middle_mark = {} function middle_mark.get(self) local topline = vim.api.nvim_call_function('line', {'w0'}) local bottomline = vim.api.nvim_call_function('line', {'w$'}) return math.floor((topline + bottomline) / 2) end -- Setting the middle mark sets the current cusor line to the middle of the -- window. Principally this is the same as z. function middle_mark.set(self) api.nvim_command('norm z.') end -- The top mark is the first line on the window. Right now scrolloff is ignored, -- but maybe it shouldn't be. local top_mark = {} function top_mark.get(self) return vim.api.nvim_call_function('line', {'w0'}) end -- Setting the top mark move the current line to the top. Principally this is -- the same mas z function top_mark.set(self) api.nvim_command('norm z') end -- Setting the bottom mark moves the current line to the bottom. Principally -- this is the same as z- local bottom_mark = {} function bottom_mark.get(self) return vim.api.nvim_call_function('line', {'w$'}) end -- Setting the bottom mark doesn't do anything. function bottom_mark.set(self) api.nvim_command('norm z-') end -- Register all the marks with their respective characters. usermark.register_handler('-', middle_mark) usermark.register_handler('+', top_mark) usermark.register_handler('_', bottom_mark)