jujutsu file annotations for neovim (like blame)
4

Configure Feed

Select the types of activity you want to include in your feed.

fix scrollbind... again

Signed-off-by: Ron Shavit <me@ronshavit.com>

Ron Shavit (May 26, 2026, 11:55 PM +0300) b4f1560b cea5a566

+37 -12
+37 -12
lua/jjannotate.lua
··· 4 4 ---@class jjannotate.Config.Mappings 5 5 ---@field close string | nil 6 6 7 + ---@type jjannotate.Config 7 8 vim.g.jjannotate_opts = { 8 9 mappings = { 9 10 close = "q", ··· 23 24 ---@field win integer 24 25 ---@field buf integer 25 26 26 - ---@type jjannotate.BufWin | nil 27 - local curr = nil 27 + local curr = nil ---@type jjannotate.BufWin | nil 28 + local original_opts = {} --- @type table<string, any> 29 + 30 + local enabled_opts = { 31 + scrollbind = true, 32 + cursorbind = true, 33 + cursorline = true, 34 + wrap = false, 35 + } 28 36 29 37 local color = require("color") 30 38 local ns = vim.api.nvim_create_namespace("jjannotate") ··· 152 160 end 153 161 154 162 ---@param buf integer 155 - ---@param attached jjannotate.BufWin? 163 + ---@param original jjannotate.BufWin? 156 164 ---@param longest_line integer 157 165 ---@return integer 158 - local function open_win(buf, attached, longest_line) 166 + local function open_win(buf, original, longest_line) 159 167 local win = vim.api.nvim_open_win(buf, true, { split = "left" }) 160 168 local textoff = vim.fn.getwininfo(win)[1].textoff 161 169 vim.api.nvim_win_set_width(win, longest_line + textoff + 3) 162 170 vim.wo[win].winfixwidth = true 163 171 164 - if attached then 165 - vim.wo[attached.win].scrollbind = true 166 - vim.wo[attached.win].cursorbind = true 167 - vim.wo[win].scrollbind = true 168 - vim.wo[win].cursorbind = true 172 + if original then 173 + for opt, value in pairs(enabled_opts) do 174 + original_opts[opt] = vim.api.nvim_get_option_value(opt, { win = original.win }) 175 + vim.api.nvim_set_option_value(opt, value, { win = original.win }) 176 + vim.api.nvim_set_option_value(opt, value, { win = win }) 177 + end 169 178 end 170 179 171 180 -- mappings ··· 178 187 ) 179 188 end 180 189 190 + -- autocmds 191 + vim.api.nvim_create_autocmd({ "BufHidden", "BufUnload" }, { 192 + once = true, 193 + buffer = buf, 194 + callback = vim.schedule_wrap(function() 195 + if original and vim.api.nvim_win_is_valid(original.win) then 196 + for opt, value in pairs(original_opts) do 197 + vim.api.nvim_set_option_value(opt, value, { win = original.win }) 198 + end 199 + end 200 + 201 + curr = nil 202 + original_opts = {} 203 + end), 204 + }) 205 + 181 206 return win 182 207 end 183 208 ··· 190 215 vim.bo[buf].modifiable = true 191 216 192 217 local longest_line = render_lines_to_buf(buf, parsed) 193 - local attached = find_visible_path(path) 218 + local original = find_visible_path(path) 194 219 apply_highlights(buf, parsed) 195 220 196 221 vim.bo[buf].bufhidden = "wipe" ··· 200 225 vim.bo[buf].modifiable = false 201 226 vim.bo[buf].readonly = true 202 227 203 - local win = curr and curr.win or open_win(buf, attached, longest_line) 204 - if attached then vim.api.nvim_win_set_cursor(win, { vim.api.nvim_win_get_cursor(attached.win)[1], 0 }) end 228 + local win = curr and curr.win or open_win(buf, original, longest_line) 229 + if original then vim.api.nvim_win_set_cursor(win, { vim.api.nvim_win_get_cursor(original.win)[1], 0 }) end 205 230 vim.api.nvim_set_current_win(win) 206 231 vim.cmd.syncbind() 207 232