Neovim sign gutter, designed to be mostly VCS agnostic
at experimental_diffthis 53 lines 1.3 kB view raw
1local M = {} 2 3local intervals = require "vclib.intervals" 4 5---@param hunk Hunk 6---@return integer The visual size of the hunk in lines. 7function M.hunk_visual_start(hunk) 8 return math.max(1, hunk.plus_start) 9end 10 11---@param hunk Hunk 12---@return integer The visual size of the hunk in lines. 13function M.hunk_visual_size(hunk) 14 return math.max(1, hunk.plus_count) 15end 16 17---@param hunk Hunk 18---@return Interval 19function M.to_interval(hunk) 20 return { 21 l = M.hunk_visual_start(hunk), 22 r = M.hunk_visual_start(hunk) + M.hunk_visual_size(hunk), 23 data = hunk, 24 } 25end 26 27--- Get the `count`th previous hunk. 28---@param lnum integer 29---@param hunks Hunk[] 30---@param count integer 31---@return Hunk? 32function M.prev_hunk(lnum, hunks, count) 33 return intervals.from_list(hunks, M.to_interval):find(lnum, -count) 34end 35 36--- Get the `count`th next hunk. 37---@param lnum integer 38---@param hunks Hunk[] 39---@param count integer 40---@return Hunk? 41function M.next_hunk(lnum, hunks, count) 42 return intervals.from_list(hunks, M.to_interval):find(lnum, count) 43end 44 45--- Get the current hunk for a given line number, if any. 46---@param lnum integer 47---@param hunks Hunk[] 48---@return Hunk? 49function M.cur_hunk(lnum, hunks) 50 return intervals.from_list(hunks, M.to_interval):find(lnum, 0) 51end 52 53return M