daviewales
### ๐ค Which branch are you using? - [ ] dev - [x] main ### ๐ Issue description: I've configured Markview so that concealed and unconcealed text has the same physical position, with the intention that it won't shift when unconcealing it. (See config in next section.) However, as you can see in the screen recording, when I move my cursor from line to line, the text temporarily jumps right when unconcealing. https://github.com/user-attachments/assets/abc7fd0d-18eb-4646-bd95-246a7d136dfa ### ๐ Reproduction steps: Add the following text to `test.md` and view in Neovim with included config: ``` md # This is an h1 header ## This is an h2 header ### This is an h3 header #### This is an h4 header ##### This is an h5 header ###### This is an h6 header This is some `inline code`. - This - is - a - list ``` ### ๐ป Minimal init: ```lua vim.env.LAZY_STDPATH = ".repro" load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() require("lazy.minit").repro({ spec = { { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate", ensure_installed = { "html", "latex", "markdown", "markdown_inline", "typst", "yaml" } }, { "OXY2DEV/markview.nvim", -- branch = "dev", lazy = false } }, }); require 'markview'.setup { preview = { modes = { "n", "no", "c", "i" }, hybrid_modes = { "i", "n" }, linewise_hybrid_mode = true }, code_blocks = { pad_amount = 0 }, markdown = { headings = { heading_1 = { icon = "๓ฐผ " }, heading_2 = { icon = "๓ฐจ " }, heading_3 = { icon = "๓ฐผ " }, heading_4 = { icon = "๓ฐฒ " }, heading_5 = { icon = "๓ฐผ " }, heading_6 = { icon = "๓ฐด " } }, list_items = { marker_minus = { add_padding = false }, marker_plus = { add_padding = false }, marker_star = { add_padding = false }, marker_dot = { add_padding = false }, marker_parenthesis = { add_padding = false } } } } ``` ### ๐ Logs: <details> ``` LOG | markview/autocmds.lua => bufHandle() -> /home/dwales/test.md | Buffer state changed. LOG | markview/actions.lua => attach() | Attached to 1. LOG | markview/actions.lua => autocmd() -> on_attach | Fired on_attach & MarkviewAttach. LOG | markview/actions.lua => set_query() | Set tree-sitter queries for 1. LOG | markview/actions.lua => autocmd() -> on_enable | Fired on_enable & MarkviewEnable. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 5ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 1ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 1ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => autocmd() -> on_hybrid_enable | Fired on_hybrid_enable & MarkviewHybridEnable. LOG | markview/actions.lua => set_query() | Set tree-sitter queries for 1. LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 1ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 1ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 1ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 1ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 1ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 1ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 1ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 2ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 1ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/autocmds.lua => cursor() -> action() | Cursor movement process. LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms LOG | markview/actions.lua => render() | Rendering preview. LOG | parsers.lua => init() | Parsing(start): 1 LOG | fn() | Parsing total(1): 0ms LOG | renderer.lua => render() | Rendering: 1 LOG | renderer.lua => render() | Render(main): 0ms LOG | renderer.lua => render() | Render(post): 0ms LOG | renderer.lua => render() | Rendering total(1): 0ms LOG | renderer.lua => clear() | Clearing: 1 LOG | renderer.lua => clear() | Clearing total(1): 0ms ``` </details> ### Neovim version: NVIM v0.12.2 Build type: Release LuaJIT 2.1.1774638290 Run "nvim -V1 -v" for more info ### โ Expected behavior: The text should unconceal without jumping to the right.