Skip to content

Tags: folke/snacks.nvim

Tags

v2.31.0

Toggle v2.31.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.31.0 (#2466)

🤖 I have created a release *beep* *boop*
---


##
[2.31.0](v2.30.0...v2.31.0)
(2026-03-20)


### Features

* **gh:** added `Start Review`. Closes
[#2463](#2463)
([ac5f497](ac5f497))
* **gh:** added cycle win and scrolling to scratch buffers when opened
in a picker. Closes
[#2480](#2480)
([021855c](021855c))
* **gh:** make copilot authors as bots
([c6ab189](c6ab189))
* **gh:** make markview.nvim play nicely with snacks. See
[#2467](#2467)
([deeb1e0](deeb1e0))
* **gh:** open scratch buffers at the bottom of the window. Closes
[#2476](#2476)
([a6a9678](a6a9678))
* **gh:** special formatting for code suggestions in review comments.
See [#2463](#2463)
([f1c7f62](f1c7f62))
* **gh:** when selecting lines in a diff to add a review comment, you
can now suggest code changes. See
[#2463](#2463)
([e896fb9](e896fb9))
* **lua:** add any treesitter injection to a string with a comment like
-- inject:graphql
([1d5b12d](1d5b12d))
* **picker.actions:** allow specifying an additional window for
`cycle_win`
([197f393](197f393))
* **picker.lspconfig:** show available dynamic registered code actions
([521ef46](521ef46))
* **picker.lspconfig:** show available server commands and code actions
([7a90a08](7a90a08))
* **win:** `opts.footer_keys` can now be an array of lhs to show instead
of all. See [#2469](#2469)
([6d72138](6d72138))
* **win:** better zindex calculation
([08c0951](08c0951))
* **win:** new border `top_bottom`
([6134c98](6134c98))


### Bug Fixes

* **gh.item:** timestamps should be in UTC, not local time
([1ba0bf8](1ba0bf8))
* **gh.scratch:** if scratch would hide the cursor, then scroll preview
up taking scrolloff into account. See
[#2480](#2480)
([a271610](a271610))
* **gh:** better integration with render-markdown. Closes
[#2467](#2467)
([717073d](717073d))
* **gh:** diff comment action should only show when available
([fe20e95](fe20e95))
* **gh:** render gh comments as markdown when displaying in a
non-markdown buffer. Closes
[#2481](#2481)
([06e9ca9](06e9ca9))
* **gh:** rendering of markdown comments. Closes
[#2488](#2488)
([dec29f5](dec29f5))
* **gh:** set default scratch `height=15` and fix bottom offset for
custom height
([6900f3f](6900f3f))
* **grep:** remove `MATCH_SEP` before sending to notify
([#2744](#2744))
([9912042](9912042))
* **grep:** remove nul bytes from warning messages in grep output. Fixes
[#2744](#2744), Closes
[#2768](#2768)
([b2cb00e](b2cb00e))
* **grep:** use %z to replace nul bytes
([a049339](a049339))
* **input:** fixed completion. Closes
[#2472](#2472)
([3024376](3024376))
* **lspconfig:** handle complex values in lsp config preview. Closes
[#2711](#2711)
([25f53f7](25f53f7))
* **markdown:** use new markview API
([9b86d57](9b86d57))
* **picker.actions:** `vim.v.count1` should be `1` in insert mode.
Closes [#2492](#2492)
([d902c0a](d902c0a))
* **picker.confirm:** better layout for confirm
([7f62aa6](7f62aa6))
* **picker.diff:** make diff filename extmarks play nicely with markview
/ markdown-renderer
([4f749ab](4f749ab))
* **picker.git:** fix cwd for git diff. Closes
[#2483](#2483)
([9076793](9076793))
* **picker.lsp:** wait for pending requests. See
[#2527](#2527)
([fe7cfe9](fe7cfe9))
* **picker.preview:** remove `--no-ext-diff` option for git diff preview
([836e073](836e073))
* **picker.spinner:** when parent win is not float win
([#2487](#2487))
([8ca098c](8ca098c))
* **picker:** fix nowait for `<c-r>`
([685c433](685c433))
* **scratch:** set filetype correctly. Closes
[#2510](#2510)
([3c5c23b](3c5c23b))
* **util.diff:** proper linebreak repeat for annotation boxes
([64179b9](64179b9))
* **win:** allow scrolling beyond eob
([8b5f762](8b5f762))
* **win:** use normkey instead of keytrans for footer keys
([9bd41bb](9bd41bb))
* **win:** when a floating win becomes non-floating, remove its backdrop
([c1e1500](c1e1500))


### Performance Improvements

* **bigfile:** disable completion to avoid lag when entering insert mode
([#2475](#2475))
([c49c3f3](c49c3f3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

stable

Toggle stable's commit message
Last Stable Release

v2.30.0

Toggle v2.30.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.30.0

🤖 I have created a release *beep* *boop*
---


## [2.30.0](v2.29.0...v2.30.0) (2025-11-06)


### Features

* **diff:** prettier commit rendering (git show, diff with header) ([dc2186e](dc2186e))
* **gh:** add inline review comment annotations to diff viewer ([c83ff8d](c83ff8d))
* **gh:** create review comments in GitHub PR diff, on diff lines. Closes [#2446](#2446) ([85bf3f0](85bf3f0))
* **layout:** allow resizing split layouts. See [#2390](#2390) ([913379c](913379c))
* **picker.gh_diff:** you can now reply to review comments in diffs with `a`. See [#2446](#2446) ([c3bda87](c3bda87))
* **picker.icons:** make it easier to add custom icon sources ([82e6966](82e6966))
* **picker.marks:** added `<c-x>` to delete a mark from the list. See [#2390](#2390) ([9a04605](9a04605))
* **picker:** when picker was started from insert mode, return to insert after paste ([a417630](a417630))
* **util.async:** add proper backtrace to unhandled async errors ([01f6cac](01f6cac))


### Bug Fixes

* **gh:** force `fancy` diff style for gh pr diff, since that's needed to render/interact with review comments ([bd71cd4](bd71cd4))
* **gh:** only skip empty comment reviews. Closes [#2445](#2445) ([1848d74](1848d74))
* **gh:** pass correct context in gh_perform_action. Closes [#2442](#2442). Closes [#2443](#2443) ([13edbc6](13edbc6))
* **gh:** properly handly pending requests ([7a15e16](7a15e16))
* **gh:** use lua to parse dates so we can do this in a fast context ([cd0d6fe](cd0d6fe))
* **image:** run terminal capability detection synchronous when needed. Closes [#2439](#2439) ([58f1152](58f1152))
* **layout:** ignore very zindex windows for calulating layout zindex, so that it stays below things like notifications ([47340e6](47340e6))
* **lsp:** properly detach buffers on LspDetach. Closes [#2457](#2457) ([beb995e](beb995e))
* **picker.actions:** don't open a new tab if the current tab is empty. Closes [#2461](#2461) ([4e2424e](4e2424e))
* **picker.diff:** added `showbreak=""` for fancy diff. Closes [#2441](#2441) ([fb55f7b](fb55f7b))
* **picker.format:** use file for icon. fallback to ft when buffer is not a file. See [#2390](#2390) ([20ac8bf](20ac8bf))
* **picker.grep_word:** pass `--word-regexp` to `ripgrep` ([6aad368](6aad368))
* **picker.highlight:** resolve ([4438ee4](4438ee4))
* **picker.input:** startinsert when starting the picker from terminal mode. See [#2390](#2390) ([b2054a3](b2054a3))
* **picker.lsp_config:** nil on lsp info ([#2459](#2459)) ([c5257fa](c5257fa))
* **scope:** textobjects should use synchronous treesitter parsing. Closes [#2448](#2448) ([9737c25](9737c25))
* **toggle:** set/get raw values for option toggles. See [#2390](#2390) ([41da728](41da728))
* **win:** set `foldcolumn='0'` for minimal style. See [#2390](#2390) ([195faa0](195faa0))

---
This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).

v2.29.0

Toggle v2.29.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.29.0 (#2408)

🤖 I have created a release *beep* *boop*
---


##
[2.29.0](v2.28.0...v2.29.0)
(2025-11-04)


### Features

* **gh.diff:** show git status in PR diff
([c671d06](c671d06))
* **gh:** added reviews and nice diffs to gh buffer views. See
[#2411](#2411)
([1335ca1](1335ca1))
* **gh:** allow to update pr branch
([#2419](#2419))
([f75f307](f75f307))
* **gh:** use new diff renderer for gh pr reviews
([714edec](714edec))
* **gh:** when on a review comment, the `gh_comment` action will now do
a reply instead of a top-level comment. Fixes
[#2410](#2410)
([a4f2b9d](a4f2b9d))
* **gh:** you can now use `Snacks.picker.gh_actions()` directly to see
actions for the checked out PR
([d0d10f6](d0d10f6))
* **picker.diff:** new fancy diff renderer
([22eea90](22eea90))
* **picker.git_diff:** show proper git status for git diff files
([ab48eeb](ab48eeb))
* **picker.git_diff:** show renames
([77609a0](77609a0))
* **picker.lsp_config:** added server/dynamic capabilities to preview
([da14fac](da14fac))
* **picker:** consolidate all diff options under `opts.previewers.diff`.
Default style is `fancy`
([b65b06c](b65b06c))
* **zen:** added `center` option that defaults to `true` for zen mode
and `false` for zoom mode. Closes
[#2422](#2422)
([3c2d791](3c2d791))


### Bug Fixes

* **dashboard:** start job after the terminal window is shown to make
sure it has the correct size. Closes
[#2421](#2421)
([e440df3](e440df3))
* **diff:** fallback if `Normal` has no fg color. Closes
[#2436](#2436)
([7f453c4](7f453c4))
* **diff:** improved diff parsing. Closes
[#2424](#2424). Closes
[#2420](#2420)
([b6e4eb7](b6e4eb7))
* **diff:** remove diff injections. Closes
[#2406](#2406)
([ecc21bb](ecc21bb))
* **gh.api:** get repo from upstream remote if availble. fallback to
origin
([5043637](5043637))
* **gh.api:** pass repo to cmd. Closes
[#2415](#2415)
([78046eb](78046eb))
* **gh.diff:** fixed rendering of diff header when wrap=true
([07c569d](07c569d))
* **gh.item:** better method to extract repo from gh url. Closes
[#2418](#2418)
([52d544c](52d544c))
* **gh.render:** added support for older `StatusContext` checks. Closes
[#2407](#2407)
([74864a7](74864a7))
* **gh.render:** use check name. See
[#2407](#2407)
([6f60105](6f60105))
* **gh:** better way of determining current PR
([bd3c1a0](bd3c1a0))
* **gh:** input for api should be a table, not a string. Closes
[#2427](#2427)
([1b3e409](1b3e409))
* **image:** allow to fully disable all image rendering with
`opts.image.enabled = false`. Closes
[#2404](#2404)
([34a6591](34a6591))
* **image:** disable image conversion error notifications by default
([cfcf525](cfcf525))
* **lsp:** check lsp handlers after LspAttach, since attached_buffers
won't have been set
([1861b0a](1861b0a))
* **picker.actions:** only allow stage/unstage/restore for some diffs
([9cde35b](9cde35b))
* **picker.diff:** move git status calc based on diff to format
([b553c18](b553c18))
* **picker.diff:** parse full diff including diff and hunk headers.
Closes [#2429](#2429)
([53d8012](53d8012))
* **picker.git_diff:** don't show git status, disable
stage/unstage/restore when merge-base is set. Closes
[#2397](#2397)
([6ff82ca](6ff82ca))
* **picker.highlight:** resolve all text chunks when needed. Not just
the first.
([962aadd](962aadd))
* **picker.undo:** cleanup tmp files in `async:on("done")`. Closes
[#2434](#2434)
([3038dac](3038dac))
* **picker.undo:** set initial target to the current undo entry. See
[#2434](#2434)
([dc245ef](dc245ef))
* **picker:** don't focus a picker window when toggling a window and
picker wasn't current. closes
[#2417](#2417)
([b80b330](b80b330))
* revert rename of actions.lua to tomdar87@outlook.com
([#2423](#2423))
([8bb3ad6](8bb3ad6))
* **win:** fixed fixbuf. Closes
[#2409](#2409)
([2099572](2099572))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v2.28.0

Toggle v2.28.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.28.0

🤖 I have created a release *beep* *boop*
---


## [2.28.0](v2.27.0...v2.28.0) (2025-11-01)


### Features

* **gh:** new `gh` (GitHub cli) integration ([85b8ec2](85b8ec2))
* **image:** when opts.conceal, conceal remainig lines that are not covered by the image. See [#2391](#2391) ([404027c](404027c))
* **picker.buffers:** add filetype/buftype to search text ([a249c86](a249c86))
* **picker.buffers:** added buftype and filetype for scratch buffers ([6a13271](6a13271))
* **picker.diff:** moved git_diff finder to separate file so it can be re-used + made it more robust. Closes [#2366](#2366) ([3049ad8](3049ad8))
* **picker.diff:** native diff now also highlights the language of the diffed code in the diff ([7260957](7260957))
* **picker.git_diff:** `git_diff` now also shows staged hunks and added stage/unstage/restore actions for hunks. Closes [#2382](#2382) ([1fb3f4d](1fb3f4d))
* **picker.git_diff:** added `staged` flag ([118648c](118648c))
* **picker.highlights:** badges ([202e595](202e595))
* **picker.preview:** allow items to define a title used in the preview window ([4b572f4](4b572f4))
* **picker.preview:** support for images and render markdown ([9585da6](9585da6))
* **picker.util:** cmdline parser used to properly parse diff args ([5025989](5025989))
* **picker:** better integration with markview and render-markdown when previewing ([4708e9a](4708e9a))
* **scratch:** store scratch info in meta files, instead of the filename + custom filekeys ([85f8e22](85f8e22))
* **util.spawn:** `Proc:json()` ([5589c9d](5589c9d))
* **util:** `Snacks.util.stop()` to safely stop/close a luv handle ([ce9e299](ce9e299))


### Bug Fixes

* **explorer.tree:** only strip trasiling forward slashes if not at root. Closes [#2375](#2375) ([72dc621](72dc621))
* **explorer:** differentiate if file or folder when deleting on Windows ([#2373](#2373)) ([59c5545](59c5545))
* **explorer:** do reveal in on_show if explorer is not open yet. Closes [#2388](#2388) ([ba529d4](ba529d4))
* **explorer:** schedule `on_find` (typically reveal), for both files finder and when git status updates the finder. Closes [#2388](#2388) ([a9b57b2](a9b57b2))
* **gh:** add action idx to `gh_actions` text ([d94184d](d94184d))
* **image.inline:** off-by-one for finding visible images at the last line of the buffer ([04b3a54](04b3a54))
* **image:** avoid nested math environments ([#2345](#2345)) ([66e3dc4](66e3dc4))
* **image:** check for invalid buffer ([9ad4178](9ad4178))
* **image:** check to update on BufWinEnter and attach to buffer changes ([e18e4f6](e18e4f6))
* **image:** don't add placements to concealed lines. Closes [#2391](#2391) ([13963b1](13963b1))
* **image:** guard against invalid buffers. Closes [#2383](#2383) ([4bb1ce1](4bb1ce1))
* keymap docs ([583a0c1](583a0c1))
* **keymap:** make sure opts are a table. Closes [#2392](#2392) ([367d1bd](367d1bd))
* **layout:** only max zindex for snacks windows/layouts ([8eddc0b](8eddc0b))
* **picker.actions:** `drop` and `tabdrop` should never reload existing buffers ([#2368](#2368)) ([6cf2fee](6cf2fee))
* **picker.actions:** use `buffer!` instead of `buffer` for edit. Closes [#2378](#2378) ([2a1a001](2a1a001))
* **picker.diff:** better filename parsing. See [#2366](#2366) ([377f3bf](377f3bf))
* **picker.diff:** first line of header ([fb011c2](fb011c2))
* **picker.diff:** only process `---` diffs directly if it doesn't start with a diff header ([0a33aec](0a33aec))
* **picker.filter:** get cwd from active tabpage if available ([c1b517f](c1b517f))
* **picker.finder:** mutate existing opts ([c91e230](c91e230))
* **picker.finder:** tmp fix for [#2386](#2386) ([5eea5f9](5eea5f9))
* **picker.git_branches:** git log preview. Closes [#2360](#2360) ([597ebd4](597ebd4))
* **picker.git_diff:** remove `--default-prefix`, since that's no longer needed. See [#2382](#2382) ([40774ae](40774ae))
* **picker.git_diff:** set `group=false` by default, since we also have `git_status` ([530e591](530e591))
* **picker.highlights:** modifiable for set_lines ([98345fb](98345fb))
* **picker.keymaps:** try to locate neovim compiled lua source files for keymaps ([76160be](76160be))
* **picker.lsp:** fixed `vim.str_byteindex` capability check. Closes [#2389](#2389) ([46917d0](46917d0))
* **picker.lsp:** some LSP servers notify completion before sending the actual result. See [#2372](#2372) ([aa8a318](aa8a318))
* **picker.lsp:** use `LspRequest` to track completed and cancelled requests. Fixes [#2364](#2364) ([8afb609](8afb609))
* **picker.preview:** again. docgen seems broken ([758bbfa](758bbfa))
* **picker.preview:** don't show locations for diff preview ([b064488](b064488))
* **picker.preview:** fckup ([fd7795e](fd7795e))
* **picker.preview:** fix ([e2c1c52](e2c1c52))
* **picker.preview:** show proper preview message for deleted scratch buffers ([4ad8a41](4ad8a41))
* **picker.util:** better relative time format ([3e30fb6](3e30fb6))
* **picker.util:** ignore errors from corrupted kv stores. Closes [#2394](#2394) ([b3d01c5](b3d01c5))
* **picker.watch:** check again for closed picker after schedule. See [#2365](#2365) ([8ad80de](8ad80de))
* **picker:** close picker when layout closes. Closes [#2365](#2365) ([779746f](779746f))
* **picker:** dont watch files for closed pickers. Fixes [#2365](#2365) ([c4ec8b6](c4ec8b6))
* **picker:** increase default show_delay to 5s. Closes [#2364](#2364) ([b3197e3](b3197e3))
* **picker:** only trim space in the title if it's preceded by a word like character (skips icons) ([2439c49](2439c49))
* **picker:** pause input progress info for 60ms to prevent flickering when finder is too fast ([ecde81f](ecde81f))
* **scratch:** make sure zindex of scratch window is higher than existing floating windows ([c8422da](c8422da))
* **scroll:** only reset count when needed ([551d79f](551d79f))
* **util.job:** scroll to top when process exits ([b544157](b544157))
* **util.job:** stop on BufWipeout and BufDelete ([c956b37](c956b37))
* **util.job:** stop when attached buffer is no longer valid ([221d4b1](221d4b1))
* **util.job:** use nvim_win_set_cursor instead of `gg` ([5faed2f](5faed2f))
* **util.lsp:** `Snacks.util.lsp.on()` should trigger for each lsp client per buffer ([52f30a1](52f30a1))
* **util:** color() should not create hl groups ([17033e6](17033e6))
* **win:** ignore errors on destroy. Closes [#2381](#2381) ([a8930bd](a8930bd))
* **win:** scratch buffers were sometimes not deleted ([0387297](0387297))
* **win:** when fixbuf triggers in a floating window, just close it. Closes [#2380](#2380) ([de35242](de35242))


### Performance Improvements

* **animate:** smoother animations ([b7a3fed](b7a3fed))
* **notifier:** stop trying to fit more notifs in the layout after skipping max 10 ([3a8ecf5](3a8ecf5))
* **picker.util:** cache badge hl groups ([cb85844](cb85844))
* **scroll:** combine all scrolling commands in one command + restore vim.v.count ([0fbea13](0fbea13))
* **scroll:** smoother scrolling using new animations ([2221fe6](2221fe6))
* **statuscolumn:** only calculate components that are actually needed ([bb80317](bb80317))


### Reverts

* jump `buffer` -&gt; `buffer!`. See [#2378](#2378) ([143e9b5](143e9b5))

---
This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).

v2.27.0

Toggle v2.27.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.27.0 (#2351)

🤖 I have created a release *beep* *boop*
---


##
[2.27.0](v2.26.0...v2.27.0)
(2025-10-26)


### Features

* **keymap:** added new `enabled` option
([b0f21fa](b0f21fa))
* **picker.proc:** finder to process json
([5294c4f](5294c4f))
* **util.job:** simple wrapper around jobstart to work with terminals
(used in dashboards and pickers)
([de05631](de05631))
* **util.lsp:** added overload for `Snacks.util.lsp.on(cb)`
([f33aa20](f33aa20))


### Bug Fixes

* **dashboard:** don't add sleep in nushell. Closes
[#1706](#1706)
([44f71d2](44f71d2))
* **explorer:** refresh git status on all tabs when needed. Closes
[#2348](#2348)
([1472211](1472211))
* **explorer:** windows path fixes
([e1dc6b3](e1dc6b3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v2.26.0

Toggle v2.26.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.26.0 (#2335)

🤖 I have created a release *beep* *boop*
---


##
[2.26.0](v2.25.0...v2.26.0)
(2025-10-25)


### Features

* **explorer:** add cross-platform trash support
([ed08ef1](ed08ef1))
* **keymap:** add filetype and LSP-aware keymap management
([0bf34af](0bf34af))
* **util:** add LSP utility module with dynamic capability handlers
([7a63ba5](7a63ba5))
* **win:** add `SnacksWinSeparator` to default `win.wo.winhighlight`
([#2340](#2340))
([869709d](869709d)),
closes [#2336](#2336)
* **win:** add default *Snacks* prefixed `WinSeparator`
([#2338](#2338))
([381265b](381265b)),
closes [#2336](#2336)


### Bug Fixes

* **dahboard:** do full terminal reset when receiving first output and
displayed cached contents
([c952834](c952834))
* **dashboard:** don't write to closed terminal buffer
([f75eaf1](f75eaf1))
* **dashboard:** work-around for jobstart+pty issue where not all output
is processed before exit. Closes
[#1706](#1706)
([4d776bd](4d776bd))
* **explorer:** macos has `trash` pre-installed, so no need to try
`osascript` and move to first. Closes
[#2349](#2349)
([d569072](d569072))
* **image:** detach image when reloading image file. Closes
[#2343](#2343)
([7bf4175](7bf4175))
* **image:** increase timeout for querying the terminal. Closes
[#2344](#2344)
([4122143](4122143))
* **image:** let healthcheck wait till terminal detection is done
([b029511](b029511))
* **image:** only attach to a buffer once. Closes
[#2343](#2343)
([6f72643](6f72643))
* **image:** work around tmux extended-keys breaking TermResponse.
Closes [#2332](#2332)
([e93dcfd](e93dcfd))
* **layout:** provide parent win width/height when relative to win
([#2346](#2346))
([602393a](602393a))
* **picker:** fix race condition causing "Finder yielded after done"
error. Closes [#2327](#2327)
([c9ccbe5](c9ccbe5))
* **picker:** set min file width to 40
([69417ac](69417ac))
* **win:** use `sbuffer` instead of `split` for split windows
([bbd6d42](bbd6d42))


### Performance Improvements

* **picker:** don't use treesitter string parser, since a change in
nightly creates thousands of unlisted buffers in that case
([ad6c0a5](ad6c0a5))
* **picker:** re-use existing string parsers per language to prevent
needing to create new parsers
([efa304a](efa304a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v2.25.0

Toggle v2.25.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.25.0 (#2329)

🤖 I have created a release *beep* *boop*
---


##
[2.25.0](v2.24.0...v2.25.0)
(2025-10-23)


### Features

* **notifier:** added `gap` option. Closes
[#2331](#2331)
([b1acbb0](b1acbb0))
* **select:** allow configuring options for specific vim.ui.select kinds
([bca5b05](bca5b05))
* **snacks:** added `Snacks.version`. auto updated by the release
workflow
([a283beb](a283beb))


### Bug Fixes

* **dashboard:** fix issue with opening file at location due to
splitkeep and restoring laststatus/showtabline
([1a2b34d](1a2b34d))
* **scroll:** stop animations when buf/changedtick changes
([a42b376](a42b376))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v2.24.0

Toggle v2.24.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.24.0 (#2186)

🤖 I have created a release *beep* *boop*
---


##
[2.24.0](v2.23.0...v2.24.0)
(2025-10-23)


### Features

* **bigfile:** disable mini-hipatterns
([#2170](#2170))
([3d4dd13](3d4dd13))
* **dashboard:** optional `filter` for projects. Closes
[#798](#798)
([fe88a07](fe88a07))
* **debug:** allow debug evaluation of block selections
([#1331](#1331))
([231ffae](231ffae))
* **git:** allow configuring extra git args and git cmd args for all git
sources. See [#2178](#2178)
([5782b5c](5782b5c))
* **image:** add icns support
([#2120](#2120))
([9df47bc](9df47bc))
* **image:** added clear fun. Closes
[#1394](#1394)
([30687d1](30687d1))
* **image:** added support for base64 encoded images in url. Closes
[#2304](#2304)
([2c56e10](2c56e10))
* **image:** allow specifying a page number for inlined pdfs
([#1806](#1806))
([3f0fe34](3f0fe34))
* **indent:** pass win to filter func. Closes
[#2307](#2307)
([8116e0b](8116e0b))
* **input:** added support for a custom highlight functions. Closes
[#2216](#2216)
([9b80137](9b80137))
* **layout:** height=0.7 for preview in vscode layout
([c3d6c01](c3d6c01))
* **layout:** static (non-flex) layouts now shrink the root box to fit
the contents. See
[#2035](#2035)
([ba7845b](ba7845b))
* **picker.finder:** added assertions that finder is still running when
receiving results
([a45503b](a45503b))
* **picker.git_diff:** add `base` option to show diff against a merge
base. Useful to see changes on a branch/PR
([7964f04](7964f04))
* **picker.git:** allow passing extra args to git log command for file
renames ([#1964](#1964))
([2aee35d](2aee35d))
* **picker.git:** use default previewer args in git_show
([#1736](#1736))
([f324f96](f324f96))
* **picker.layout:** added `config` hook for resolved layouts. See
[#2035](#2035)
([722f9ea](722f9ea))
* **picker.lsp_config:** added more info to lsp picker
([636be5c](636be5c))
* **picker.lsp:** added lsp_incoming_calls and lsp_outgoing_calls.
Closes [#1843](#1843)
([55d6670](55d6670))
* **picker.lsp:** added option `keep_parents` to `lsp_symbols` (default
`false`). See [#2083](#2083).
closes [#2266](#2266)
([2b9d522](2b9d522))
* **picker.projects:** make max_depth customizable
([#2253](#2253))
([3e9e2e2](3e9e2e2))
* **picker.scratch:** add scratch picker with grep, new and delete
keybinds ([#1019](#1019))
([ca0f8b2](ca0f8b2))
* **picker.select:** select now fits the list to the items independent
of the layout. Closes
[#2035](#2035)
([5c63614](5c63614))
* **picker:** add author field to git log
([#2295](#2295))
([2cf864a](2cf864a))
* **picker:** add exact match position highlighting for grep results
([3b54c8d](3b54c8d))
* **picker:** add git_restore action for git_status picker
([2b22fe7](2b22fe7))
* **picker:** add toggle_regex for grep
([#1594](#1594))
([bd6ee23](bd6ee23))
* **picker:** added `Snacks.picker.tags()` a picker for ctags. Closes
[#1728](#1728)
([4290287](4290287))
* **picker:** added custom options to `vim.ui.select` that snacks can
use for a better select
([264cab1](264cab1))
* **picker:** added live support to `git_log`, which uses `-S` (pickaxe)
to search. Closes
[#1544](#1544)
([c9fa6f7](c9fa6f7))
* **picker:** allow configuring pathspec for git grep
([#2311](#2311))
([57fbda7](57fbda7))
* **picker:** also ignore dot bare git files
([#2058](#2058))
([4bb0dae](4bb0dae))
* **picker:** enhanced resume with multi-state support and flexible API
([bc6c446](bc6c446))
* **picker:** flexible filename format
([#2294](#2294))
([9ad5d53](9ad5d53))
* **picker:** mapped `<c-g>` to `print_cwd` in list. See
[#2244](#2244)
([faa6aba](faa6aba))
* **picker:** Support rmagatti/autosession session manager
([#1825](#1825))
([fc06234](fc06234))
* **picker:** updated Snacks.picker.lsp_config to work with
`vim.lsp.config`
([292d46f](292d46f))
* **picker:** when resuming a source that has nothing to resume, start a
picker with the source instead
([db3c13c](db3c13c))
* **terminal:** minor improvements for user experience
([#2276](#2276))
([39b14c4](39b14c4))
* **toggle:** allow notification customization via function
([#2247](#2247))
([3ccab97](3ccab97))
* **win:** added support for `vim.o.winborder`. Set win.border = true to
use it
([b30523c](b30523c))
* **win:** all existing snacks windows for all plugins now honor
`vim.o.winborder`. Defaults to `rounded` if not set.
([c1737d8](c1737d8))
* **win:** generalize footer options for keys
([#363](#363))
([b8d1719](b8d1719))
* **win:** make split window "stacking" configurable
([e46a094](e46a094))


### Bug Fixes

* **bigfile:** bigfile doesn't work on windows.
([#1969](#1969))
([b4944ff](b4944ff)),
closes [#1722](https://github.com/folke/snacks.nvim/issues/1722)
* **bufdelete:** try alternate buffer first and otherwise last used
buffer
([914c900](914c900))
* **dashboard:** fix path filtering for `recent_files` with `cwd` option
([#2201](#2201))
([057d4ab](057d4ab))
* **dashboard:** oldfiles filter should return a boolean instead of the
result of find. Fixes
[#2283](#2283)
([fcd309f](fcd309f))
* **dashboard:** pcall chansend for dashoard terminal widgets
([dc65ffd](dc65ffd))
* **dashboard:** recent cwd filter matching
([5c4365e](5c4365e))
* **dashboard:** recent_files section not displaying files without cwd
parameter ([#2284](#2284))
([1ed737e](1ed737e))
* **dashboard:** replace deprecated AutoSession command
([#2288](#2288))
([e9228d6](e9228d6))
* **dashboard:** restore showtabline/laststatus when entering another
non-float window. Closes
[#1774](#1774)
([cc69a93](cc69a93))
* **dashboard:** set `border = "none"` on `terminal` sections
([#1643](#1643))
([83f364f](83f364f))
* **dashboard:** update cursor on loading the dashboard. Closes
[#2004](#2004)
([29682a0](29682a0))
* **dashboard:** use fqn for icon. Closes
[#1496](#1496)
([24e92e0](24e92e0))
* **dim:** fixed the issue of dim's scope variable being nil and
outputting… ([#1938](#1938))
([943a3c7](943a3c7))
* **explorer.git:** don't propagate deletes to parent dirs that don't
exist
([835c4cb](835c4cb))
* **explorer.watch:** handle systems where fs_event doesn't return file
names. Closes [#2190](#2190).
Closes [#2032](#2032)
([d6e34b1](d6e34b1))
* **explorer:** mounted directories being detected as non-directories in
Tree:expand ([#2053](#2053))
([7a5eb10](7a5eb10))
* **explorer:** reset main when entering another window. Closes
[#1587](#1587)
([a5d45d5](a5d45d5))
* **git:** always check parents for git root to fix an issue with git
submodules. Closes
[#2143](#2143)
([14dd362](14dd362))
* **gitbrowse:** fixed urls for gitlab
([#2073](#2073))
([9ebf052](9ebf052))
* **gitbrowse:** send commit as a opt when calling gitbrowse
([#2289](#2289))
([a466429](a466429))
* **git:** set `diff.noprefix=false` for `git diff` to ensure correct
format ([#2174](#2174))
([93f43ca](93f43ca))
* **image.terminal:** do only terminal detection for now. Closes
[#2323](#2323)
([6c7ddae](6c7ddae))
* **image:** correct off by one issue in render fallback
([#1560](#1560))
([441bdcd](441bdcd))
* **image:** correct render fallback to handle "editor" relative
position ([#2296](#2296))
([c552cea](c552cea))
* **image:** correct render fallback to handle "editor" relative
position ([#2297](#2297))
([1c3f15c](1c3f15c))
* **image:** detect kitty image protocol through terminal capability
request. Closes
[#1695](#1695)
([43261ba](43261ba))
* **image:** do not save remote image if fetch fails
([#1915](#1915))
([cb6bf05](cb6bf05))
* **image:** ENOENT on preview
([#2301](#2301))
([5173e96](5173e96))
* **image:** hover close in insert mode
([#2215](#2215))
([ef59af0](ef59af0))
* **image:** markdown inline link query for shortened urls
([#1481](#1481))
([2daa1b2](2daa1b2))
* **image:** set winblend=0 for floatwin when use unicode placeholders
([#1615](#1615))
([758e64c](758e64c))
* **image:** skip `\usepackage` in comments and body
([#2325](#2325))
([90227af](90227af))
* **image:** work-around for sha256 not allowed to be a Blob
([92a08ce](92a08ce))
* **indent:** check that win is valid in step. Closes
[#1943](#1943)
([e409f31](e409f31))
* **indent:** nil check before setting extmark
([#1635](#1635))
([02bf7d2](02bf7d2))
* **input:** schedule stopinsert. Fixes
[#1841](#1841)
([ad6cbc8](ad6cbc8))
* **input:** zindex
([67d690d](67d690d))
* **input:** zindex. Closes
[#2302](#2302)
([d491236](d491236))
* **layout:** allocate at least 1 cell for a widget and enlarge/shrink
the root box when needed. Closes
[#2261](#2261)
([71d6d3c](71d6d3c))
* **layout:** allow width/height to be a function. Closes
[#2184](#2184)
([c757d4d](c757d4d))
* **lazygit:** allow extensible user args
([#789](#789))
([da655a3](da655a3))
* **lazygit:** check if default config file exists before adding to
LG_CONFIG_FILE
([#2256](#2256))
([3731644](3731644))
* **main:** get correct winid for prev window
([db399b1](db399b1))
* **notifier:** include icon in padding in minimal style
([#2239](#2239))
([6daef52](6daef52))
* **notifier:** keep filtered notifications in history
([#2209](#2209))
([ac61546](ac61546))
* **picker.actions:** `<c-g>` in list view now prints file path instead
of cwd. Fallback to cwd
([0b0a58a](0b0a58a))
* **picker.actions:** ensure the current window is updated after tabdrop
([#2326](#2326))
([b30121b](b30121b))
* **picker.actions:** multi-action descriptions. Fixes
[#1501](#1501)
([4edf207](4edf207))
* **picker.actions:** take into account if source is `recent` explicitly
([#1920](#1920))
([b9bd8ae](b9bd8ae))
* **picker.core:** respect camelCase for scoring when ignorecase is true
([#1601](#1601))
([a32735b](a32735b))
* **picker.format:** added min_width for truncated paths
([b7f8116](b7f8116))
* **picker.format:** apply hidden file hl group last. Fixes
[#2127](#2127)
([0bf8fe4](0bf8fe4))
* **picker.format:** correcter max_width for truncpath
([a5d2964](a5d2964))
* **picker.format:** simplified resolvable formatters and more correct
([d5b6d30](d5b6d30))
* **picker.git_diff:** use absolute path when adding buffer to avoid
duplicates ([#1819](#1819))
([a012f39](a012f39))
* **picker.git:** add `ignorecase` for `git_grep`
([#1629](#1629))
([7502e77](7502e77))
* **picker.git:** use unmerged icon for unmerged. Fixes
[#1531](#1531)
([abee3c9](abee3c9))
* **picker.grep:** better line/col parsing. Closes
[#2126](#2126). Fixes
[#2123](#2123)
([1fee799](1fee799))
* **picker.grep:** faulty rg cmd. Closes
[#2280](#2280)
([65a5c8b](65a5c8b))
* **picker.list:** resize when needed. Closes
[#2290](#2290)
([df018ed](df018ed))
* **picker.lsp_config:** cmd can be a function
([ba745ba](ba745ba))
* **picker.lsp:** don't process lsp request results when aborted. Closes
[#2327](#2327)
([4e10708](4e10708))
* **picker.lsp:** move get_clients inside vim.schedule to prevent issues
on Neovim 0.11. Closes
[#2320](#2320)
([79f3a8d](79f3a8d))
* **picker.lsp:** trigger docs workflow
([6f1158f](6f1158f))
* **picker.man:** make tab/split/vsplit work. Closes
[#2171](#2171)
([f39d114](f39d114))
* **picker.marks:** fix buffer checking
([#2287](#2287))
([ca0858a](ca0858a))
* **picker.preview:** better hack to deal with buffer local option
weirdness
([c968d4d](c968d4d))
* **picker.preview:** directory preview should use cwd. Closes
[#2212](#2212). Fixes
[#2093](https://github.com/folke/snacks.nvim/issues/2093)
([d050712](d050712))
* **picker.preview:** don't record previeww searches in history and
prevent scrolling from the top. Closes
[#2305](#2305)
([080320b](080320b))
* **picker.preview:** dont do win-local hack for floating windows
([12b2f0d](12b2f0d))
* **picker.qflist:** error with qflist picker when the list contains
invalid items
([#2293](#2293))
([6af1e76](6af1e76))
* **picker.recent:** include closed / unlisted buffers in recent. Closes
[#1745](#1745)
([5959631](5959631))
* **picker:** add type field to qflist item
([#1538](#1538))
([#1539](#1539))
([125978b](125978b))
* **picker:** added show_delay to config max ms to wait to show if no
results found yet. Closes
[#2206](#2206)
([64583a0](64583a0))
* **picker:** allow some sources to use the current window as main.
Closes [#2012](#2012). See
[#1941](#1941)
([5cda953](5cda953))
* **picker:** correct z-index for preview="main" layout
([e796aef](e796aef))
* **picker:** do not record consecutive duplicate history
([#2040](#2040))
([d0a5310](d0a5310))
* **picker:** fixup for pickers that dont display files
([1b4205e](1b4205e))
* **picker:** load correct actions in list of action names. Closes
[#1501](#1501)
([b064be2](b064be2))
* **picker:** lsp_config now includes any configfured LSP and excludes
deprecated servers
([a0d6eba](a0d6eba))
* **picker:** prevent WinEnter handling during startup
([756a791](756a791))
* **picker:** show_delay config value
([67bb3a7](67bb3a7))
* **picker:** show_delay is in ms. Also increase it to allow
auto_confirm to work properly
([924a930](924a930))
* **picker:** use nvim_paste instead of nvim_put. Closes
[#1941](#1941)
([021e04f](021e04f))
* **projects:** normalize item.text for correct Windows support
([#2275](#2275))
([457596b](457596b))
* **rename:** made rename more robust and make sure target directory
exists. Closes [#2252](#2252)
([c494447](c494447))
* **scope:** allow user to disable keys
([#1918](#1918))
([bebf0bd](bebf0bd))
* **scratch:** branch fallback for detached head
([#1519](#1519))
([98345c7](98345c7))
* **scratch:** hide buffer after formatting when close
([#1523](#1523))
([4379085](4379085))
* **scratch:** use icon[1] when icon is a table to avoid table.concat
error ([#2242](#2242))
([ba90011](ba90011))
* **scroll:** don't animate 1 line scrolls (jk). Closes
[#1620](#1620)
([d293b21](d293b21))
* **scroll:** stop anim and reset state when win has new buf, or buf was
changed. Closes
[#1820](#1820). Closes
[#2221](#2221)
([766f7b8](766f7b8))
* **statuscolumn:** show open folds in consecutive levels
([#1534](#1534))
([7bcd3ba](7bcd3ba))
* **terminal:** check win valid before creating a new terminal
([#1927](#1927))
([ba7bbcd](ba7bbcd))
* **terminal:** make sure terminals opend with `open()` can be found
with `list()`. Closes
[#2172](#2172). Closes
[#2173](#2173)
([13f3006](13f3006))
* **terminal:** set buffer when opening terminal with position='current'
([#2162](#2162))
([2aacf55](2aacf55)),
closes [#2148](#2148)
* **terminal:** stack only terminal splits by default. Closes
[#2137](#2137)
([8c50196](8c50196))
* **util:** fix invalid window error
([#1996](#1996))
([32e5bf1](32e5bf1))
* **util:** only use mini.icons if it has been setup. Closes
[#2199](#2199)
([774bf9d](774bf9d))
* **win:** check parent win is valid before getting size
([#2315](#2315))
([471eb03](471eb03))
* **zen:** make zoom and minimizing work in terminal mode
([#1912](#1912))
([fb54927](fb54927))


### Performance Improvements

* **dashboard:** add basic OSC11 and CSI6n support to terminal sections
(gh 10 seconds faster)
([fb016d2](fb016d2))
* **git:** invoke `git status` with `--no-optional-locks`
([#2175](#2175))
([e441c64](e441c64))
* **grep:** move match parsing to resolve and fix an issue with `.*`
results. Closes
[#2308](#2308)
([1417701](1417701))
* **picker:** set `limit_live=10000` by default. Makes no sense to load
millions of matches when doing live searches.
([04990d0](04990d0))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v2.23.0

Toggle v2.23.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(main): release 2.23.0 (#1434)

🤖 I have created a release *beep* *boop*
---


##
[2.23.0](v2.22.0...v2.23.0)
(2025-09-15)


### Features

* **image.doc:** enable inline math rendering for neorg files. Closes
[#1438](#1438)
([ec487f5](ec487f5))
* **image.inline:** honor `concealcursor` and hide conceal when
selecting lines. Closes
[#1478](#1478)
([bc0630e](bc0630e))
* **image:** proper inline rendering of math expressions. Closes
[#1318](#1318). Closes
[#1454](#1454)
([6ea4fa7](6ea4fa7))
* **picker.git:** added `all` option to also list remote branched for
`git_branches`. Closes
[#1465](#1465)
([3d695ab](3d695ab))
* **scope:** allow disabling scopes with `vim.g.snacks_scope = false` or
`vim.b.snacks_scope = false`. Closes
[#1463](#1463)
([5315e26](5315e26))
* **util:** small ts parse wrapper that parses async when available
([9f0aa20](9f0aa20))


### Bug Fixes

* **dashboard:** escape filenames for edit. Closes
[#1453](#1453)
([8b0e79a](8b0e79a))
* **explorer:** confirm prompt now defaults to `No`
([f970cbb](f970cbb))
* **image.inline:** remove debug
([d9bb639](d9bb639))
* **image.latex:** don't nest image nodes
([714d761](714d761))
* **image.queries:** add image type
([1bbd479](1bbd479))
* **image:** only show anchor icon for inline images shown on the lines
below. Closes [#1479](#1479)
([bc2ed15](bc2ed15))
* **indent:** zero indent for blank lines. Closes
[#1477](#1477)
([cddf714](cddf714))
* **input:** add cr keybind for normal mode. Closes
[#1468](#1468). Closes
[#1466](#1466)
([78f0ad6](78f0ad6))
* **lsp:** fix deprecated warnings related to lsp client
([07fefd2](07fefd2))
* **picker.preview:** always use builtin for git log preview
([f0d3433](f0d3433))
* **statuscolumn:** better way of determining open folds. Closes
[#1445](#1445)
([1239fb8](1239fb8))
* **util.spawn:** correctly mark as faild on abort
([6917597](6917597))
* **win:** make sure the border is set when setting the title
([76311ab](76311ab))


### Performance Improvements

* **image:** async treesitter parsing for images
([e55ae37](e55ae37))


### Reverts

* dont always set border when setting title. Closes
[#1436](#1436)
([fa29c6c](fa29c6c))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>