Showing preview only (2,568K chars total). Download the full file or copy to clipboard to get everything.
Repository: folke/snacks.nvim
Branch: main
Commit: ad9ede6a9cdd
Files: 272
Total size: 2.4 MB
Directory structure:
gitextract_ihjv8qnw/
├── .editorconfig
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ ├── labeler.yml
│ ├── release-please-config.json
│ ├── release-please-manifest.json
│ └── workflows/
│ ├── ci.yml
│ ├── labeler.yml
│ ├── pr.yml
│ ├── stale.yml
│ └── update.yml
├── .gitignore
├── .markdownlint-cli2.yaml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── doc/
│ ├── snacks.nvim-animate.txt
│ ├── snacks.nvim-bigfile.txt
│ ├── snacks.nvim-bufdelete.txt
│ ├── snacks.nvim-dashboard.txt
│ ├── snacks.nvim-debug.txt
│ ├── snacks.nvim-dim.txt
│ ├── snacks.nvim-explorer.txt
│ ├── snacks.nvim-gh.txt
│ ├── snacks.nvim-git.txt
│ ├── snacks.nvim-gitbrowse.txt
│ ├── snacks.nvim-health.txt
│ ├── snacks.nvim-image.txt
│ ├── snacks.nvim-indent.txt
│ ├── snacks.nvim-init.txt
│ ├── snacks.nvim-input.txt
│ ├── snacks.nvim-keymap.txt
│ ├── snacks.nvim-layout.txt
│ ├── snacks.nvim-lazygit.txt
│ ├── snacks.nvim-meta.txt
│ ├── snacks.nvim-notifier.txt
│ ├── snacks.nvim-notify.txt
│ ├── snacks.nvim-picker.txt
│ ├── snacks.nvim-profiler.txt
│ ├── snacks.nvim-quickfile.txt
│ ├── snacks.nvim-rename.txt
│ ├── snacks.nvim-scope.txt
│ ├── snacks.nvim-scratch.txt
│ ├── snacks.nvim-scroll.txt
│ ├── snacks.nvim-statuscolumn.txt
│ ├── snacks.nvim-styles.txt
│ ├── snacks.nvim-terminal.txt
│ ├── snacks.nvim-toggle.txt
│ ├── snacks.nvim-util.txt
│ ├── snacks.nvim-win.txt
│ ├── snacks.nvim-words.txt
│ ├── snacks.nvim-zen.txt
│ └── snacks.nvim.txt
├── docs/
│ ├── animate.md
│ ├── bigfile.md
│ ├── bufdelete.md
│ ├── dashboard.md
│ ├── debug.md
│ ├── dim.md
│ ├── examples/
│ │ ├── dashboard.lua
│ │ ├── init.lua
│ │ └── picker.lua
│ ├── explorer.md
│ ├── gh.md
│ ├── git.md
│ ├── gitbrowse.md
│ ├── health.md
│ ├── image.md
│ ├── indent.md
│ ├── init.md
│ ├── input.md
│ ├── keymap.md
│ ├── layout.md
│ ├── lazygit.md
│ ├── meta.md
│ ├── notifier.md
│ ├── notify.md
│ ├── picker.md
│ ├── profiler.md
│ ├── quickfile.md
│ ├── rename.md
│ ├── scope.md
│ ├── scratch.md
│ ├── scroll.md
│ ├── statuscolumn.md
│ ├── styles.md
│ ├── terminal.md
│ ├── toggle.md
│ ├── util.md
│ ├── win.md
│ ├── words.md
│ └── zen.md
├── lua/
│ ├── snacks/
│ │ ├── animate/
│ │ │ ├── easing.lua
│ │ │ └── init.lua
│ │ ├── bigfile.lua
│ │ ├── bufdelete.lua
│ │ ├── compat.lua
│ │ ├── dashboard.lua
│ │ ├── debug.lua
│ │ ├── dim.lua
│ │ ├── explorer/
│ │ │ ├── actions.lua
│ │ │ ├── diagnostics.lua
│ │ │ ├── git.lua
│ │ │ ├── init.lua
│ │ │ ├── tree.lua
│ │ │ └── watch.lua
│ │ ├── gh/
│ │ │ ├── actions.lua
│ │ │ ├── api.lua
│ │ │ ├── buf.lua
│ │ │ ├── init.lua
│ │ │ ├── item.lua
│ │ │ ├── render/
│ │ │ │ └── init.lua
│ │ │ └── types.lua
│ │ ├── git.lua
│ │ ├── gitbrowse.lua
│ │ ├── health.lua
│ │ ├── image/
│ │ │ ├── buf.lua
│ │ │ ├── convert.lua
│ │ │ ├── doc.lua
│ │ │ ├── image.lua
│ │ │ ├── init.lua
│ │ │ ├── inline.lua
│ │ │ ├── placement.lua
│ │ │ ├── terminal.lua
│ │ │ └── util.lua
│ │ ├── indent.lua
│ │ ├── init.lua
│ │ ├── input.lua
│ │ ├── keymap.lua
│ │ ├── layout.lua
│ │ ├── lazygit.lua
│ │ ├── meta/
│ │ │ ├── docs.lua
│ │ │ ├── init.lua
│ │ │ └── types.lua
│ │ ├── notifier.lua
│ │ ├── notify.lua
│ │ ├── picker/
│ │ │ ├── actions.lua
│ │ │ ├── config/
│ │ │ │ ├── defaults.lua
│ │ │ │ ├── highlights.lua
│ │ │ │ ├── init.lua
│ │ │ │ ├── layouts.lua
│ │ │ │ └── sources.lua
│ │ │ ├── core/
│ │ │ │ ├── _health.lua
│ │ │ │ ├── actions.lua
│ │ │ │ ├── filter.lua
│ │ │ │ ├── finder.lua
│ │ │ │ ├── frecency.lua
│ │ │ │ ├── input.lua
│ │ │ │ ├── list.lua
│ │ │ │ ├── main.lua
│ │ │ │ ├── matcher.lua
│ │ │ │ ├── picker.lua
│ │ │ │ ├── preview.lua
│ │ │ │ └── score.lua
│ │ │ ├── format.lua
│ │ │ ├── init.lua
│ │ │ ├── preview.lua
│ │ │ ├── resume.lua
│ │ │ ├── select.lua
│ │ │ ├── sort.lua
│ │ │ ├── source/
│ │ │ │ ├── buffers.lua
│ │ │ │ ├── diagnostics.lua
│ │ │ │ ├── diff.lua
│ │ │ │ ├── explorer.lua
│ │ │ │ ├── files.lua
│ │ │ │ ├── gh.lua
│ │ │ │ ├── git.lua
│ │ │ │ ├── grep.lua
│ │ │ │ ├── help.lua
│ │ │ │ ├── icons.lua
│ │ │ │ ├── lazy.lua
│ │ │ │ ├── lines.lua
│ │ │ │ ├── lsp/
│ │ │ │ │ ├── config.lua
│ │ │ │ │ └── init.lua
│ │ │ │ ├── meta.lua
│ │ │ │ ├── proc.lua
│ │ │ │ ├── qf.lua
│ │ │ │ ├── recent.lua
│ │ │ │ ├── scratch.lua
│ │ │ │ ├── snacks.lua
│ │ │ │ ├── system.lua
│ │ │ │ ├── treesitter.lua
│ │ │ │ └── vim.lua
│ │ │ ├── transform.lua
│ │ │ ├── types.lua
│ │ │ └── util/
│ │ │ ├── async.lua
│ │ │ ├── db.lua
│ │ │ ├── diff.lua
│ │ │ ├── highlight.lua
│ │ │ ├── history.lua
│ │ │ ├── init.lua
│ │ │ ├── kv.lua
│ │ │ ├── markdown.lua
│ │ │ ├── minheap.lua
│ │ │ ├── queue.lua
│ │ │ └── spinner.lua
│ │ ├── profiler/
│ │ │ ├── core.lua
│ │ │ ├── init.lua
│ │ │ ├── loc.lua
│ │ │ ├── picker.lua
│ │ │ ├── tracer.lua
│ │ │ └── ui.lua
│ │ ├── quickfile.lua
│ │ ├── rename.lua
│ │ ├── scope.lua
│ │ ├── scratch.lua
│ │ ├── scroll.lua
│ │ ├── statuscolumn.lua
│ │ ├── terminal.lua
│ │ ├── toggle.lua
│ │ ├── util/
│ │ │ ├── init.lua
│ │ │ ├── job.lua
│ │ │ ├── lsp.lua
│ │ │ └── spawn.lua
│ │ ├── win.lua
│ │ ├── words.lua
│ │ └── zen.lua
│ └── trouble/
│ └── sources/
│ └── profiler.lua
├── plugin/
│ └── snacks.lua
├── queries/
│ ├── css/
│ │ └── images.scm
│ ├── html/
│ │ └── images.scm
│ ├── javascript/
│ │ └── images.scm
│ ├── latex/
│ │ └── images.scm
│ ├── lua/
│ │ ├── highlights.scm
│ │ └── injections.scm
│ ├── markdown/
│ │ ├── images.scm
│ │ └── injections.scm
│ ├── markdown_inline/
│ │ └── images.scm
│ ├── norg/
│ │ └── images.scm
│ ├── scss/
│ │ └── images.scm
│ ├── svelte/
│ │ └── images.scm
│ ├── tsx/
│ │ └── images.scm
│ ├── typst/
│ │ └── images.scm
│ └── vue/
│ └── images.scm
├── scripts/
│ ├── docs
│ ├── docs-post
│ └── test
├── selene.toml
├── stylua.toml
├── tests/
│ ├── config_spec.lua
│ ├── gitbrowse_spec.lua
│ ├── image/
│ │ ├── big.md
│ │ ├── math.md
│ │ ├── test-mermaid.md
│ │ ├── test.aux
│ │ ├── test.css
│ │ ├── test.html
│ │ ├── test.jsx
│ │ ├── test.md
│ │ ├── test.mmd
│ │ ├── test.norg
│ │ ├── test.org
│ │ ├── test.scss
│ │ ├── test.svelte
│ │ ├── test.tex
│ │ ├── test.tsx
│ │ ├── test.typ
│ │ ├── test.vue
│ │ └── test2.md
│ ├── minit.lua
│ ├── picker/
│ │ ├── diff_spec.lua
│ │ ├── git_status_spec.lua
│ │ ├── matcher_spec.lua
│ │ ├── minheap_spec.lua
│ │ └── util_spec.lua
│ ├── scope_spec.lua
│ ├── terminal_spec.lua
│ └── util_spec.lua
└── vim.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
insert_final_newline = true
indent_style = space
indent_size = 2
charset = utf-8
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: File a bug/issue
title: "bug: "
labels: [bug]
body:
- type: markdown
attributes:
value: |
**Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/snacks.nvim)
and search [existing issues](https://github.com/folke/snacks.nvim/issues).
Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/snacks.nvim/discussions) and will be closed.
- type: checkboxes
attributes:
label: Did you check docs and existing issues?
description: Make sure you checked all of the below before submitting an issue
options:
- label: I have read all the snacks.nvim docs
required: true
- label: I have updated the plugin to the latest version before submitting this issue
required: true
- label: I have searched the existing issues of snacks.nvim
required: true
- label: I have searched the existing issues of plugins related to this issue
required: true
- type: input
attributes:
label: "Neovim version (nvim -v)"
placeholder: "0.8.0 commit db1b0ee3b30f"
validations:
required: true
- type: input
attributes:
label: "Operating system/version"
placeholder: "MacOS 11.5"
validations:
required: true
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. Please include any related errors you see in Neovim.
validations:
required: true
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
1.
2.
3.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Repro
description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua`
value: |
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 = {
{ "folke/snacks.nvim", opts = {} },
-- add any other plugins here
},
})
render: lua
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Ask a question
url: https://github.com/folke/snacks.nvim/discussions
about: Use Github discussions instead
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest a new feature
title: "feature: "
labels: [enhancement]
body:
- type: checkboxes
attributes:
label: Did you check the docs?
description: Make sure you read all the docs before submitting a feature request
options:
- label: I have read all the snacks.nvim docs
required: true
- type: textarea
validations:
required: true
attributes:
label: Is your feature request related to a problem? Please describe.
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
- type: textarea
validations:
required: true
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
- type: textarea
validations:
required: true
attributes:
label: Describe alternatives you've considered
description: A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
validations:
required: false
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Description
<!-- Describe the big picture of your changes to communicate to the maintainers
why we should accept this pull request. -->
## Related Issue(s)
<!--
If this PR fixes any issues, please link to the issue here.
- Fixes #<issue_number>
-->
## Screenshots
<!-- Add screenshots of the changes if applicable. -->
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/labeler.yml
================================================
# .github/labeler.yml
# Label for any files under the `doc/` directory
docs-vim:
- changed-files:
- any-glob-to-any-file: "doc/**"
# Label for any files under the `docs/` directory and `README.md`
docs:
- changed-files:
- any-glob-to-any-file:
- "docs/**"
- "README.md"
core:
- changed-files:
- any-glob-to-any-file:
- "lua/snacks/init.lua"
- "lua/snacks/health.lua"
- "plugins/**"
- "queries/**"
- "scripts/**"
# Dynamic labels for each module under `lua/snacks/`
animate:
- changed-files:
- any-glob-to-any-file: "lua/snacks/animate/**"
bigfile:
- changed-files:
- any-glob-to-any-file: "lua/snacks/bigfile.lua"
bufdelete:
- changed-files:
- any-glob-to-any-file: "lua/snacks/bufdelete.lua"
compat:
- changed-files:
- any-glob-to-any-file: "lua/snacks/compat.lua"
dashboard:
- changed-files:
- any-glob-to-any-file: "lua/snacks/dashboard.lua"
debug:
- changed-files:
- any-glob-to-any-file: "lua/snacks/debug.lua"
dim:
- changed-files:
- any-glob-to-any-file: "lua/snacks/dim.lua"
explorer:
- changed-files:
- any-glob-to-any-file: "lua/snacks/explorer/**"
git:
- changed-files:
- any-glob-to-any-file: "lua/snacks/git.lua"
gitbrowse:
- changed-files:
- any-glob-to-any-file: "lua/snacks/gitbrowse.lua"
image:
- changed-files:
- any-glob-to-any-file: "lua/snacks/image/**"
indent:
- changed-files:
- any-glob-to-any-file: "lua/snacks/indent.lua"
init:
- changed-files:
- any-glob-to-any-file: "lua/snacks/init.lua"
input:
- changed-files:
- any-glob-to-any-file: "lua/snacks/input.lua"
layout:
- changed-files:
- any-glob-to-any-file: "lua/snacks/layout.lua"
lazygit:
- changed-files:
- any-glob-to-any-file: "lua/snacks/lazygit.lua"
notifier:
- changed-files:
- any-glob-to-any-file: "lua/snacks/notifier.lua"
notify:
- changed-files:
- any-glob-to-any-file: "lua/snacks/notify.lua"
picker:
- changed-files:
- any-glob-to-any-file: "lua/snacks/picker/**"
profiler:
- changed-files:
- any-glob-to-any-file: "lua/snacks/profiler/**"
quickfile:
- changed-files:
- any-glob-to-any-file: "lua/snacks/quickfile.lua"
rename:
- changed-files:
- any-glob-to-any-file: "lua/snacks/rename.lua"
scope:
- changed-files:
- any-glob-to-any-file: "lua/snacks/scope.lua"
scratch:
- changed-files:
- any-glob-to-any-file: "lua/snacks/scratch.lua"
scroll:
- changed-files:
- any-glob-to-any-file: "lua/snacks/scroll.lua"
statuscolumn:
- changed-files:
- any-glob-to-any-file: "lua/snacks/statuscolumn.lua"
terminal:
- changed-files:
- any-glob-to-any-file: "lua/snacks/terminal.lua"
toggle:
- changed-files:
- any-glob-to-any-file: "lua/snacks/toggle.lua"
win:
- changed-files:
- any-glob-to-any-file: "lua/snacks/win.lua"
words:
- changed-files:
- any-glob-to-any-file: "lua/snacks/words.lua"
zen:
- changed-files:
- any-glob-to-any-file: "lua/snacks/zen.lua"
================================================
FILE: .github/release-please-config.json
================================================
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"packages": {
".": {
"extra-files": ["lua/snacks/init.lua"],
"release-type": "simple"
}
}
}
================================================
FILE: .github/release-please-manifest.json
================================================
{
".": "2.31.0"
}
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches: [main, master]
pull_request:
jobs:
ci:
uses: folke/github/.github/workflows/ci.yml@main
secrets: inherit
with:
plugin: snacks.nvim
repo: folke/snacks.nvim
================================================
FILE: .github/workflows/labeler.yml
================================================
name: "PR Labeler"
on:
- pull_request_target
jobs:
labeler:
uses: folke/github/.github/workflows/labeler.yml@main
secrets: inherit
================================================
FILE: .github/workflows/pr.yml
================================================
name: PR Title
on:
pull_request_target:
types:
- opened
- edited
- synchronize
- reopened
- ready_for_review
permissions:
pull-requests: read
jobs:
pr-title:
uses: folke/github/.github/workflows/pr.yml@main
secrets: inherit
================================================
FILE: .github/workflows/stale.yml
================================================
name: Stale Issues & PRs
on:
schedule:
- cron: "30 1 * * *"
jobs:
stale:
if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner)
uses: folke/github/.github/workflows/stale.yml@main
secrets: inherit
================================================
FILE: .github/workflows/update.yml
================================================
name: Update Repo
on:
workflow_dispatch:
schedule:
# Run every hour
- cron: "0 * * * *"
jobs:
update:
if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner)
uses: folke/github/.github/workflows/update.yml@main
secrets: inherit
================================================
FILE: .gitignore
================================================
*.log
/.repro
/.tests
/build
/debug
/doc/tags
foo.*
node_modules
tt.*
================================================
FILE: .markdownlint-cli2.yaml
================================================
config:
MD013: false
MD033: false
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## [2.31.0](https://github.com/folke/snacks.nvim/compare/v2.30.0...v2.31.0) (2026-03-20)
### Features
* **gh:** added `Start Review`. Closes [#2463](https://github.com/folke/snacks.nvim/issues/2463) ([ac5f497](https://github.com/folke/snacks.nvim/commit/ac5f49700527ee5fd14473c5a759460c58d2789d))
* **gh:** added cycle win and scrolling to scratch buffers when opened in a picker. Closes [#2480](https://github.com/folke/snacks.nvim/issues/2480) ([021855c](https://github.com/folke/snacks.nvim/commit/021855cf29eae9e41107ba28786e5e68b748e8c3))
* **gh:** make copilot authors as bots ([c6ab189](https://github.com/folke/snacks.nvim/commit/c6ab18964b587edab0e4046719fbc590a59ee042))
* **gh:** make markview.nvim play nicely with snacks. See [#2467](https://github.com/folke/snacks.nvim/issues/2467) ([deeb1e0](https://github.com/folke/snacks.nvim/commit/deeb1e03e22d83a18c04d1230e628d98a490b6ec))
* **gh:** open scratch buffers at the bottom of the window. Closes [#2476](https://github.com/folke/snacks.nvim/issues/2476) ([a6a9678](https://github.com/folke/snacks.nvim/commit/a6a967810e185ecc94304529dc09d57e18ba9b68))
* **gh:** special formatting for code suggestions in review comments. See [#2463](https://github.com/folke/snacks.nvim/issues/2463) ([f1c7f62](https://github.com/folke/snacks.nvim/commit/f1c7f62f9fd6974da3dc8526f454cd364cd73eeb))
* **gh:** when selecting lines in a diff to add a review comment, you can now suggest code changes. See [#2463](https://github.com/folke/snacks.nvim/issues/2463) ([e896fb9](https://github.com/folke/snacks.nvim/commit/e896fb93f66d6f60176d6c014ddec4352ced4c61))
* **lua:** add any treesitter injection to a string with a comment like -- inject:graphql ([1d5b12d](https://github.com/folke/snacks.nvim/commit/1d5b12d0c67071320e5572a1f2ac1265904426b3))
* **picker.actions:** allow specifying an additional window for `cycle_win` ([197f393](https://github.com/folke/snacks.nvim/commit/197f393bbb30684d33165106482aad0a663964c8))
* **picker.lspconfig:** show available dynamic registered code actions ([521ef46](https://github.com/folke/snacks.nvim/commit/521ef46ae9d38f1b31ca8a05b39647fda13a56be))
* **picker.lspconfig:** show available server commands and code actions ([7a90a08](https://github.com/folke/snacks.nvim/commit/7a90a089b781a3fc3c5cd179cdc095a0d244d5fa))
* **win:** `opts.footer_keys` can now be an array of lhs to show instead of all. See [#2469](https://github.com/folke/snacks.nvim/issues/2469) ([6d72138](https://github.com/folke/snacks.nvim/commit/6d721388cc5760db215abd875606a273c1c685f9))
* **win:** better zindex calculation ([08c0951](https://github.com/folke/snacks.nvim/commit/08c09515234b1ecc285d63aa56915caafa1d72d3))
* **win:** new border `top_bottom` ([6134c98](https://github.com/folke/snacks.nvim/commit/6134c98d48657b457a7d4b1e2cd2c7ce37d98ea4))
### Bug Fixes
* **gh.item:** timestamps should be in UTC, not local time ([1ba0bf8](https://github.com/folke/snacks.nvim/commit/1ba0bf8a10b117d08c2a97347bd666f995600d8a))
* **gh.scratch:** if scratch would hide the cursor, then scroll preview up taking scrolloff into account. See [#2480](https://github.com/folke/snacks.nvim/issues/2480) ([a271610](https://github.com/folke/snacks.nvim/commit/a2716102c8bd7d25693201af0942552f10e9a0c3))
* **gh:** better integration with render-markdown. Closes [#2467](https://github.com/folke/snacks.nvim/issues/2467) ([717073d](https://github.com/folke/snacks.nvim/commit/717073df1a515a1564e855cc6ae8986025611e4b))
* **gh:** diff comment action should only show when available ([fe20e95](https://github.com/folke/snacks.nvim/commit/fe20e9578033a1b726983d6f410a5cc8098fb3c2))
* **gh:** render gh comments as markdown when displaying in a non-markdown buffer. Closes [#2481](https://github.com/folke/snacks.nvim/issues/2481) ([06e9ca9](https://github.com/folke/snacks.nvim/commit/06e9ca95f81f528c4314afb80a59ce317f12ac5d))
* **gh:** rendering of markdown comments. Closes [#2488](https://github.com/folke/snacks.nvim/issues/2488) ([dec29f5](https://github.com/folke/snacks.nvim/commit/dec29f55666f8f4545835636077a86b150faf630))
* **gh:** set default scratch `height=15` and fix bottom offset for custom height ([6900f3f](https://github.com/folke/snacks.nvim/commit/6900f3feaa397e8bd671be39411a370188f856c6))
* **grep:** remove `MATCH_SEP` before sending to notify ([#2744](https://github.com/folke/snacks.nvim/issues/2744)) ([9912042](https://github.com/folke/snacks.nvim/commit/9912042fc8bca2209105526ac7534e9a0c2071b2))
* **grep:** remove nul bytes from warning messages in grep output. Fixes [#2744](https://github.com/folke/snacks.nvim/issues/2744), Closes [#2768](https://github.com/folke/snacks.nvim/issues/2768) ([b2cb00e](https://github.com/folke/snacks.nvim/commit/b2cb00ef7d12da7f2d6e0684c43e2965896309dd))
* **grep:** use %z to replace nul bytes ([a049339](https://github.com/folke/snacks.nvim/commit/a049339328e2599ad6e85a69fa034ac501e921b2))
* **input:** fixed completion. Closes [#2472](https://github.com/folke/snacks.nvim/issues/2472) ([3024376](https://github.com/folke/snacks.nvim/commit/30243765808a6ea92da9886b50b4e2e01ff262e3))
* **lspconfig:** handle complex values in lsp config preview. Closes [#2711](https://github.com/folke/snacks.nvim/issues/2711) ([25f53f7](https://github.com/folke/snacks.nvim/commit/25f53f762cc391591285adf0974a8d6e4b4b973e))
* **markdown:** use new markview API ([9b86d57](https://github.com/folke/snacks.nvim/commit/9b86d57cc580e976ee3c89fdf20477873bd5f0c2))
* **picker.actions:** `vim.v.count1` should be `1` in insert mode. Closes [#2492](https://github.com/folke/snacks.nvim/issues/2492) ([d902c0a](https://github.com/folke/snacks.nvim/commit/d902c0a415ffbf66321f40ecb07e73fea283d0ab))
* **picker.confirm:** better layout for confirm ([7f62aa6](https://github.com/folke/snacks.nvim/commit/7f62aa6c6c78a1fcbe207dbb59f6b3105f756e79))
* **picker.diff:** make diff filename extmarks play nicely with markview / markdown-renderer ([4f749ab](https://github.com/folke/snacks.nvim/commit/4f749ab355cd62bbffbb2f6cc4ddcf0fc274fece))
* **picker.git:** fix cwd for git diff. Closes [#2483](https://github.com/folke/snacks.nvim/issues/2483) ([9076793](https://github.com/folke/snacks.nvim/commit/907679381ba5ed36a24b0176930e3ceb97ca4755))
* **picker.lsp:** wait for pending requests. See [#2527](https://github.com/folke/snacks.nvim/issues/2527) ([fe7cfe9](https://github.com/folke/snacks.nvim/commit/fe7cfe9800a182274d0f868a74b7263b8c0c020b))
* **picker.preview:** remove `--no-ext-diff` option for git diff preview ([836e073](https://github.com/folke/snacks.nvim/commit/836e07336ba523d4da480cd66f0241815393e98e))
* **picker.spinner:** when parent win is not float win ([#2487](https://github.com/folke/snacks.nvim/issues/2487)) ([8ca098c](https://github.com/folke/snacks.nvim/commit/8ca098ca360b45a361c475be6ea7dd81e438cc35))
* **picker:** fix nowait for `<c-r>` ([685c433](https://github.com/folke/snacks.nvim/commit/685c433e61812eb21a890f14dac38a8c573931df))
* **scratch:** set filetype correctly. Closes [#2510](https://github.com/folke/snacks.nvim/issues/2510) ([3c5c23b](https://github.com/folke/snacks.nvim/commit/3c5c23ba91e608bd89bb36d76cb005aa63d20dbf))
* **util.diff:** proper linebreak repeat for annotation boxes ([64179b9](https://github.com/folke/snacks.nvim/commit/64179b96f547bc10211de3360a1e17a237cdb434))
* **win:** allow scrolling beyond eob ([8b5f762](https://github.com/folke/snacks.nvim/commit/8b5f76292becf9ad76ef1507cbdcec64a49ff3f4))
* **win:** use normkey instead of keytrans for footer keys ([9bd41bb](https://github.com/folke/snacks.nvim/commit/9bd41bb2ff5acd68d81e7323a80d18aa9efb7ca9))
* **win:** when a floating win becomes non-floating, remove its backdrop ([c1e1500](https://github.com/folke/snacks.nvim/commit/c1e15001c0da18f740bc8bbe55fc0509f41bd9c6))
### Performance Improvements
* **bigfile:** disable completion to avoid lag when entering insert mode ([#2475](https://github.com/folke/snacks.nvim/issues/2475)) ([c49c3f3](https://github.com/folke/snacks.nvim/commit/c49c3f364cde3bb1bbf79e501d1492ea8e2397bc))
## [2.30.0](https://github.com/folke/snacks.nvim/compare/v2.29.0...v2.30.0) (2025-11-06)
### Features
* **diff:** prettier commit rendering (git show, diff with header) ([dc2186e](https://github.com/folke/snacks.nvim/commit/dc2186e57221cd834487e5c3fbd548180e836d1c))
* **gh:** add inline review comment annotations to diff viewer ([c83ff8d](https://github.com/folke/snacks.nvim/commit/c83ff8d5982e6ebf92623911e232f1dbd0b0a00c))
* **gh:** create review comments in GitHub PR diff, on diff lines. Closes [#2446](https://github.com/folke/snacks.nvim/issues/2446) ([85bf3f0](https://github.com/folke/snacks.nvim/commit/85bf3f0123cd6aaa1e06569283ffca10b59fcc3b))
* **layout:** allow resizing split layouts. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([913379c](https://github.com/folke/snacks.nvim/commit/913379ccd2679fc11462479205897e584496c855))
* **picker.gh_diff:** you can now reply to review comments in diffs with `a`. See [#2446](https://github.com/folke/snacks.nvim/issues/2446) ([c3bda87](https://github.com/folke/snacks.nvim/commit/c3bda8709ab9f300e9dd15c2e0ec47f17caff1d5))
* **picker.icons:** make it easier to add custom icon sources ([82e6966](https://github.com/folke/snacks.nvim/commit/82e69661cd0766893184dcc3ec3684b492772854))
* **picker.marks:** added `<c-x>` to delete a mark from the list. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([9a04605](https://github.com/folke/snacks.nvim/commit/9a04605664be0613963910d545d4164eb2f57bab))
* **picker:** when picker was started from insert mode, return to insert after paste ([a417630](https://github.com/folke/snacks.nvim/commit/a4176301e323d9689674764da62f628742dc744a))
* **util.async:** add proper backtrace to unhandled async errors ([01f6cac](https://github.com/folke/snacks.nvim/commit/01f6cac48fd7a3ec9bf7e5fc8a5ae22381861baf))
### Bug Fixes
* **gh:** force `fancy` diff style for gh pr diff, since that's needed to render/interact with review comments ([bd71cd4](https://github.com/folke/snacks.nvim/commit/bd71cd4b007fd414f2bd3e4ce7d292fde4b8849f))
* **gh:** only skip empty comment reviews. Closes [#2445](https://github.com/folke/snacks.nvim/issues/2445) ([1848d74](https://github.com/folke/snacks.nvim/commit/1848d74e7c01a0c4686b6e8353158507a73dfe10))
* **gh:** pass correct context in gh_perform_action. Closes [#2442](https://github.com/folke/snacks.nvim/issues/2442). Closes [#2443](https://github.com/folke/snacks.nvim/issues/2443) ([13edbc6](https://github.com/folke/snacks.nvim/commit/13edbc681c727adfff72c49d07fedaec566404f8))
* **gh:** properly handly pending requests ([7a15e16](https://github.com/folke/snacks.nvim/commit/7a15e16d0165fa3b22486066795eeca788ec0c8d))
* **gh:** use lua to parse dates so we can do this in a fast context ([cd0d6fe](https://github.com/folke/snacks.nvim/commit/cd0d6fe86465394af8ba5037bc87d7ebfecc10fb))
* **image:** run terminal capability detection synchronous when needed. Closes [#2439](https://github.com/folke/snacks.nvim/issues/2439) ([58f1152](https://github.com/folke/snacks.nvim/commit/58f11527fe8b63ccabb1d75bb8f14f5ebbdc6a14))
* **layout:** ignore very zindex windows for calulating layout zindex, so that it stays below things like notifications ([47340e6](https://github.com/folke/snacks.nvim/commit/47340e6b0b24773ef4789aa677394a2499762841))
* **lsp:** properly detach buffers on LspDetach. Closes [#2457](https://github.com/folke/snacks.nvim/issues/2457) ([beb995e](https://github.com/folke/snacks.nvim/commit/beb995e1c6a554d53f6d23fc3aadea568dab2534))
* **picker.actions:** don't open a new tab if the current tab is empty. Closes [#2461](https://github.com/folke/snacks.nvim/issues/2461) ([4e2424e](https://github.com/folke/snacks.nvim/commit/4e2424eca7ffaa6e36ebf4ac4d136d05b79edc41))
* **picker.diff:** added `showbreak=""` for fancy diff. Closes [#2441](https://github.com/folke/snacks.nvim/issues/2441) ([fb55f7b](https://github.com/folke/snacks.nvim/commit/fb55f7bf2b6521eb6d7adf6a6b4b437a80882cd0))
* **picker.format:** use file for icon. fallback to ft when buffer is not a file. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([20ac8bf](https://github.com/folke/snacks.nvim/commit/20ac8bfc4ac615a46f64b7806ff367b114bc942f))
* **picker.grep_word:** pass `--word-regexp` to `ripgrep` ([6aad368](https://github.com/folke/snacks.nvim/commit/6aad36810a8b49041b8a7d3ef6b9050549be0617))
* **picker.highlight:** resolve ([4438ee4](https://github.com/folke/snacks.nvim/commit/4438ee4770edad9fb843d841b9fdf5ef04d9f479))
* **picker.input:** startinsert when starting the picker from terminal mode. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([b2054a3](https://github.com/folke/snacks.nvim/commit/b2054a3a734631f33b3b08af88b171930666bffe))
* **picker.lsp_config:** nil on lsp info ([#2459](https://github.com/folke/snacks.nvim/issues/2459)) ([c5257fa](https://github.com/folke/snacks.nvim/commit/c5257fa690fe7e7de7d0da29a6f46f2236b355f0))
* **scope:** textobjects should use synchronous treesitter parsing. Closes [#2448](https://github.com/folke/snacks.nvim/issues/2448) ([9737c25](https://github.com/folke/snacks.nvim/commit/9737c25f2937ab4cd4751b7d041268949d9e0d97))
* **toggle:** set/get raw values for option toggles. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([41da728](https://github.com/folke/snacks.nvim/commit/41da728f0280033c13aaa4e2820bd3e926790a28))
* **win:** set `foldcolumn='0'` for minimal style. See [#2390](https://github.com/folke/snacks.nvim/issues/2390) ([195faa0](https://github.com/folke/snacks.nvim/commit/195faa0646df9e9c765c3b86c58407021decdb7c))
## [2.29.0](https://github.com/folke/snacks.nvim/compare/v2.28.0...v2.29.0) (2025-11-04)
### Features
* **gh.diff:** show git status in PR diff ([c671d06](https://github.com/folke/snacks.nvim/commit/c671d062d163a31894453dbca15087ea9149ac38))
* **gh:** added reviews and nice diffs to gh buffer views. See [#2411](https://github.com/folke/snacks.nvim/issues/2411) ([1335ca1](https://github.com/folke/snacks.nvim/commit/1335ca1956fa81ddb3e249721e8f422c4cd0c329))
* **gh:** allow to update pr branch ([#2419](https://github.com/folke/snacks.nvim/issues/2419)) ([f75f307](https://github.com/folke/snacks.nvim/commit/f75f307af3230c9872939aabd2fb484d8ad3cb5f))
* **gh:** use new diff renderer for gh pr reviews ([714edec](https://github.com/folke/snacks.nvim/commit/714edec900334130a274ef1a21dd2b6edb7997fe))
* **gh:** when on a review comment, the `gh_comment` action will now do a reply instead of a top-level comment. Fixes [#2410](https://github.com/folke/snacks.nvim/issues/2410) ([a4f2b9d](https://github.com/folke/snacks.nvim/commit/a4f2b9da2d0dd73e127459fb372e0eb695d70cb2))
* **gh:** you can now use `Snacks.picker.gh_actions()` directly to see actions for the checked out PR ([d0d10f6](https://github.com/folke/snacks.nvim/commit/d0d10f6d13a4285a83ccf225d2a8938152efcef8))
* **picker.diff:** new fancy diff renderer ([22eea90](https://github.com/folke/snacks.nvim/commit/22eea90a9548e692c80a20740934720e6d095be1))
* **picker.git_diff:** show proper git status for git diff files ([ab48eeb](https://github.com/folke/snacks.nvim/commit/ab48eebeb37cc149907d13c904008712a858212b))
* **picker.git_diff:** show renames ([77609a0](https://github.com/folke/snacks.nvim/commit/77609a00133cf56b69a7fee9b677a1f0c877e37b))
* **picker.lsp_config:** added server/dynamic capabilities to preview ([da14fac](https://github.com/folke/snacks.nvim/commit/da14fac1e54dc0022b9ba724a50ae93e43f5f271))
* **picker:** consolidate all diff options under `opts.previewers.diff`. Default style is `fancy` ([b65b06c](https://github.com/folke/snacks.nvim/commit/b65b06ca0ec7ea4730a7a06e71edbc9c1aa32980))
* **zen:** added `center` option that defaults to `true` for zen mode and `false` for zoom mode. Closes [#2422](https://github.com/folke/snacks.nvim/issues/2422) ([3c2d791](https://github.com/folke/snacks.nvim/commit/3c2d79162f8174d5e1c33539a72025a25f4af590))
### Bug Fixes
* **dashboard:** start job after the terminal window is shown to make sure it has the correct size. Closes [#2421](https://github.com/folke/snacks.nvim/issues/2421) ([e440df3](https://github.com/folke/snacks.nvim/commit/e440df387d448a2ec332442a0eca6ece685f2b4d))
* **diff:** fallback if `Normal` has no fg color. Closes [#2436](https://github.com/folke/snacks.nvim/issues/2436) ([7f453c4](https://github.com/folke/snacks.nvim/commit/7f453c4f322ea2664655cc78c70ff4a9b6238c75))
* **diff:** improved diff parsing. Closes [#2424](https://github.com/folke/snacks.nvim/issues/2424). Closes [#2420](https://github.com/folke/snacks.nvim/issues/2420) ([b6e4eb7](https://github.com/folke/snacks.nvim/commit/b6e4eb7e608924a0d116bb01dabb575365bcfd75))
* **diff:** remove diff injections. Closes [#2406](https://github.com/folke/snacks.nvim/issues/2406) ([ecc21bb](https://github.com/folke/snacks.nvim/commit/ecc21bbb9b6969b039676ad7f5d34df5974b1580))
* **gh.api:** get repo from upstream remote if availble. fallback to origin ([5043637](https://github.com/folke/snacks.nvim/commit/50436373c277906cf40e47380f3dc1bd7769a885))
* **gh.api:** pass repo to cmd. Closes [#2415](https://github.com/folke/snacks.nvim/issues/2415) ([78046eb](https://github.com/folke/snacks.nvim/commit/78046eb4817e30e216d2456c84005d5264aad67f))
* **gh.diff:** fixed rendering of diff header when wrap=true ([07c569d](https://github.com/folke/snacks.nvim/commit/07c569dfd5f869dbe23d32d7ce1a7547a6abe69a))
* **gh.item:** better method to extract repo from gh url. Closes [#2418](https://github.com/folke/snacks.nvim/issues/2418) ([52d544c](https://github.com/folke/snacks.nvim/commit/52d544cc64da4e9cae4f3df5adf7a777b2ed0217))
* **gh.render:** added support for older `StatusContext` checks. Closes [#2407](https://github.com/folke/snacks.nvim/issues/2407) ([74864a7](https://github.com/folke/snacks.nvim/commit/74864a7bb8390684a5132e4025a77a1de92865e8))
* **gh.render:** use check name. See [#2407](https://github.com/folke/snacks.nvim/issues/2407) ([6f60105](https://github.com/folke/snacks.nvim/commit/6f60105302fcae45524a5b6232beb52829e93e3f))
* **gh:** better way of determining current PR ([bd3c1a0](https://github.com/folke/snacks.nvim/commit/bd3c1a071483c943ce98723ef7ac79fda0c7ee16))
* **gh:** input for api should be a table, not a string. Closes [#2427](https://github.com/folke/snacks.nvim/issues/2427) ([1b3e409](https://github.com/folke/snacks.nvim/commit/1b3e4090a01331ef632ce904d364daf2b811bf54))
* **image:** allow to fully disable all image rendering with `opts.image.enabled = false`. Closes [#2404](https://github.com/folke/snacks.nvim/issues/2404) ([34a6591](https://github.com/folke/snacks.nvim/commit/34a6591a616836d727140afcd9896981c64281e0))
* **image:** disable image conversion error notifications by default ([cfcf525](https://github.com/folke/snacks.nvim/commit/cfcf52520765fb18113d89b970bd26a6aa6f543b))
* **lsp:** check lsp handlers after LspAttach, since attached_buffers won't have been set ([1861b0a](https://github.com/folke/snacks.nvim/commit/1861b0a8eaee849fb8ed67a6764ef5021196bb58))
* **picker.actions:** only allow stage/unstage/restore for some diffs ([9cde35b](https://github.com/folke/snacks.nvim/commit/9cde35b7b16244fee5c6f73749523e95e4a2b432))
* **picker.diff:** move git status calc based on diff to format ([b553c18](https://github.com/folke/snacks.nvim/commit/b553c18c263b156f12bfc2a80124cf8edfa04dd3))
* **picker.diff:** parse full diff including diff and hunk headers. Closes [#2429](https://github.com/folke/snacks.nvim/issues/2429) ([53d8012](https://github.com/folke/snacks.nvim/commit/53d8012e5e4b2115ade2c15d040223ef97ffb05c))
* **picker.git_diff:** don't show git status, disable stage/unstage/restore when merge-base is set. Closes [#2397](https://github.com/folke/snacks.nvim/issues/2397) ([6ff82ca](https://github.com/folke/snacks.nvim/commit/6ff82cab7bd413bfe30cf1b1856729a59392c405))
* **picker.highlight:** resolve all text chunks when needed. Not just the first. ([962aadd](https://github.com/folke/snacks.nvim/commit/962aadd3103496c7d2a02cc358a13f773f03a059))
* **picker.undo:** cleanup tmp files in `async:on("done")`. Closes [#2434](https://github.com/folke/snacks.nvim/issues/2434) ([3038dac](https://github.com/folke/snacks.nvim/commit/3038dac46009a778881a7ca98287a6c1cba1d160))
* **picker.undo:** set initial target to the current undo entry. See [#2434](https://github.com/folke/snacks.nvim/issues/2434) ([dc245ef](https://github.com/folke/snacks.nvim/commit/dc245ef04e19b34510fa1edbe52abd61d28fea37))
* **picker:** don't focus a picker window when toggling a window and picker wasn't current. closes [#2417](https://github.com/folke/snacks.nvim/issues/2417) ([b80b330](https://github.com/folke/snacks.nvim/commit/b80b330091b488e8f41f9e5228d9c9acbe333f7b))
* revert rename of actions.lua to tomdar87@outlook.com ([#2423](https://github.com/folke/snacks.nvim/issues/2423)) ([8bb3ad6](https://github.com/folke/snacks.nvim/commit/8bb3ad6c53232b4c7f0cf430ef3df1bef69fd6ee))
* **win:** fixed fixbuf. Closes [#2409](https://github.com/folke/snacks.nvim/issues/2409) ([2099572](https://github.com/folke/snacks.nvim/commit/2099572fe8b7296ecda13e20b553e9cd873cf165))
## [2.28.0](https://github.com/folke/snacks.nvim/compare/v2.27.0...v2.28.0) (2025-11-01)
### Features
* **gh:** new `gh` (GitHub cli) integration ([85b8ec2](https://github.com/folke/snacks.nvim/commit/85b8ec210975aa137af4b7bef1fb7b7098be331a))
* **image:** when opts.conceal, conceal remainig lines that are not covered by the image. See [#2391](https://github.com/folke/snacks.nvim/issues/2391) ([404027c](https://github.com/folke/snacks.nvim/commit/404027c973c0a54a369931d36263996a34162ab5))
* **picker.buffers:** add filetype/buftype to search text ([a249c86](https://github.com/folke/snacks.nvim/commit/a249c86cf1ed3b8434bc004af3a865997706c22f))
* **picker.buffers:** added buftype and filetype for scratch buffers ([6a13271](https://github.com/folke/snacks.nvim/commit/6a132716af145a109800a129300e43104789b5c0))
* **picker.diff:** moved git_diff finder to separate file so it can be re-used + made it more robust. Closes [#2366](https://github.com/folke/snacks.nvim/issues/2366) ([3049ad8](https://github.com/folke/snacks.nvim/commit/3049ad8beba417924b2d4ff8f77edec53d3472f6))
* **picker.diff:** native diff now also highlights the language of the diffed code in the diff ([7260957](https://github.com/folke/snacks.nvim/commit/726095723d0ceae2ffeedf722620238491aeaa30))
* **picker.git_diff:** `git_diff` now also shows staged hunks and added stage/unstage/restore actions for hunks. Closes [#2382](https://github.com/folke/snacks.nvim/issues/2382) ([1fb3f4d](https://github.com/folke/snacks.nvim/commit/1fb3f4de49962a80cb88a9b143bc165042c72165))
* **picker.git_diff:** added `staged` flag ([118648c](https://github.com/folke/snacks.nvim/commit/118648ce93b9fc3a4493783fe3efce60fcdb59a3))
* **picker.highlights:** badges ([202e595](https://github.com/folke/snacks.nvim/commit/202e595e553b8c5865c080cc375381e6b096804c))
* **picker.preview:** allow items to define a title used in the preview window ([4b572f4](https://github.com/folke/snacks.nvim/commit/4b572f4785df68b60234996f03b91d4581a8ad47))
* **picker.preview:** support for images and render markdown ([9585da6](https://github.com/folke/snacks.nvim/commit/9585da6c57ed4e06c52a84d680d6b700cab42d6c))
* **picker.util:** cmdline parser used to properly parse diff args ([5025989](https://github.com/folke/snacks.nvim/commit/502598953fa70cd4507ba39f3e9b4babd7e4df9d))
* **picker:** better integration with markview and render-markdown when previewing ([4708e9a](https://github.com/folke/snacks.nvim/commit/4708e9a38657e71b2743a35a4530d0118c21d4fe))
* **scratch:** store scratch info in meta files, instead of the filename + custom filekeys ([85f8e22](https://github.com/folke/snacks.nvim/commit/85f8e22281bee237d5e29746019ec21b1624925c))
* **util.spawn:** `Proc:json()` ([5589c9d](https://github.com/folke/snacks.nvim/commit/5589c9d355606a026001fe589bc0329077951f45))
* **util:** `Snacks.util.stop()` to safely stop/close a luv handle ([ce9e299](https://github.com/folke/snacks.nvim/commit/ce9e2993dd4d8289cfdbc129efed74a3394841b9))
### Bug Fixes
* **explorer.tree:** only strip trasiling forward slashes if not at root. Closes [#2375](https://github.com/folke/snacks.nvim/issues/2375) ([72dc621](https://github.com/folke/snacks.nvim/commit/72dc6213f758da8484094cb975bfdfc2f8f61621))
* **explorer:** differentiate if file or folder when deleting on Windows ([#2373](https://github.com/folke/snacks.nvim/issues/2373)) ([59c5545](https://github.com/folke/snacks.nvim/commit/59c5545e91878c1f6218b032a881832bc98a46f3))
* **explorer:** do reveal in on_show if explorer is not open yet. Closes [#2388](https://github.com/folke/snacks.nvim/issues/2388) ([ba529d4](https://github.com/folke/snacks.nvim/commit/ba529d4f5d409639e082aff916c9b8e71b480531))
* **explorer:** schedule `on_find` (typically reveal), for both files finder and when git status updates the finder. Closes [#2388](https://github.com/folke/snacks.nvim/issues/2388) ([a9b57b2](https://github.com/folke/snacks.nvim/commit/a9b57b2a7ee0642f5c5c2c3f39d7e57fadafa1af))
* **gh:** add action idx to `gh_actions` text ([d94184d](https://github.com/folke/snacks.nvim/commit/d94184d1d91a9b8794931538da8f9c76871b3265))
* **image.inline:** off-by-one for finding visible images at the last line of the buffer ([04b3a54](https://github.com/folke/snacks.nvim/commit/04b3a54576757215a02d306e47b7fb9a542c37b2))
* **image:** avoid nested math environments ([#2345](https://github.com/folke/snacks.nvim/issues/2345)) ([66e3dc4](https://github.com/folke/snacks.nvim/commit/66e3dc46190992048b571e1225b5a5c2712d2ec6))
* **image:** check for invalid buffer ([9ad4178](https://github.com/folke/snacks.nvim/commit/9ad41782eced6a06034e568357cdad35cbf52ffa))
* **image:** check to update on BufWinEnter and attach to buffer changes ([e18e4f6](https://github.com/folke/snacks.nvim/commit/e18e4f6452c62035289d28156dbd0966af13a046))
* **image:** don't add placements to concealed lines. Closes [#2391](https://github.com/folke/snacks.nvim/issues/2391) ([13963b1](https://github.com/folke/snacks.nvim/commit/13963b1ec41c21aa81698ed042bb48124325f61d))
* **image:** guard against invalid buffers. Closes [#2383](https://github.com/folke/snacks.nvim/issues/2383) ([4bb1ce1](https://github.com/folke/snacks.nvim/commit/4bb1ce16ed2882978e9524ad057cfa892a226887))
* keymap docs ([583a0c1](https://github.com/folke/snacks.nvim/commit/583a0c1c06865b4cf64e1104c5250516f5cc6d31))
* **keymap:** make sure opts are a table. Closes [#2392](https://github.com/folke/snacks.nvim/issues/2392) ([367d1bd](https://github.com/folke/snacks.nvim/commit/367d1bd385fd43fe40defd0a901c8597e5aee1ec))
* **layout:** only max zindex for snacks windows/layouts ([8eddc0b](https://github.com/folke/snacks.nvim/commit/8eddc0b3809b5af68bb0fc14dcf6c7a1854133cf))
* **picker.actions:** `drop` and `tabdrop` should never reload existing buffers ([#2368](https://github.com/folke/snacks.nvim/issues/2368)) ([6cf2fee](https://github.com/folke/snacks.nvim/commit/6cf2fee619e81e519ad900542b38ed3491dc45de))
* **picker.actions:** use `buffer!` instead of `buffer` for edit. Closes [#2378](https://github.com/folke/snacks.nvim/issues/2378) ([2a1a001](https://github.com/folke/snacks.nvim/commit/2a1a001d3a3ed66e39da353efbe37b4ab0a7db93))
* **picker.diff:** better filename parsing. See [#2366](https://github.com/folke/snacks.nvim/issues/2366) ([377f3bf](https://github.com/folke/snacks.nvim/commit/377f3bfeca716ada246720a7974c49aee56fd382))
* **picker.diff:** first line of header ([fb011c2](https://github.com/folke/snacks.nvim/commit/fb011c257f29cb7a5f4098f7a7e79ac76870761d))
* **picker.diff:** only process `---` diffs directly if it doesn't start with a diff header ([0a33aec](https://github.com/folke/snacks.nvim/commit/0a33aec0c62425031efc7867be5c466b83aa82cf))
* **picker.filter:** get cwd from active tabpage if available ([c1b517f](https://github.com/folke/snacks.nvim/commit/c1b517f545fffcf401217bd41202833ee6465f31))
* **picker.finder:** mutate existing opts ([c91e230](https://github.com/folke/snacks.nvim/commit/c91e23060c73432cb25f99d6ed632c22fce87d88))
* **picker.finder:** tmp fix for [#2386](https://github.com/folke/snacks.nvim/issues/2386) ([5eea5f9](https://github.com/folke/snacks.nvim/commit/5eea5f94280ef9034c7da8bbb5ec12dc71b6916f))
* **picker.git_branches:** git log preview. Closes [#2360](https://github.com/folke/snacks.nvim/issues/2360) ([597ebd4](https://github.com/folke/snacks.nvim/commit/597ebd411529a15b23cba1bc45b20db8f6adbbae))
* **picker.git_diff:** remove `--default-prefix`, since that's no longer needed. See [#2382](https://github.com/folke/snacks.nvim/issues/2382) ([40774ae](https://github.com/folke/snacks.nvim/commit/40774ae6cabd4b2b76705295338c2a6a71976b98))
* **picker.git_diff:** set `group=false` by default, since we also have `git_status` ([530e591](https://github.com/folke/snacks.nvim/commit/530e5913453d2501f79caf4d909c1932334bc9f6))
* **picker.highlights:** modifiable for set_lines ([98345fb](https://github.com/folke/snacks.nvim/commit/98345fb66753283ee4a091bb444df537e4012233))
* **picker.keymaps:** try to locate neovim compiled lua source files for keymaps ([76160be](https://github.com/folke/snacks.nvim/commit/76160be5d38cd67e46557cb5d0b3e36ececdfa3c))
* **picker.lsp:** fixed `vim.str_byteindex` capability check. Closes [#2389](https://github.com/folke/snacks.nvim/issues/2389) ([46917d0](https://github.com/folke/snacks.nvim/commit/46917d0629595281e7d2de3834af8fd95584befd))
* **picker.lsp:** some LSP servers notify completion before sending the actual result. See [#2372](https://github.com/folke/snacks.nvim/issues/2372) ([aa8a318](https://github.com/folke/snacks.nvim/commit/aa8a318779ca6b5f0bba2cf383ddf596db199c09))
* **picker.lsp:** use `LspRequest` to track completed and cancelled requests. Fixes [#2364](https://github.com/folke/snacks.nvim/issues/2364) ([8afb609](https://github.com/folke/snacks.nvim/commit/8afb609333026e1a3a27d57ada1cf849b2adbcc9))
* **picker.preview:** again. docgen seems broken ([758bbfa](https://github.com/folke/snacks.nvim/commit/758bbfa13a3c26d80069a9f621fcfd0f0dfc608e))
* **picker.preview:** don't show locations for diff preview ([b064488](https://github.com/folke/snacks.nvim/commit/b0644884ef3aa589df609c95565220da7eef5cce))
* **picker.preview:** fckup ([fd7795e](https://github.com/folke/snacks.nvim/commit/fd7795e9cd615d5262862c819b5058b42869406b))
* **picker.preview:** fix ([e2c1c52](https://github.com/folke/snacks.nvim/commit/e2c1c527e40aecd6d1ac011aef6d3c28a208a9ec))
* **picker.preview:** show proper preview message for deleted scratch buffers ([4ad8a41](https://github.com/folke/snacks.nvim/commit/4ad8a41eac2fb636e12a11e0129d6d2d10ffb60a))
* **picker.util:** better relative time format ([3e30fb6](https://github.com/folke/snacks.nvim/commit/3e30fb6c705c94cf29567cc6446bd9f9284c8c4d))
* **picker.util:** ignore errors from corrupted kv stores. Closes [#2394](https://github.com/folke/snacks.nvim/issues/2394) ([b3d01c5](https://github.com/folke/snacks.nvim/commit/b3d01c59ba4ab4183b12e9e10bc1fcbbef1b02be))
* **picker.watch:** check again for closed picker after schedule. See [#2365](https://github.com/folke/snacks.nvim/issues/2365) ([8ad80de](https://github.com/folke/snacks.nvim/commit/8ad80de67b68db773cd50599f93dfada85e00eae))
* **picker:** close picker when layout closes. Closes [#2365](https://github.com/folke/snacks.nvim/issues/2365) ([779746f](https://github.com/folke/snacks.nvim/commit/779746f9a82e3a925393557ead441a3d22606534))
* **picker:** dont watch files for closed pickers. Fixes [#2365](https://github.com/folke/snacks.nvim/issues/2365) ([c4ec8b6](https://github.com/folke/snacks.nvim/commit/c4ec8b6d12a9b671e65709ec64b9beb6969815c5))
* **picker:** increase default show_delay to 5s. Closes [#2364](https://github.com/folke/snacks.nvim/issues/2364) ([b3197e3](https://github.com/folke/snacks.nvim/commit/b3197e3a2a2cec8e090a74308b630a1f451a35f0))
* **picker:** only trim space in the title if it's preceded by a word like character (skips icons) ([2439c49](https://github.com/folke/snacks.nvim/commit/2439c493a5dbd9fd880bf70c7986ebafd6f0c9f6))
* **picker:** pause input progress info for 60ms to prevent flickering when finder is too fast ([ecde81f](https://github.com/folke/snacks.nvim/commit/ecde81fc0ce7c4834def0ce710dd5dc62b0822fc))
* **scratch:** make sure zindex of scratch window is higher than existing floating windows ([c8422da](https://github.com/folke/snacks.nvim/commit/c8422da50dee7d725e1a66a5dc6a930e6ac57625))
* **scroll:** only reset count when needed ([551d79f](https://github.com/folke/snacks.nvim/commit/551d79f1c0bd5400bcf00d2133832c20b1fb29f2))
* **util.job:** scroll to top when process exits ([b544157](https://github.com/folke/snacks.nvim/commit/b5441575e07af9f179cbeb8ea6d0b9951b28481a))
* **util.job:** stop on BufWipeout and BufDelete ([c956b37](https://github.com/folke/snacks.nvim/commit/c956b372467467dafb32713a95d3dbc22ae5c3bc))
* **util.job:** stop when attached buffer is no longer valid ([221d4b1](https://github.com/folke/snacks.nvim/commit/221d4b17475c36fd92b2e26baac5515f8260ef88))
* **util.job:** use nvim_win_set_cursor instead of `gg` ([5faed2f](https://github.com/folke/snacks.nvim/commit/5faed2f7abed7fb97aed0425b2b1b03fb6048fa9))
* **util.lsp:** `Snacks.util.lsp.on()` should trigger for each lsp client per buffer ([52f30a1](https://github.com/folke/snacks.nvim/commit/52f30a198a19bf5da6aa95cc642bfbb99b9bbfbf))
* **util:** color() should not create hl groups ([17033e6](https://github.com/folke/snacks.nvim/commit/17033e67ef1c42a2295e2921c201f1b404d625d8))
* **win:** ignore errors on destroy. Closes [#2381](https://github.com/folke/snacks.nvim/issues/2381) ([a8930bd](https://github.com/folke/snacks.nvim/commit/a8930bdb619024e8ba3e1fc7efc1bd8ea9a27a5a))
* **win:** scratch buffers were sometimes not deleted ([0387297](https://github.com/folke/snacks.nvim/commit/03872973b3326ab2caff2b10d983b4cb775944f0))
* **win:** when fixbuf triggers in a floating window, just close it. Closes [#2380](https://github.com/folke/snacks.nvim/issues/2380) ([de35242](https://github.com/folke/snacks.nvim/commit/de352425f7acd4dd1ed3ee06f9479129017da087))
### Performance Improvements
* **animate:** smoother animations ([b7a3fed](https://github.com/folke/snacks.nvim/commit/b7a3fed8d9822f448122af441018f66febbc50f4))
* **notifier:** stop trying to fit more notifs in the layout after skipping max 10 ([3a8ecf5](https://github.com/folke/snacks.nvim/commit/3a8ecf591263e4706d9b3a45da590df914ea5505))
* **picker.util:** cache badge hl groups ([cb85844](https://github.com/folke/snacks.nvim/commit/cb85844e8404a95c3ac0d509ec7cedd0f3d5375c))
* **scroll:** combine all scrolling commands in one command + restore vim.v.count ([0fbea13](https://github.com/folke/snacks.nvim/commit/0fbea13c9d5ba2887ad8c1ffb20d77e11174b390))
* **scroll:** smoother scrolling using new animations ([2221fe6](https://github.com/folke/snacks.nvim/commit/2221fe616657b9ed82bdea8566813939a7b25918))
* **statuscolumn:** only calculate components that are actually needed ([bb80317](https://github.com/folke/snacks.nvim/commit/bb803176478dc603c1a2d09ca717964c6a27bfae))
### Reverts
* jump `buffer` -> `buffer!`. See [#2378](https://github.com/folke/snacks.nvim/issues/2378) ([143e9b5](https://github.com/folke/snacks.nvim/commit/143e9b58c7b8301bdc36b1b8a03449078beb49d1))
## [2.27.0](https://github.com/folke/snacks.nvim/compare/v2.26.0...v2.27.0) (2025-10-26)
### Features
* **keymap:** added new `enabled` option ([b0f21fa](https://github.com/folke/snacks.nvim/commit/b0f21fa745953ac6bb096a4811cb32e42d7ca714))
* **picker.proc:** finder to process json ([5294c4f](https://github.com/folke/snacks.nvim/commit/5294c4f39ed9bdc0f2c483885d9a1834a4df4d21))
* **util.job:** simple wrapper around jobstart to work with terminals (used in dashboards and pickers) ([de05631](https://github.com/folke/snacks.nvim/commit/de05631e6a656a88d1eebf078c44e5e4b9747742))
* **util.lsp:** added overload for `Snacks.util.lsp.on(cb)` ([f33aa20](https://github.com/folke/snacks.nvim/commit/f33aa2017a2671fb4a0e71316f385c8010c8b81b))
### Bug Fixes
* **dashboard:** don't add sleep in nushell. Closes [#1706](https://github.com/folke/snacks.nvim/issues/1706) ([44f71d2](https://github.com/folke/snacks.nvim/commit/44f71d2113866c0a6f16a8fa70af8933c1d87919))
* **explorer:** refresh git status on all tabs when needed. Closes [#2348](https://github.com/folke/snacks.nvim/issues/2348) ([1472211](https://github.com/folke/snacks.nvim/commit/1472211f9ccd171f69ec7f33764620dd935b5ccf))
* **explorer:** windows path fixes ([e1dc6b3](https://github.com/folke/snacks.nvim/commit/e1dc6b3bddd0d16d0faa5d6802a975f7a7165b2a))
## [2.26.0](https://github.com/folke/snacks.nvim/compare/v2.25.0...v2.26.0) (2025-10-25)
### Features
* **explorer:** add cross-platform trash support ([ed08ef1](https://github.com/folke/snacks.nvim/commit/ed08ef1a630508ebab098aa6e8814b89084f8c03))
* **keymap:** add filetype and LSP-aware keymap management ([0bf34af](https://github.com/folke/snacks.nvim/commit/0bf34afe34ee297430f23d2aba0b104c5379dc15))
* **util:** add LSP utility module with dynamic capability handlers ([7a63ba5](https://github.com/folke/snacks.nvim/commit/7a63ba5d374acaa7317833b6e03d2603e90e0983))
* **win:** add `SnacksWinSeparator` to default `win.wo.winhighlight` ([#2340](https://github.com/folke/snacks.nvim/issues/2340)) ([869709d](https://github.com/folke/snacks.nvim/commit/869709dd658b53ea5706f086f93a50e89a429a5d)), closes [#2336](https://github.com/folke/snacks.nvim/issues/2336)
* **win:** add default *Snacks* prefixed `WinSeparator` ([#2338](https://github.com/folke/snacks.nvim/issues/2338)) ([381265b](https://github.com/folke/snacks.nvim/commit/381265b5430c991f4343a2f4530bc2de37abac18)), closes [#2336](https://github.com/folke/snacks.nvim/issues/2336)
### Bug Fixes
* **dahboard:** do full terminal reset when receiving first output and displayed cached contents ([c952834](https://github.com/folke/snacks.nvim/commit/c9528341a6ef9dc9cb404b1c901b1276af331ccf))
* **dashboard:** don't write to closed terminal buffer ([f75eaf1](https://github.com/folke/snacks.nvim/commit/f75eaf1e18cea03605e626eca2a1b9c4345071d4))
* **dashboard:** work-around for jobstart+pty issue where not all output is processed before exit. Closes [#1706](https://github.com/folke/snacks.nvim/issues/1706) ([4d776bd](https://github.com/folke/snacks.nvim/commit/4d776bdd1d6d7998f2c7c7f08c2e964419eb74be))
* **explorer:** macos has `trash` pre-installed, so no need to try `osascript` and move to first. Closes [#2349](https://github.com/folke/snacks.nvim/issues/2349) ([d569072](https://github.com/folke/snacks.nvim/commit/d569072b2e39e0078b55ea56b133fb9a30d78bad))
* **image:** detach image when reloading image file. Closes [#2343](https://github.com/folke/snacks.nvim/issues/2343) ([7bf4175](https://github.com/folke/snacks.nvim/commit/7bf4175588a784bbf7463b68351833ed64f5c6cc))
* **image:** increase timeout for querying the terminal. Closes [#2344](https://github.com/folke/snacks.nvim/issues/2344) ([4122143](https://github.com/folke/snacks.nvim/commit/4122143240fb7f43b27dddec670b844404cb08db))
* **image:** let healthcheck wait till terminal detection is done ([b029511](https://github.com/folke/snacks.nvim/commit/b029511abb1359da28de45faeeec400f419d7ee7))
* **image:** only attach to a buffer once. Closes [#2343](https://github.com/folke/snacks.nvim/issues/2343) ([6f72643](https://github.com/folke/snacks.nvim/commit/6f726433232422d26157adfd0df3dd464341222b))
* **image:** work around tmux extended-keys breaking TermResponse. Closes [#2332](https://github.com/folke/snacks.nvim/issues/2332) ([e93dcfd](https://github.com/folke/snacks.nvim/commit/e93dcfdf394ef16732f06021d941146be912043c))
* **layout:** provide parent win width/height when relative to win ([#2346](https://github.com/folke/snacks.nvim/issues/2346)) ([602393a](https://github.com/folke/snacks.nvim/commit/602393aed2dd8059e74afff6712a423b6f048cfe))
* **picker:** fix race condition causing "Finder yielded after done" error. Closes [#2327](https://github.com/folke/snacks.nvim/issues/2327) ([c9ccbe5](https://github.com/folke/snacks.nvim/commit/c9ccbe56179f1d4adb06fea47f4eea0c57736c2d))
* **picker:** set min file width to 40 ([69417ac](https://github.com/folke/snacks.nvim/commit/69417ac68152bc08d0ea0640e211f2a3eb48bac6))
* **win:** use `sbuffer` instead of `split` for split windows ([bbd6d42](https://github.com/folke/snacks.nvim/commit/bbd6d42a9738c3a4c7c35f5ebde91a5ede8bec3a))
### Performance Improvements
* **picker:** don't use treesitter string parser, since a change in nightly creates thousands of unlisted buffers in that case ([ad6c0a5](https://github.com/folke/snacks.nvim/commit/ad6c0a5e542b6b47b4ac5e2ebcbdd663b8a7e908))
* **picker:** re-use existing string parsers per language to prevent needing to create new parsers ([efa304a](https://github.com/folke/snacks.nvim/commit/efa304a078993198e6fa088845fe8925708abb4e))
## [2.25.0](https://github.com/folke/snacks.nvim/compare/v2.24.0...v2.25.0) (2025-10-23)
### Features
* **notifier:** added `gap` option. Closes [#2331](https://github.com/folke/snacks.nvim/issues/2331) ([b1acbb0](https://github.com/folke/snacks.nvim/commit/b1acbb0fcce9ed1ead3fd511eb934eeefe238b69))
* **select:** allow configuring options for specific vim.ui.select kinds ([bca5b05](https://github.com/folke/snacks.nvim/commit/bca5b058388fb381f6d04c3624a541f7c0637382))
* **snacks:** added `Snacks.version`. auto updated by the release workflow ([a283beb](https://github.com/folke/snacks.nvim/commit/a283beb6dc94f7a17c48dcb6878e0dd3493bf370))
### Bug Fixes
* **dashboard:** fix issue with opening file at location due to splitkeep and restoring laststatus/showtabline ([1a2b34d](https://github.com/folke/snacks.nvim/commit/1a2b34dffd524b0f7373c5868dbb7597360e1a8c))
* **scroll:** stop animations when buf/changedtick changes ([a42b376](https://github.com/folke/snacks.nvim/commit/a42b3761f702e770d745709682dfe3d7e3ef1bb6))
## [2.24.0](https://github.com/folke/snacks.nvim/compare/v2.23.0...v2.24.0) (2025-10-23)
### Features
* **bigfile:** disable mini-hipatterns ([#2170](https://github.com/folke/snacks.nvim/issues/2170)) ([3d4dd13](https://github.com/folke/snacks.nvim/commit/3d4dd13d2e7e33b81ffda9baa58f8852e4ca84f6))
* **dashboard:** optional `filter` for projects. Closes [#798](https://github.com/folke/snacks.nvim/issues/798) ([fe88a07](https://github.com/folke/snacks.nvim/commit/fe88a07d5337e21317ab1a7613add6c364bb9eae))
* **debug:** allow debug evaluation of block selections ([#1331](https://github.com/folke/snacks.nvim/issues/1331)) ([231ffae](https://github.com/folke/snacks.nvim/commit/231ffae08d956039899fb56000a6e03a99819905))
* **git:** allow configuring extra git args and git cmd args for all git sources. See [#2178](https://github.com/folke/snacks.nvim/issues/2178) ([5782b5c](https://github.com/folke/snacks.nvim/commit/5782b5cda0a2dcc032ec16cbdd6e39fb2baedaa6))
* **image:** add icns support ([#2120](https://github.com/folke/snacks.nvim/issues/2120)) ([9df47bc](https://github.com/folke/snacks.nvim/commit/9df47bce6a3b752831b4970c26a8886b2843e9bb))
* **image:** added clear fun. Closes [#1394](https://github.com/folke/snacks.nvim/issues/1394) ([30687d1](https://github.com/folke/snacks.nvim/commit/30687d195b060e1857cbf905b672af6e48dacc2a))
* **image:** added support for base64 encoded images in url. Closes [#2304](https://github.com/folke/snacks.nvim/issues/2304) ([2c56e10](https://github.com/folke/snacks.nvim/commit/2c56e10b1dd69dcebf4d0915af396dd0bd7123a6))
* **image:** allow specifying a page number for inlined pdfs ([#1806](https://github.com/folke/snacks.nvim/issues/1806)) ([3f0fe34](https://github.com/folke/snacks.nvim/commit/3f0fe34308b06e66c8ce1ce07f0b18a4d9525bdc))
* **indent:** pass win to filter func. Closes [#2307](https://github.com/folke/snacks.nvim/issues/2307) ([8116e0b](https://github.com/folke/snacks.nvim/commit/8116e0b380701a3b1deafe8d14416be6ee403f6f))
* **input:** added support for a custom highlight functions. Closes [#2216](https://github.com/folke/snacks.nvim/issues/2216) ([9b80137](https://github.com/folke/snacks.nvim/commit/9b80137aced62886de5e1399eb6e4000e57683de))
* **layout:** height=0.7 for preview in vscode layout ([c3d6c01](https://github.com/folke/snacks.nvim/commit/c3d6c019165e55d704f2596562dd310c7b0a8a10))
* **layout:** static (non-flex) layouts now shrink the root box to fit the contents. See [#2035](https://github.com/folke/snacks.nvim/issues/2035) ([ba7845b](https://github.com/folke/snacks.nvim/commit/ba7845bb85a0cfad3c7c5f75b3bc05c68679a090))
* **picker.finder:** added assertions that finder is still running when receiving results ([a45503b](https://github.com/folke/snacks.nvim/commit/a45503b95752055e19186b75a4f9874cd39aa834))
* **picker.git_diff:** add `base` option to show diff against a merge base. Useful to see changes on a branch/PR ([7964f04](https://github.com/folke/snacks.nvim/commit/7964f040bf605b2a3e8d66d02c453469352e005e))
* **picker.git:** allow passing extra args to git log command for file renames ([#1964](https://github.com/folke/snacks.nvim/issues/1964)) ([2aee35d](https://github.com/folke/snacks.nvim/commit/2aee35d0591f80b4a186e0ad3c600cd05c3f2a4d))
* **picker.git:** use default previewer args in git_show ([#1736](https://github.com/folke/snacks.nvim/issues/1736)) ([f324f96](https://github.com/folke/snacks.nvim/commit/f324f96bea48727d4a5967d443c3c2314fe4af60))
* **picker.layout:** added `config` hook for resolved layouts. See [#2035](https://github.com/folke/snacks.nvim/issues/2035) ([722f9ea](https://github.com/folke/snacks.nvim/commit/722f9eac7c459364a37d81e6a8df92fe0ee9d6da))
* **picker.lsp_config:** added more info to lsp picker ([636be5c](https://github.com/folke/snacks.nvim/commit/636be5c3d1b35b2041123efcc5b2a86df0dc9f93))
* **picker.lsp:** added lsp_incoming_calls and lsp_outgoing_calls. Closes [#1843](https://github.com/folke/snacks.nvim/issues/1843) ([55d6670](https://github.com/folke/snacks.nvim/commit/55d6670a7eb2667d467489b5c6c6a2ed428cead2))
* **picker.lsp:** added option `keep_parents` to `lsp_symbols` (default `false`). See [#2083](https://github.com/folke/snacks.nvim/issues/2083). closes [#2266](https://github.com/folke/snacks.nvim/issues/2266) ([2b9d522](https://github.com/folke/snacks.nvim/commit/2b9d52258d83361479b5a4a6fca6845c58e08050))
* **picker.projects:** make max_depth customizable ([#2253](https://github.com/folke/snacks.nvim/issues/2253)) ([3e9e2e2](https://github.com/folke/snacks.nvim/commit/3e9e2e2d71cb869467072bfd6864aa5179f8749c))
* **picker.scratch:** add scratch picker with grep, new and delete keybinds ([#1019](https://github.com/folke/snacks.nvim/issues/1019)) ([ca0f8b2](https://github.com/folke/snacks.nvim/commit/ca0f8b2c09a6b437479e7d12bdb209731d9eb621))
* **picker.select:** select now fits the list to the items independent of the layout. Closes [#2035](https://github.com/folke/snacks.nvim/issues/2035) ([5c63614](https://github.com/folke/snacks.nvim/commit/5c63614880f6a1c911cd2e0cf9291bcea7612950))
* **picker:** add author field to git log ([#2295](https://github.com/folke/snacks.nvim/issues/2295)) ([2cf864a](https://github.com/folke/snacks.nvim/commit/2cf864aaa1bc31a4d030a52fe03ebac3e65be65d))
* **picker:** add exact match position highlighting for grep results ([3b54c8d](https://github.com/folke/snacks.nvim/commit/3b54c8d3d1f0cd5b2698e343b218a01a42f4388f))
* **picker:** add git_restore action for git_status picker ([2b22fe7](https://github.com/folke/snacks.nvim/commit/2b22fe78614a001c51c0b4025236770817ac999e))
* **picker:** add toggle_regex for grep ([#1594](https://github.com/folke/snacks.nvim/issues/1594)) ([bd6ee23](https://github.com/folke/snacks.nvim/commit/bd6ee235463dc55c650396fae2ea02e32d4c1496))
* **picker:** added `Snacks.picker.tags()` a picker for ctags. Closes [#1728](https://github.com/folke/snacks.nvim/issues/1728) ([4290287](https://github.com/folke/snacks.nvim/commit/42902871f5ff95bd0b87790abdadb1eb10a42fd1))
* **picker:** added custom options to `vim.ui.select` that snacks can use for a better select ([264cab1](https://github.com/folke/snacks.nvim/commit/264cab138039412a151b21fdc30d4928f50d79b4))
* **picker:** added live support to `git_log`, which uses `-S` (pickaxe) to search. Closes [#1544](https://github.com/folke/snacks.nvim/issues/1544) ([c9fa6f7](https://github.com/folke/snacks.nvim/commit/c9fa6f7b0724587d4c4974817aad96d93f469437))
* **picker:** allow configuring pathspec for git grep ([#2311](https://github.com/folke/snacks.nvim/issues/2311)) ([57fbda7](https://github.com/folke/snacks.nvim/commit/57fbda70d66d808c10974448d4003f567b78e784))
* **picker:** also ignore dot bare git files ([#2058](https://github.com/folke/snacks.nvim/issues/2058)) ([4bb0dae](https://github.com/folke/snacks.nvim/commit/4bb0dae95d1ecc10daf50fd490deaf9a28b26f1c))
* **picker:** enhanced resume with multi-state support and flexible API ([bc6c446](https://github.com/folke/snacks.nvim/commit/bc6c446c11a92bc5b6d5a960bcf3488c519c647a))
* **picker:** flexible filename format ([#2294](https://github.com/folke/snacks.nvim/issues/2294)) ([9ad5d53](https://github.com/folke/snacks.nvim/commit/9ad5d5374ac7cd24c79e99a4645add1960eb93fa))
* **picker:** mapped `<c-g>` to `print_cwd` in list. See [#2244](https://github.com/folke/snacks.nvim/issues/2244) ([faa6aba](https://github.com/folke/snacks.nvim/commit/faa6abacb40f2e02203f2baabc988e3564d63952))
* **picker:** Support rmagatti/autosession session manager ([#1825](https://github.com/folke/snacks.nvim/issues/1825)) ([fc06234](https://github.com/folke/snacks.nvim/commit/fc06234ce13b7e653e0a5947a266abf016dc163f))
* **picker:** updated Snacks.picker.lsp_config to work with `vim.lsp.config` ([292d46f](https://github.com/folke/snacks.nvim/commit/292d46f773af05aaea6a21f13fcc179adea95494))
* **picker:** when resuming a source that has nothing to resume, start a picker with the source instead ([db3c13c](https://github.com/folke/snacks.nvim/commit/db3c13c28e0e7231bc3a45cd0db0e6683fc6c2c5))
* **terminal:** minor improvements for user experience ([#2276](https://github.com/folke/snacks.nvim/issues/2276)) ([39b14c4](https://github.com/folke/snacks.nvim/commit/39b14c400653f320133b3f8c65cdb612e42f9ca1))
* **toggle:** allow notification customization via function ([#2247](https://github.com/folke/snacks.nvim/issues/2247)) ([3ccab97](https://github.com/folke/snacks.nvim/commit/3ccab9736b298c8a8ef13aca5e3e9e7dc64c73bd))
* **win:** added support for `vim.o.winborder`. Set win.border = true to use it ([b30523c](https://github.com/folke/snacks.nvim/commit/b30523c89fda32efe43e99fe71235d63c9a44a3b))
* **win:** all existing snacks windows for all plugins now honor `vim.o.winborder`. Defaults to `rounded` if not set. ([c1737d8](https://github.com/folke/snacks.nvim/commit/c1737d866ebddb8270e3bdce9ec6f425ff24fb48))
* **win:** generalize footer options for keys ([#363](https://github.com/folke/snacks.nvim/issues/363)) ([b8d1719](https://github.com/folke/snacks.nvim/commit/b8d17192b663305398df98930ac79b3c7612b809))
* **win:** make split window "stacking" configurable ([e46a094](https://github.com/folke/snacks.nvim/commit/e46a09427cfed62ea7f37039b76b2b2a13fddec8))
### Bug Fixes
* **bigfile:** bigfile doesn't work on windows. ([#1969](https://github.com/folke/snacks.nvim/issues/1969)) ([b4944ff](https://github.com/folke/snacks.nvim/commit/b4944ff320ca23ba10a7498da4dfe13e8065395e)), closes [#1722](https://github.com/folke/snacks.nvim/issues/1722)
* **bufdelete:** try alternate buffer first and otherwise last used buffer ([914c900](https://github.com/folke/snacks.nvim/commit/914c9004be843c96b43fd86a1010c00dc147e5b4))
* **dashboard:** fix path filtering for `recent_files` with `cwd` option ([#2201](https://github.com/folke/snacks.nvim/issues/2201)) ([057d4ab](https://github.com/folke/snacks.nvim/commit/057d4ab80e42d76ae0d24d0582d27cf3630c0ec1))
* **dashboard:** oldfiles filter should return a boolean instead of the result of find. Fixes [#2283](https://github.com/folke/snacks.nvim/issues/2283) ([fcd309f](https://github.com/folke/snacks.nvim/commit/fcd309f9ea8529d5128474720ecf275bd8ee4ce5))
* **dashboard:** pcall chansend for dashoard terminal widgets ([dc65ffd](https://github.com/folke/snacks.nvim/commit/dc65ffd4f591fd68f1433e4bd815af832ed737b8))
* **dashboard:** recent cwd filter matching ([5c4365e](https://github.com/folke/snacks.nvim/commit/5c4365e99398fc67f0b4379d6e4a4b581bc3f485))
* **dashboard:** recent_files section not displaying files without cwd parameter ([#2284](https://github.com/folke/snacks.nvim/issues/2284)) ([1ed737e](https://github.com/folke/snacks.nvim/commit/1ed737e46502ed2e47dd9cc9825d881ae9844b7f))
* **dashboard:** replace deprecated AutoSession command ([#2288](https://github.com/folke/snacks.nvim/issues/2288)) ([e9228d6](https://github.com/folke/snacks.nvim/commit/e9228d6b2f64631b49619466ebdd75c0da37e1f8))
* **dashboard:** restore showtabline/laststatus when entering another non-float window. Closes [#1774](https://github.com/folke/snacks.nvim/issues/1774) ([cc69a93](https://github.com/folke/snacks.nvim/commit/cc69a9304bfdd047b7ea9ffa879985c351c6327b))
* **dashboard:** set `border = "none"` on `terminal` sections ([#1643](https://github.com/folke/snacks.nvim/issues/1643)) ([83f364f](https://github.com/folke/snacks.nvim/commit/83f364f8334801d163ecc02c717dd8ee1e07ad53))
* **dashboard:** update cursor on loading the dashboard. Closes [#2004](https://github.com/folke/snacks.nvim/issues/2004) ([29682a0](https://github.com/folke/snacks.nvim/commit/29682a0a724cb81a109f70bf0cbadb0cf6bcc630))
* **dashboard:** use fqn for icon. Closes [#1496](https://github.com/folke/snacks.nvim/issues/1496) ([24e92e0](https://github.com/folke/snacks.nvim/commit/24e92e0c947f6a22e6b131d405549c607dc9f5f0))
* **dim:** fixed the issue of dim's scope variable being nil and outputting… ([#1938](https://github.com/folke/snacks.nvim/issues/1938)) ([943a3c7](https://github.com/folke/snacks.nvim/commit/943a3c7d4a97950900fdc16784f3d11f3ca574ea))
* **explorer.git:** don't propagate deletes to parent dirs that don't exist ([835c4cb](https://github.com/folke/snacks.nvim/commit/835c4cbfc6043a3abab8c8f01cd67e368a90cd93))
* **explorer.watch:** handle systems where fs_event doesn't return file names. Closes [#2190](https://github.com/folke/snacks.nvim/issues/2190). Closes [#2032](https://github.com/folke/snacks.nvim/issues/2032) ([d6e34b1](https://github.com/folke/snacks.nvim/commit/d6e34b158d892cd774b36503cbd3a9e62c7951e3))
* **explorer:** mounted directories being detected as non-directories in Tree:expand ([#2053](https://github.com/folke/snacks.nvim/issues/2053)) ([7a5eb10](https://github.com/folke/snacks.nvim/commit/7a5eb1036a313db1880e2e11f42aa6a1c20f1a23))
* **explorer:** reset main when entering another window. Closes [#1587](https://github.com/folke/snacks.nvim/issues/1587) ([a5d45d5](https://github.com/folke/snacks.nvim/commit/a5d45d543e1c506fb0d49ac569c2a0ce5403ac37))
* **git:** always check parents for git root to fix an issue with git submodules. Closes [#2143](https://github.com/folke/snacks.nvim/issues/2143) ([14dd362](https://github.com/folke/snacks.nvim/commit/14dd362d5dd500806c2f5357f4afd8145a268a01))
* **gitbrowse:** fixed urls for gitlab ([#2073](https://github.com/folke/snacks.nvim/issues/2073)) ([9ebf052](https://github.com/folke/snacks.nvim/commit/9ebf052feff78411c2f68bfa94d0a17cbf1e6d85))
* **gitbrowse:** send commit as a opt when calling gitbrowse ([#2289](https://github.com/folke/snacks.nvim/issues/2289)) ([a466429](https://github.com/folke/snacks.nvim/commit/a4664298ba6669ec14f704b9602339f448bd45c9))
* **git:** set `diff.noprefix=false` for `git diff` to ensure correct format ([#2174](https://github.com/folke/snacks.nvim/issues/2174)) ([93f43ca](https://github.com/folke/snacks.nvim/commit/93f43ca10f77e7b22f1e58cbeba6d7e3e8b04d9f))
* **image.terminal:** do only terminal detection for now. Closes [#2323](https://github.com/folke/snacks.nvim/issues/2323) ([6c7ddae](https://github.com/folke/snacks.nvim/commit/6c7ddae887ca6f0776eb46b57c6f78f25ddf0238))
* **image:** correct off by one issue in render fallback ([#1560](https://github.com/folke/snacks.nvim/issues/1560)) ([441bdcd](https://github.com/folke/snacks.nvim/commit/441bdcd2103bb43f3275f4aca6d76d93fd1aaa92))
* **image:** correct render fallback to handle "editor" relative position ([#2296](https://github.com/folke/snacks.nvim/issues/2296)) ([c552cea](https://github.com/folke/snacks.nvim/commit/c552cea13199e518c167c8815156ae9c01577b27))
* **image:** correct render fallback to handle "editor" relative position ([#2297](https://github.com/folke/snacks.nvim/issues/2297)) ([1c3f15c](https://github.com/folke/snacks.nvim/commit/1c3f15cb54c0ee12b8cd4fd59a8ddc5ebe1fdd3c))
* **image:** detect kitty image protocol through terminal capability request. Closes [#1695](https://github.com/folke/snacks.nvim/issues/1695) ([43261ba](https://github.com/folke/snacks.nvim/commit/43261baf87fdc5f970c12e9a6c795ba8a4e7595c))
* **image:** do not save remote image if fetch fails ([#1915](https://github.com/folke/snacks.nvim/issues/1915)) ([cb6bf05](https://github.com/folke/snacks.nvim/commit/cb6bf052daa11c287d0d8fa8f168190eb40c0c8d))
* **image:** ENOENT on preview ([#2301](https://github.com/folke/snacks.nvim/issues/2301)) ([5173e96](https://github.com/folke/snacks.nvim/commit/5173e96f3359121233e817c12307d531a8622e4f))
* **image:** hover close in insert mode ([#2215](https://github.com/folke/snacks.nvim/issues/2215)) ([ef59af0](https://github.com/folke/snacks.nvim/commit/ef59af0ffc1289602a0792ee03724d4e36a0a229))
* **image:** markdown inline link query for shortened urls ([#1481](https://github.com/folke/snacks.nvim/issues/1481)) ([2daa1b2](https://github.com/folke/snacks.nvim/commit/2daa1b28b2151f3add39863de4df245a5140badf))
* **image:** set winblend=0 for floatwin when use unicode placeholders ([#1615](https://github.com/folke/snacks.nvim/issues/1615)) ([758e64c](https://github.com/folke/snacks.nvim/commit/758e64c18fc5934244ab48be8d17b90fa36ad16e))
* **image:** skip `\usepackage` in comments and body ([#2325](https://github.com/folke/snacks.nvim/issues/2325)) ([90227af](https://github.com/folke/snacks.nvim/commit/90227af4977504ae2d4294fe76a63117dfd18498))
* **image:** work-around for sha256 not allowed to be a Blob ([92a08ce](https://github.com/folke/snacks.nvim/commit/92a08cece72aeb67cf2a527991cbffdab093db5e))
* **indent:** check that win is valid in step. Closes [#1943](https://github.com/folke/snacks.nvim/issues/1943) ([e409f31](https://github.com/folke/snacks.nvim/commit/e409f31cc968f90139ad66941827b42ef95de7fd))
* **indent:** nil check before setting extmark ([#1635](https://github.com/folke/snacks.nvim/issues/1635)) ([02bf7d2](https://github.com/folke/snacks.nvim/commit/02bf7d2205ea7a4b903fa5266668f9fc7768f6c9))
* **input:** schedule stopinsert. Fixes [#1841](https://github.com/folke/snacks.nvim/issues/1841) ([ad6cbc8](https://github.com/folke/snacks.nvim/commit/ad6cbc8d5d4b49c8030083c1f55fc7c3679f3ac4))
* **input:** zindex ([67d690d](https://github.com/folke/snacks.nvim/commit/67d690d3625ff2899a7505a418bda91cc59042f7))
* **input:** zindex. Closes [#2302](https://github.com/folke/snacks.nvim/issues/2302) ([d491236](https://github.com/folke/snacks.nvim/commit/d49123694157597e64c284e5bd541cdd31538ba8))
* **layout:** allocate at least 1 cell for a widget and enlarge/shrink the root box when needed. Closes [#2261](https://github.com/folke/snacks.nvim/issues/2261) ([71d6d3c](https://github.com/folke/snacks.nvim/commit/71d6d3cad4cb842e4053f7bb39894144ee0dc81b))
* **layout:** allow width/height to be a function. Closes [#2184](https://github.com/folke/snacks.nvim/issues/2184) ([c757d4d](https://github.com/folke/snacks.nvim/commit/c757d4dc28c5baedaab44a59545760d905d87b20))
* **lazygit:** allow extensible user args ([#789](https://github.com/folke/snacks.nvim/issues/789)) ([da655a3](https://github.com/folke/snacks.nvim/commit/da655a353849bccb73d66dbb3caa9c238e7b0cae))
* **lazygit:** check if default config file exists before adding to LG_CONFIG_FILE ([#2256](https://github.com/folke/snacks.nvim/issues/2256)) ([3731644](https://github.com/folke/snacks.nvim/commit/3731644e38fe494399e75dc893215d1a801654ff))
* **main:** get correct winid for prev window ([db399b1](https://github.com/folke/snacks.nvim/commit/db399b1332848477b0cd881faabe95a0efddf1c6))
* **notifier:** include icon in padding in minimal style ([#2239](https://github.com/folke/snacks.nvim/issues/2239)) ([6daef52](https://github.com/folke/snacks.nvim/commit/6daef528c1422b33b2f2f713822602f9d66a5d51))
* **notifier:** keep filtered notifications in history ([#2209](https://github.com/folke/snacks.nvim/issues/2209)) ([ac61546](https://github.com/folke/snacks.nvim/commit/ac6154688baa79ec099fd662365fccf1a2feefd1))
* **picker.actions:** `<c-g>` in list view now prints file path instead of cwd. Fallback to cwd ([0b0a58a](https://github.com/folke/snacks.nvim/commit/0b0a58ae4aa643e66ff2b87ce5087857bcab1756))
* **picker.actions:** ensure the current window is updated after tabdrop ([#2326](https://github.com/folke/snacks.nvim/issues/2326)) ([b30121b](https://github.com/folke/snacks.nvim/commit/b30121bfce84fdcbe53cb724c97388cbe4e18980))
* **picker.actions:** multi-action descriptions. Fixes [#1501](https://github.com/folke/snacks.nvim/issues/1501) ([4edf207](https://github.com/folke/snacks.nvim/commit/4edf207bfeef70e3062a604825766c81d8809359))
* **picker.actions:** take into account if source is `recent` explicitly ([#1920](https://github.com/folke/snacks.nvim/issues/1920)) ([b9bd8ae](https://github.com/folke/snacks.nvim/commit/b9bd8ae98213973131d21abf806e56c3f1c8f0a9))
* **picker.core:** respect camelCase for scoring when ignorecase is true ([#1601](https://github.com/folke/snacks.nvim/issues/1601)) ([a32735b](https://github.com/folke/snacks.nvim/commit/a32735b9e8513bd71d82744597490ac10e343c6e))
* **picker.format:** added min_width for truncated paths ([b7f8116](https://github.com/folke/snacks.nvim/commit/b7f811613a0a999f6a275260ef2963ecff3a16e8))
* **picker.format:** apply hidden file hl group last. Fixes [#2127](https://github.com/folke/snacks.nvim/issues/2127) ([0bf8fe4](https://github.com/folke/snacks.nvim/commit/0bf8fe4ece5d8a2a4b87f098b014fd9901475a1b))
* **picker.format:** correcter max_width for truncpath ([a5d2964](https://github.com/folke/snacks.nvim/commit/a5d29646e593d52e952183021d5902e2a1ebc583))
* **picker.format:** simplified resolvable formatters and more correct ([d5b6d30](https://github.com/folke/snacks.nvim/commit/d5b6d30b5e9acd3279406e0a3d382d37d657a28f))
* **picker.git_diff:** use absolute path when adding buffer to avoid duplicates ([#1819](https://github.com/folke/snacks.nvim/issues/1819)) ([a012f39](https://github.com/folke/snacks.nvim/commit/a012f394c9988ec30ec03474d5b971e1796ee3dd))
* **picker.git:** add `ignorecase` for `git_grep` ([#1629](https://github.com/folke/snacks.nvim/issues/1629)) ([7502e77](https://github.com/folke/snacks.nvim/commit/7502e7780363217ffcf3a998fd7d661ce37c1f01))
* **picker.git:** use unmerged icon for unmerged. Fixes [#1531](https://github.com/folke/snacks.nvim/issues/1531) ([abee3c9](https://github.com/folke/snacks.nvim/commit/abee3c9eff1c77eb66151800b3683d4043527f88))
* **picker.grep:** better line/col parsing. Closes [#2126](https://github.com/folke/snacks.nvim/issues/2126). Fixes [#2123](https://github.com/folke/snacks.nvim/issues/2123) ([1fee799](https://github.com/folke/snacks.nvim/commit/1fee799ad67d004c0cd8412a496bb20cb2f03e9b))
* **picker.grep:** faulty rg cmd. Closes [#2280](https://github.com/folke/snacks.nvim/issues/2280) ([65a5c8b](https://github.com/folke/snacks.nvim/commit/65a5c8b3d05b0c08838aab9db8427b7f62342ef8))
* **picker.list:** resize when needed. Closes [#2290](https://github.com/folke/snacks.nvim/issues/2290) ([df018ed](https://github.com/folke/snacks.nvim/commit/df018edfdbc5df832b46b9bdc9eafb1d69ea460b))
* **picker.lsp_config:** cmd can be a function ([ba745ba](https://github.com/folke/snacks.nvim/commit/ba745ba281c02b12dc898de9e652a408c48b2bbe))
* **picker.lsp:** don't process lsp request results when aborted. Closes [#2327](https://github.com/folke/snacks.nvim/issues/2327) ([4e10708](https://github.com/folke/snacks.nvim/commit/4e1070867a701b863d4bce4fd54a6c11314de506))
* **picker.lsp:** move get_clients inside vim.schedule to prevent issues on Neovim 0.11. Closes [#2320](https://github.com/folke/snacks.nvim/issues/2320) ([79f3a8d](https://github.com/folke/snacks.nvim/commit/79f3a8d8b3c19bb27d1c34381d27d55a87a374dc))
* **picker.lsp:** trigger docs workflow ([6f1158f](https://github.com/folke/snacks.nvim/commit/6f1158fe9bada1cb467defcdfb55f5217a90d709))
* **picker.man:** make tab/split/vsplit work. Closes [#2171](https://github.com/folke/snacks.nvim/issues/2171) ([f39d114](https://github.com/folke/snacks.nvim/commit/f39d1144e707d59857dfa5d78162748d1e8cef4a))
* **picker.marks:** fix buffer checking ([#2287](https://github.com/folke/snacks.nvim/issues/2287)) ([ca0858a](https://github.com/folke/snacks.nvim/commit/ca0858a30a88e8a28325c0c1edc0cd24b905c4e4))
* **picker.preview:** better hack to deal with buffer local option weirdness ([c968d4d](https://github.com/folke/snacks.nvim/commit/c968d4def4ee3769e6523cd4d8599695b7183a3f))
* **picker.preview:** directory preview should use cwd. Closes [#2212](https://github.com/folke/snacks.nvim/issues/2212). Fixes [#2093](https://github.com/folke/snacks.nvim/issues/2093) ([d050712](https://github.com/folke/snacks.nvim/commit/d05071255c865eb2cb3cd493235bf25ad6947513))
* **picker.preview:** don't record previeww searches in history and prevent scrolling from the top. Closes [#2305](https://github.com/folke/snacks.nvim/issues/2305) ([080320b](https://github.com/folke/snacks.nvim/commit/080320bb820ffdb6103f993da076b100ea68333c))
* **picker.preview:** dont do win-local hack for floating windows ([12b2f0d](https://github.com/folke/snacks.nvim/commit/12b2f0d2bdf18e50e8caa4e1ad3c6f6cc9365833))
* **picker.qflist:** error with qflist picker when the list contains invalid items ([#2293](https://github.com/folke/snacks.nvim/issues/2293)) ([6af1e76](https://github.com/folke/snacks.nvim/commit/6af1e76758c6e9ad8792202de2ba069da2a93a68))
* **picker.recent:** include closed / unlisted buffers in recent. Closes [#1745](https://github.com/folke/snacks.nvim/issues/1745) ([5959631](https://github.com/folke/snacks.nvim/commit/595963140e464e9bd8244b758a590a7c0b5d0798))
* **picker:** add type field to qflist item ([#1538](https://github.com/folke/snacks.nvim/issues/1538)) ([#1539](https://github.com/folke/snacks.nvim/issues/1539)) ([125978b](https://github.com/folke/snacks.nvim/commit/125978b57ac484d7c3487bd97b672c9157ba1ff0))
* **picker:** added show_delay to config max ms to wait to show if no results found yet. Closes [#2206](https://github.com/folke/snacks.nvim/issues/2206) ([64583a0](https://github.com/folke/snacks.nvim/commit/64583a0386e79b226bde4ce04432220836343e57))
* **picker:** allow some sources to use the current window as main. Closes [#2012](https://github.com/folke/snacks.nvim/issues/2012). See [#1941](https://github.com/folke/snacks.nvim/issues/1941) ([5cda953](https://github.com/folke/snacks.nvim/commit/5cda9532ca215f7065dc12be1cc23458e3137c2a))
* **picker:** correct z-index for preview="main" layout ([e796aef](https://github.com/folke/snacks.nvim/commit/e796aef0fabc791cdb4a7ec6ecfc91b0eccce1d7))
* **picker:** do not record consecutive duplicate history ([#2040](https://github.com/folke/snacks.nvim/issues/2040)) ([d0a5310](https://github.com/folke/snacks.nvim/commit/d0a53104172d48951e47e686c9e913ae5a6efb6f))
* **picker:** fixup for pickers that dont display files ([1b4205e](https://github.com/folke/snacks.nvim/commit/1b4205eb1a224f668e85abeda2c0b1f0f73f477d))
* **picker:** load correct actions in list of action names. Closes [#1501](https://github.com/folke/snacks.nvim/issues/1501) ([b064be2](https://github.com/folke/snacks.nvim/commit/b064be2882a0a081caa2464a57379d0ac58f4f0f))
* **picker:** lsp_config now includes any configfured LSP and excludes deprecated servers ([a0d6eba](https://github.com/folke/snacks.nvim/commit/a0d6eba1a22719ffaed9b1ac2cf79e33b1c64e4c))
* **picker:** prevent WinEnter handling during startup ([756a791](https://github.com/folke/snacks.nvim/commit/756a791131304a9063ff8e3af52811efbcaef688))
* **picker:** show_delay config value ([67bb3a7](https://github.com/folke/snacks.nvim/commit/67bb3a7ba0478c892a4f06ac0446ca101af787c9))
* **picker:** show_delay is in ms. Also increase it to allow auto_confirm to work properly ([924a930](https://github.com/folke/snacks.nvim/commit/924a9304e92bd29da4bd63a87cb0b05524254a87))
* **picker:** use nvim_paste instead of nvim_put. Closes [#1941](https://github.com/folke/snacks.nvim/issues/1941) ([021e04f](https://github.com/folke/snacks.nvim/commit/021e04fa6fef78f52ac189592d176e7febdd09d4))
* **projects:** normalize item.text for correct Windows support ([#2275](https://github.com/folke/snacks.nvim/issues/2275)) ([457596b](https://github.com/folke/snacks.nvim/commit/457596be6d53d4cd4b6bad8614dfde0c11549c41))
* **rename:** made rename more robust and make sure target directory exists. Closes [#2252](https://github.com/folke/snacks.nvim/issues/2252) ([c494447](https://github.com/folke/snacks.nvim/commit/c494447737900d3ed56a51aa4e6f2aa118c2c518))
* **scope:** allow user to disable keys ([#1918](https://github.com/folke/snacks.nvim/issues/1918)) ([bebf0bd](https://github.com/folke/snacks.nvim/commit/bebf0bd38e3e7071abc4085ad46f1ebc32cdfe17))
* **scratch:** branch fallback for detached head ([#1519](https://github.com/folke/snacks.nvim/issues/1519)) ([98345c7](https://github.com/folke/snacks.nvim/commit/98345c70126147f871d90ab23787b0dc00937b84))
* **scratch:** hide buffer after formatting when close ([#1523](https://github.com/folke/snacks.nvim/issues/1523)) ([4379085](https://github.com/folke/snacks.nvim/commit/43790856166685c4541397bd59b5927146be8f82))
* **scratch:** use icon[1] when icon is a table to avoid table.concat error ([#2242](https://github.com/folke/snacks.nvim/issues/2242)) ([ba90011](https://github.com/folke/snacks.nvim/commit/ba90011a1481b9b9314a7cebbb319f7472ea25a8))
* **scroll:** don't animate 1 line scrolls (jk). Closes [#1620](https://github.com/folke/snacks.nvim/issues/1620) ([d293b21](https://github.com/folke/snacks.nvim/commit/d293b21fe1a603dfb4757feb82ab3e67b78589f2))
* **scroll:** stop anim and reset state when win has new buf, or buf was changed. Closes [#1820](https://github.com/folke/snacks.nvim/issues/1820). Closes [#2221](https://github.com/folke/snacks.nvim/issues/2221) ([766f7b8](https://github.com/folke/snacks.nvim/commit/766f7b87aa1d94f356a77755886150dc7c4c756e))
* **statuscolumn:** show open folds in consecutive levels ([#1534](https://github.com/folke/snacks.nvim/issues/1534)) ([7bcd3ba](https://github.com/folke/snacks.nvim/commit/7bcd3baaf8e9fbea1c51e0690e67e7be69441311))
* **terminal:** check win valid before creating a new terminal ([#1927](https://github.com/folke/snacks.nvim/issues/1927)) ([ba7bbcd](https://github.com/folke/snacks.nvim/commit/ba7bbcd0df45f1f4e390fc79dcaa974b4c4ea3c6))
* **terminal:** make sure terminals opend with `open()` can be found with `list()`. Closes [#2172](https://github.com/folke/snacks.nvim/issues/2172). Closes [#2173](https://github.com/folke/snacks.nvim/issues/2173) ([13f3006](https://github.com/folke/snacks.nvim/commit/13f3006dbf69e0a1a3189775d9c70ee3456ed7e0))
* **terminal:** set buffer when opening terminal with position='current' ([#2162](https://github.com/folke/snacks.nvim/issues/2162)) ([2aacf55](https://github.com/folke/snacks.nvim/commit/2aacf550820430594a74ccf995a11b0be9184eea)), closes [#2148](https://github.com/folke/snacks.nvim/issues/2148)
* **terminal:** stack only terminal splits by default. Closes [#2137](https://github.com/folke/snacks.nvim/issues/2137) ([8c50196](https://github.com/folke/snacks.nvim/commit/8c501965beff9a741b29eea53c7f876b039bddea))
* **util:** fix invalid window error ([#1996](https://github.com/folke/snacks.nvim/issues/1996)) ([32e5bf1](https://github.com/folke/snacks.nvim/commit/32e5bf17309ca26e6075a14c3907b0959188d781))
* **util:** only use mini.icons if it has been setup. Closes [#2199](https://github.com/folke/snacks.nvim/issues/2199) ([774bf9d](https://github.com/folke/snacks.nvim/commit/774bf9d8c8d9bc401355f53605f91d469236f6c6))
* **win:** check parent win is valid before getting size ([#2315](https://github.com/folke/snacks.nvim/issues/2315)) ([471eb03](https://github.com/folke/snacks.nvim/commit/471eb036c47abf9e71c33b9e01ebb1b2d464b791))
* **zen:** make zoom and minimizing work in terminal mode ([#1912](https://github.com/folke/snacks.nvim/issues/1912)) ([fb54927](https://github.com/folke/snacks.nvim/commit/fb54927ab0d5b4ce3a377d9bcd7b172d0692725d))
### Performance Improvements
* **dashboard:** add basic OSC11 and CSI6n support to terminal sections (gh 10 seconds faster) ([fb016d2](https://github.com/folke/snacks.nvim/commit/fb016d20c2a415450708e3eb837462f6dcea46ba))
* **git:** invoke `git status` with `--no-optional-locks` ([#2175](https://github.com/folke/snacks.nvim/issues/2175)) ([e441c64](https://github.com/folke/snacks.nvim/commit/e441c641eb3ff4ffce7535578399b7f6a7a0b2e1))
* **grep:** move match parsing to resolve and fix an issue with `.*` results. Closes [#2308](https://github.com/folke/snacks.nvim/issues/2308) ([1417701](https://github.com/folke/snacks.nvim/commit/1417701af6e98ece624db386361b006d1e13d1fa))
* **picker:** set `limit_live=10000` by default. Makes no sense to load millions of matches when doing live searches. ([04990d0](https://github.com/folke/snacks.nvim/commit/04990d042c7e95d1f2cea5bf26892cb4a5f024fd))
## [2.23.0](https://github.com/folke/snacks.nvim/compare/v2.22.0...v2.23.0) (2025-09-15)
### Features
* **image.doc:** enable inline math rendering for neorg files. Closes [#1438](https://github.com/folke/snacks.nvim/issues/1438) ([ec487f5](https://github.com/folke/snacks.nvim/commit/ec487f5d85c12e4cee27d4e1235a1f82f99bfe03))
* **image.inline:** honor `concealcursor` and hide conceal when selecting lines. Closes [#1478](https://github.com/folke/snacks.nvim/issues/1478) ([bc0630e](https://github.com/folke/snacks.nvim/commit/bc0630e43be5699bb94dadc302c0d21615421d93))
* **image:** proper inline rendering of math expressions. Closes [#1318](https://github.com/folke/snacks.nvim/issues/1318). Closes [#1454](https://github.com/folke/snacks.nvim/issues/1454) ([6ea4fa7](https://github.com/folke/snacks.nvim/commit/6ea4fa72dccd6db0713c13e6672f9e8fb4007417))
* **picker.git:** added `all` option to also list remote branched for `git_branches`. Closes [#1465](https://github.com/folke/snacks.nvim/issues/1465) ([3d695ab](https://github.com/folke/snacks.nvim/commit/3d695ab7d062d40c980ca5fd9fe6e593c8f35b12))
* **scope:** allow disabling scopes with `vim.g.snacks_scope = false` or `vim.b.snacks_scope = false`. Closes [#1463](https://github.com/folke/snacks.nvim/issues/1463) ([5315e26](https://github.com/folke/snacks.nvim/commit/5315e267fffad9a257ab6909e87eb43e2f636049))
* **util:** small ts parse wrapper that parses async when available ([9f0aa20](https://github.com/folke/snacks.nvim/commit/9f0aa2048945604d7f87bbc2594efa42c0f78c23))
### Bug Fixes
* **dashboard:** escape filenames for edit. Closes [#1453](https://github.com/folke/snacks.nvim/issues/1453) ([8b0e79a](https://github.com/folke/snacks.nvim/commit/8b0e79ab4cbb0bc5b22dd00a471d0b2bafb1c6f0))
* **explorer:** confirm prompt now defaults to `No` ([f970cbb](https://github.com/folke/snacks.nvim/commit/f970cbb258d23942906be83b808d2ca2fcc24ab2))
* **image.inline:** remove debug ([d9bb639](https://github.com/folke/snacks.nvim/commit/d9bb639feda0daf4e4df6eaa47989099b74dde46))
* **image.latex:** don't nest image nodes ([714d761](https://github.com/folke/snacks.nvim/commit/714d7616f0b76ff7c099b5604b19a1a6ab909511))
* **image.queries:** add image type ([1bbd479](https://github.com/folke/snacks.nvim/commit/1bbd47973df1ae2127576de8fcea720499c159ad))
* **image:** only show anchor icon for inline images shown on the lines below. Closes [#1479](https://github.com/folke/snacks.nvim/issues/1479) ([bc2ed15](https://github.com/folke/snacks.nvim/commit/bc2ed15c41cb147f957db02959c9422b6a9b84ba))
* **indent:** zero indent for blank lines. Closes [#1477](https://github.com/folke/snacks.nvim/issues/1477) ([cddf714](https://github.com/folke/snacks.nvim/commit/cddf714dd66a14b0cf556f9be82165b22517de1a))
* **input:** add cr keybind for normal mode. Closes [#1468](https://github.com/folke/snacks.nvim/issues/1468). Closes [#1466](https://github.com/folke/snacks.nvim/issues/1466) ([78f0ad6](https://github.com/folke/snacks.nvim/commit/78f0ad6ce7283b0e2d6ac2b9b82ac731c7c30b93))
* **lsp:** fix deprecated warnings related to lsp client ([07fefd2](https://github.com/folke/snacks.nvim/commit/07fefd2a99b2ae376f9704a8a3885c838cfc31c8))
* **picker.preview:** always use builtin for git log preview ([f0d3433](https://github.com/folke/snacks.nvim/commit/f0d34336dbac2909654ca05aabc472edc73c7c8a))
* **statuscolumn:** better way of determining open folds. Closes [#1445](https://github.com/folke/snacks.nvim/issues/1445) ([1239fb8](https://github.com/folke/snacks.nvim/commit/1239fb84bc426d4fcd1c8dc9dde8503c17501842))
* **util.spawn:** correctly mark as faild on abort ([6917597](https://github.com/folke/snacks.nvim/commit/6917597f6d22d79fcd0bf9b0eb7845f7ffdc80a0))
* **win:** make sure the border is set when setting the title ([76311ab](https://github.com/folke/snacks.nvim/commit/76311aba31182adcd85cc3381abca76b917668b7))
### Performance Improvements
* **image:** async treesitter parsing for images ([e55ae37](https://github.com/folke/snacks.nvim/commit/e55ae37bebd53ab0e24a47d88ef50267207ffd91))
### Reverts
* dont always set border when setting title. Closes [#1436](https://github.com/folke/snacks.nvim/issues/1436) ([fa29c6c](https://github.com/folke/snacks.nvim/commit/fa29c6c92631026a7ee41249c78bd91562e67a09))
## [2.22.0](https://github.com/folke/snacks.nvim/compare/v2.21.0...v2.22.0) (2025-02-25)
### Features
* **image:** allow disabling math rendering. Closes [#1247](https://github.com/folke/snacks.nvim/issues/1247) ([1543a06](https://github.com/folke/snacks.nvim/commit/1543a063fbd3a462879d696b2885f4aa90c55896))
* **image:** configurable templates for math expressions. Closes [#1338](https://github.com/folke/snacks.nvim/issues/1338) ([e039139](https://github.com/folke/snacks.nvim/commit/e039139291f85eebf3eeb41cc5ad9dc4265cafa4))
* **image:** removed `org` integration, since that is now handled by the org mode plugin directly. ([956fe69](https://github.com/folke/snacks.nvim/commit/956fe69df328d2da924a04061802fb7d2ec5fef6))
* **picker.input:** added some ctrl+r keymaps similar to cmdline. Closes [#1420](https://github.com/folke/snacks.nvim/issues/1420) ([c864a7d](https://github.com/folke/snacks.nvim/commit/c864a7d378da2a11afb09302b3220264e2aa3409))
* **util:** util method to check if ts lang is available on any Neovim version. See [#1422](https://github.com/folke/snacks.nvim/issues/1422) ([e2cb9df](https://github.com/folke/snacks.nvim/commit/e2cb9df7d0695911f60a4510191aaf4a3d0d81ad))
### Bug Fixes
* **compat:** fixup ([ceabfc1](https://github.com/folke/snacks.nvim/commit/ceabfc1b89fe8e46b5138ae2417890121f5dfa02))
* **compat:** properly detect async treesitter parsing ([842605f](https://github.com/folke/snacks.nvim/commit/842605f072e5d124a47eeb212bc2f78345bec4c4))
* **compat:** vim.fs.normalize. Closes [#1321](https://github.com/folke/snacks.nvim/issues/1321) ([2295cfc](https://github.com/folke/snacks.nvim/commit/2295cfcca5bc749f169fb83ca4bdea9a85ad79a3))
* **dim:** check that win is valid when animating dim. Closes [#1342](https://github.com/folke/snacks.nvim/issues/1342) ([47e1440](https://github.com/folke/snacks.nvim/commit/47e1440d547233772a3958580d429b38b5959edd))
* **image.placement:** max width/height in cells is 297. Closes [#1345](https://github.com/folke/snacks.nvim/issues/1345) ([5fa93cb](https://github.com/folke/snacks.nvim/commit/5fa93cb6846b5998bc0b4b4ac9de47108fe39ce6))
* **image.terminal:** reset queue when timer runs ([2b34c4d](https://github.com/folke/snacks.nvim/commit/2b34c4dc05aa4cbccc6171fa530e95c218e9bc9c))
* **image.terminal:** write queued terminal output on main ([1b63b18](https://github.com/folke/snacks.nvim/commit/1b63b1811c58f661ad22f390a52aa6723703dc3d))
* **picker.buffers:** add `a` flag when buffer is visible in a window. See [#1417](https://github.com/folke/snacks.nvim/issues/1417) ([91c3da0](https://github.com/folke/snacks.nvim/commit/91c3da0b4b286967d6d0166c0fc5769795a78918))
* **picker.recent:** expand to full path before normalizing. Closes [#1406](https://github.com/folke/snacks.nvim/issues/1406) ([cf47fa7](https://github.com/folke/snacks.nvim/commit/cf47fa7cee80b0952706aacd4068310fe041761e))
* **picker:** allow overriding winhl of layout box wins. Closes [#1424](https://github.com/folke/snacks.nvim/issues/1424) ([b0f983e](https://github.com/folke/snacks.nvim/commit/b0f983ef9aa9b9855ff0b72350cd3dc80de70675))
* **picker:** disable regex for grep_word ([#1363](https://github.com/folke/snacks.nvim/issues/1363)) ([54298eb](https://github.com/folke/snacks.nvim/commit/54298eb624bd89f10f288b92560861277a34116d))
* **picker:** remove unused keymaps for mouse scrolling ([33df54d](https://github.com/folke/snacks.nvim/commit/33df54dae71df7f7ec17551c23ad0ffc677e6ad1))
* **picker:** update titles before showing. Closes [#1337](https://github.com/folke/snacks.nvim/issues/1337) ([3ae9863](https://github.com/folke/snacks.nvim/commit/3ae98636aaaf8f1b2f55b264f5745ae268de532f))
* **scope:** use `rawequal` to check if scope impl is treesitter. Closes [#1413](https://github.com/folke/snacks.nvim/issues/1413) ([4ce197b](https://github.com/folke/snacks.nvim/commit/4ce197bff9cb9b78a0bdcebb6f7ebbf22cd48c6a))
* **scroll:** compat with Neovim 0.9.4 ([4c52b7f](https://github.com/folke/snacks.nvim/commit/4c52b7f25da0ce6b2b830ce060dbd162706acf33))
* **statuscolumn:** right-align the current line number when relativenumber=true. Closes [#1376](https://github.com/folke/snacks.nvim/issues/1376) ([dd15e3a](https://github.com/folke/snacks.nvim/commit/dd15e3a05a2111231c53726f18e39a147162c20f))
* **win:** don't update title is relative win is invalid. Closes [#1348](https://github.com/folke/snacks.nvim/issues/1348) ([a00c323](https://github.com/folke/snacks.nvim/commit/a00c323d4b244f781df6df8b11bbfa47f63202d4))
* **win:** use correct keys for displaying help. Closes [#1364](https://github.com/folke/snacks.nvim/issues/1364) ([b100c93](https://github.com/folke/snacks.nvim/commit/b100c937177536cf2aa634ddd2aa5b8a1dd23ace))
* **zen:** always count cmdheight towards Zen bottom offset ([#1402](https://github.com/folke/snacks.nvim/issues/1402)) ([041bf1d](https://github.com/folke/snacks.nvim/commit/041bf1da9ed12498cbe3273dd90ef83e0a4913fa))
### Performance Improvements
* **scope:** use async treesitter parsing when available ([e0f882e](https://github.com/folke/snacks.nvim/commit/e0f882e6d6464666319502151cc244a090d4377f))
## 2.21.0 (2025-02-20)
### Features
* added new `image` snacks plugin for the kitty graphics protocol ([4e4e630](https://github.com/folke/snacks.nvim/commit/4e4e63048e5ddae6f921f1a1b4bd11a53016c7aa))
* **bigfile:** configurable average line length (default = 1000). Useful for minified files. Closes [#576](https://github.com/folke/snacks.nvim/issues/576). Closes [#372](https://github.com/folke/snacks.nvim/issues/372) ([7fa92a2](https://github.com/folke/snacks.nvim/commit/7fa92a24501fa85b567c130b4e026f9ca1efed17))
* **compat:** added `svim`, a compatibility layer for Neovim. Closes [#1321](https://github.com/folke/snacks.nvim/issues/1321) ([bc902f7](https://github.com/folke/snacks.nvim/commit/bc902f7032df305df7dc48104cfa4e37967b3bdf))
* **debug:** graduate proc debug to Snacks.debug.cmd ([eced303](https://github.com/folke/snacks.nvim/commit/eced3033ea29bf9154a5f2c5207bf9fc97368599))
* **explorer:** `opts.include` and `opts.exclude`. Closes [#1068](https://github.com/folke/snacks.nvim/issues/1068) ([ab1889c](https://github.com/folke/snacks.nvim/commit/ab1889c35b1845f487f31f0399ec0c8bd2c6e521))
* **explorer:** added `Snacks.explorer.reveal()` to reveal the current file in the tree. ([b4cf6bb](https://github.com/folke/snacks.nvim/commit/b4cf6bb48d882a873a6954bff2802d88e8e19e0d))
* **explorer:** added copy/paste (yank/paste) for files. Closes [#1195](https://github.com/folke/snacks.nvim/issues/1195) ([938aee4](https://github.com/folke/snacks.nvim/commit/938aee4a02119ad693a67c38b64a9b3232a72565))
* **explorer:** added ctrl+f to grep in the item's directory ([0454b21](https://github.com/folke/snacks.nvim/commit/0454b21165cb84d2f59a1daf6226de065c90d4f7))
* **explorer:** added ctrl+t to open a terminal in the item's directory ([81f9006](https://github.com/folke/snacks.nvim/commit/81f90062c50430c1bad9546fcb65c3e43a76be9b))
* **explorer:** added diagnostics file/directory status ([7f1b60d](https://github.com/folke/snacks.nvim/commit/7f1b60d5576345af5e7b990f3a9e4bca49cd3686))
* **explorer:** added quick nav with `[`, `]` with `d/w/e` for diagnostics ([d1d5585](https://github.com/folke/snacks.nvim/commit/d1d55850ecb4aac1396c314a159db1e90a34bd79))
* **explorer:** added support for live search ([82c4a50](https://github.com/folke/snacks.nvim/commit/82c4a50985c9bb9f4b1d598f10a30e1122a35212))
* **explorer:** allow disabling untracked git status. Closes [#983](https://github.com/folke/snacks.nvim/issues/983) ([a3b083b](https://github.com/folke/snacks.nvim/commit/a3b083b8443b1ae1299747fdac8da51c3160835b))
* **explorer:** deal with existing buffers when renaming / deleting files. Closes [#1315](https://github.com/folke/snacks.nvim/issues/1315) ([6614a2c](https://github.com/folke/snacks.nvim/commit/6614a2c84f1ad8528aa03caeb2574b274ee0c20b))
* **explorer:** different hl group for broken links ([1989921](https://github.com/folke/snacks.nvim/commit/1989921466e6b5234ae8f71add41b8defd55f732))
* **explorer:** disable fuzzy searches by default for explorer since it's too noisy and we can't sort on score due to tree view ([b07788f](https://github.com/folke/snacks.nvim/commit/b07788f14a28daa8d0b387c1258f8f348f47420f))
* **explorer:** file watching that works on all platforms ([8399465](https://github.com/folke/snacks.nvim/commit/8399465872c51fab54ad5d02eb315e258ec96ed1))
* **explorer:** focus on first file when searching in the explorer ([1d4bea4](https://github.com/folke/snacks.nvim/commit/1d4bea4a9ee8a5258c6ae085ac66dd5cc05a9749))
* **explorer:** git index watcher ([4c12475](https://github.com/folke/snacks.nvim/commit/4c12475e80528d8d48b9584d78d645e4a51c3298))
* **explorer:** show symlink target ([dfa79e0](https://github.com/folke/snacks.nvim/commit/dfa79e04436ebfdc83ba71c0048fc1636b4de5aa))
* **git_log:** add author filter ([#1091](https://github.com/folke/snacks.nvim/issues/1091)) ([8c11661](https://github.com/folke/snacks.nvim/commit/8c1166165b17376ed87f0dedfc480c7cb8e42b7c))
* **gitbrowse:** add support for git.sr.ht ([#1297](https://github.com/folke/snacks.nvim/issues/1297)) ([a3b47e5](https://github.com/folke/snacks.nvim/commit/a3b47e5202d924e6a6d4386bb5f94cc5857c4f8c))
* **gitbrowse:** open permalinks to files. Fixes [#320](https://github.com/folke/snacks.nvim/issues/320) ([#438](https://github.com/folke/snacks.nvim/issues/438)) ([2a06e4c](https://github.com/folke/snacks.nvim/commit/2a06e4ce9957dea555d38b4f52024ea9e2902d8e))
* **image.doc:** allow configuring the header for latex / typst inline in the document. Closes [#1303](https://github.com/folke/snacks.nvim/issues/1303) ([bde3add](https://github.com/folke/snacks.nvim/commit/bde3adddc7d787c5e93eb13af55b6e702d86418b))
* **image.doc:** allow setting `image.src` with `#set!`. Closes [#1276](https://github.com/folke/snacks.nvim/issues/1276) ([65f89e2](https://github.com/folke/snacks.nvim/commit/65f89e2d6f3790b0687f09ebe2811d953bd09e0c))
* **image.doc:** check for `image.ignore` in ts meta. See [#1276](https://github.com/folke/snacks.nvim/issues/1276) ([29c777a](https://github.com/folke/snacks.nvim/commit/29c777a0a0291a0caba17f2e9aeb86b6097fc83c))
* **image:** `conceal` option for inline rendering (disabled by default) ([684666f](https://github.com/folke/snacks.nvim/commit/684666f6432eae139b8ca6813b1a88679f8febc1))
* **image:** `Snacks.image.hover()` ([5f466be](https://github.com/folke/snacks.nvim/commit/5f466becd96ebcd0a52352f2d53206e0e86de35a))
* **image:** add support for `svelte` ([#1277](https://github.com/folke/snacks.nvim/issues/1277)) ([54ab77c](https://github.com/folke/snacks.nvim/commit/54ab77c5d2b2edefa29fc63de73c7b2b60d2651b))
* **image:** adde support for `Image` in jsx ([95878ad](https://github.com/folke/snacks.nvim/commit/95878ad32aaf310f465a004ef12e9edddf939287))
* **image:** added `opts.img_dirs` to configure the search path for resolving images. Closes [#1222](https://github.com/folke/snacks.nvim/issues/1222) ([ad0b88d](https://github.com/folke/snacks.nvim/commit/ad0b88dc0814dc760c7b6ed4efc7c2fa8d27ba76))
* **image:** added `Snacks.image.doc.at_cursor()`. See [#1108](https://github.com/folke/snacks.nvim/issues/1108) ([6348ccf](https://github.com/folke/snacks.nvim/commit/6348ccf1209739552f70800910c206637f3b2d2c))
* **image:** added fallback image rendering for wezterm. Closes [#1063](https://github.com/folke/snacks.nvim/issues/1063) ([9e6b1a6](https://github.com/folke/snacks.nvim/commit/9e6b1a62a87aa201dea13a755f6ac1ed680a20d1))
* **image:** added math rendering for typst. Closes [#1260](https://github.com/folke/snacks.nvim/issues/1260) ([e225823](https://github.com/folke/snacks.nvim/commit/e2258236a2fc770a87a81125232ca786ec7a1cf1))
* **image:** added proper support for tmux ([b1a3b66](https://github.com/folke/snacks.nvim/commit/b1a3b66fade926e9d211453275ddf1be19a847a5))
* **image:** added support for `.image` tags in neorg ([59bbe8d](https://github.com/folke/snacks.nvim/commit/59bbe8d90e91d4b4f63cc5fcb36c81bd8eeee850))
* **image:** added support for `typst`. Closes [#1235](https://github.com/folke/snacks.nvim/issues/1235) ([507c183](https://github.com/folke/snacks.nvim/commit/507c1836e3c5cfc5194bb6350ece1a1e0a1edf14))
* **image:** added support for a bunch of aditional languages ([a596f8a](https://github.com/folke/snacks.nvim/commit/a596f8a9ea0a058490bca8aca70f935cded18d22))
* **image:** added support for angle bracket urls. Closes [#1209](https://github.com/folke/snacks.nvim/issues/1209) ([14a1f32](https://github.com/folke/snacks.nvim/commit/14a1f32eafd50b5b6ae742052e6da04b1e0167b2))
* **image:** added support for math expressions in latex and markdown doc + images in latex. Closes [#1223](https://github.com/folke/snacks.nvim/issues/1223) ([1bca71a](https://github.com/folke/snacks.nvim/commit/1bca71a1332e3119ece0e62d668b75e6c98d948c))
* **image:** added support for mermaid diagrams in markdown ([f8e7942](https://github.com/folke/snacks.nvim/commit/f8e7942d6c83a1b1953320054102eb32bf536d98))
* **image:** added support for remote image viewing. Closes [#1156](https://github.com/folke/snacks.nvim/issues/1156) ([#1165](https://github.com/folke/snacks.nvim/issues/1165)) ([a5748ea](https://github.com/folke/snacks.nvim/commit/a5748ea8db2ac14fbc9c05376cc6d154d749f881))
* **image:** added support for tsx, jsx, vue and angular ([ab0ba5c](https://github.com/folke/snacks.nvim/commit/ab0ba5cb22d7bf62fa204f08426e601a20750f29))
* **image:** added support for wikilink style images. Closes [#1210](https://github.com/folke/snacks.nvim/issues/1210) ([3fda272](https://github.com/folke/snacks.nvim/commit/3fda27200d9af7ed181e9ee0a841c50137e9a5be))
* **image:** allow customizing font size for math expressions ([b052eb9](https://github.com/folke/snacks.nvim/commit/b052eb93728df6cc0c09b7ee42fec6d93477fc3e))
* **image:** allow customizing the default magick args for vector images ([2096fcd](https://github.com/folke/snacks.nvim/commit/2096fcdd739500ba8275d791b20d60f306c61b33))
* **image:** allow forcing image rendering even when the terminal support detection fails ([d17a6e4](https://github.com/folke/snacks.nvim/commit/d17a6e4af888c43ba3faddc30231aa2aebc699d4))
* **image:** apply image window options ([73366fa](https://github.com/folke/snacks.nvim/commit/73366fa17018d7fd4d115cec2466b2d8e7233341))
* **image:** better detection of image capabilities of the terminal/mux environment ([1795d4b](https://github.com/folke/snacks.nvim/commit/1795d4b1ec767886300faa4965539fe67318a06a))
* **image:** better error handling + option to disable error notifications ([1adfd29](https://github.com/folke/snacks.nvim/commit/1adfd29af3d1b4db2ba46f7a292410a2f9105fd6))
* **image:** better health checks ([d389c5d](https://github.com/folke/snacks.nvim/commit/d389c5df14d83b6aff9eb6734906888780e8ca71))
* **image:** check for `magick` in health check ([1284835](https://github.com/folke/snacks.nvim/commit/12848356c4fd672476f47d9dea9999784c140c05))
* **image:** custom `src` resolve function ([af21ea3](https://github.com/folke/snacks.nvim/commit/af21ea3ccf6c11246cfbb1bef061caa4f387f1f0))
* **image:** enabled pdf previews ([39bf513](https://github.com/folke/snacks.nvim/commit/39bf5131c4f8cd79c1779a5cb80e526cf9e4fffe))
* **image:** floats in markdown. Closes [#1151](https://github.com/folke/snacks.nvim/issues/1151) ([4e10e31](https://github.com/folke/snacks.nvim/commit/4e10e31398e6921ac19371099f06640b8753bc8a))
* **image:** health checks ([0d5b106](https://github.com/folke/snacks.nvim/commit/0d5b106d4eae756cd612fdabde36aa795a444546))
* **image:** images are now properly scaled based on device DPI and image DPI. Closing [#1257](https://github.com/folke/snacks.nvim/issues/1257) ([004050c](https://github.com/folke/snacks.nvim/commit/004050c43533ac38a224649268e913c6fb0c4caa))
* **image:** make manual hover work correctly ([942cb92](https://github.com/folke/snacks.nvim/commit/942cb9291e096d8604d515499e295ec67578b71a))
* **image:** make math packages configurable. Closes [#1295](https://github.com/folke/snacks.nvim/issues/1295) ([e27ba72](https://github.com/folke/snacks.nvim/commit/e27ba726b15e71eca700141c2030ac858bc8025c))
* **image:** markdown inline image preview. `opts.image` must be enabled and terminal needs support ([001f300](https://github.com/folke/snacks.nvim/commit/001f3002cabb9e23d8f1b23e0567db2d41c098a6))
* **image:** refactor + css/html + beter image fitting ([e35d6cd](https://github.com/folke/snacks.nvim/commit/e35d6cd4ba87e8ff71d6ebe52b7be53408e13538))
* **image:** refactor of treesitter queries to support inline image data ([0bf0c62](https://github.com/folke/snacks.nvim/commit/0bf0c6223d71ced4e5dc7ab7357b0a36a91a0a67))
* **images:** added support for org-mode. Closes [#1276](https://github.com/folke/snacks.nvim/issues/1276) ([10387af](https://github.com/folke/snacks.nvim/commit/10387af009e51678788506527b46240b2139fd7f))
* **image:** show progress indicator when converting image files ([b65178b](https://github.com/folke/snacks.nvim/commit/b65178b470385f0a81256d54c9d80f153cd14efd))
* **image:** try resolving paths relative to the document and to the cwd. See [#1203](https://github.com/folke/snacks.nvim/issues/1203) ([668cbbb](https://github.com/folke/snacks.nvim/commit/668cbbba473d757144e24188b458e57dc0e98943))
* **image:** url_decode strings ([d41704f](https://github.com/folke/snacks.nvim/commit/d41704f3daae823513c90adb913976bfabc36387))
* **image:** use `tectonic` when available ([8d073cc](https://github.com/folke/snacks.nvim/commit/8d073ccc0ca984f844cc2a8f8506f23f3fcea56a))
* **image:** use kitty's unicode placeholder images ([7d655fe](https://github.com/folke/snacks.nvim/commit/7d655fe09d2c705ff5707902f4ed925a62a61d3b))
* **image:** use search dirs to resolve file from both cwd and dirname of file. Closes [#1305](https://github.com/folke/snacks.nvim/issues/1305) ([bf01460](https://github.com/folke/snacks.nvim/commit/bf01460e6d82b720fb50664d372c1daf5ade249d))
* **image:** utility function to get a png dimensions from the file header ([a6d866a](https://github.com/folke/snacks.nvim/commit/a6d866ab72e5cad7840d69a7354cc67e2699f46e))
* **matcher:** call on_match after setting score ([23ce529](https://github.com/folke/snacks.nvim/commit/23ce529fb663337f9dc17ca08aa601b172469031))
* **picker.actions:** `cmd` action now always allows to edit the command. Closes [#1033](https://github.com/folke/snacks.nvim/issues/1033) ([a177885](https://github.com/folke/snacks.nvim/commit/a17788539a5e66784535d0c973bdc08728f16c46))
* **picker.actions:** option to disable notify for yank action. Closes [#1117](https://github.com/folke/snacks.nvim/issues/1117) ([f6a807d](https://github.com/folke/snacks.nvim/commit/f6a807da6d4e6ab591f85592a472bbb5bc6583f7))
* **picker.config:** better source field spec ([6c58b67](https://github.com/folke/snacks.nvim/commit/6c58b67890bbd2076a7f5b69f57ab666cb9b7410))
* **picker.db:** allow configuring the sqlite3 lib path. Closes [#1025](https://github.com/folke/snacks.nvim/issues/1025) ([b990044](https://github.com/folke/snacks.nvim/commit/b9900444d2ea494bba8857e5224059002ee8c465))
* **picker.files:** added `ft` option to filter by extension(s) ([12a7ea2](https://github.com/folke/snacks.nvim/commit/12a7ea28b97827575a1768d6013dd3c7bedd5ebb))
* **picker.format:** `opts.formatters.file.use_git_status_hl` defaults to `true` and adds git status hl to filename ([243eeca](https://github.com/folke/snacks.nvim/commit/243eecaca5f465602a9ba68e5c0fa375b90a13fb))
* **picker.git_diff:** use the `diff` previewer for `git_diff` so that `delta` can be used. See [#1302](https://github.com/folke/snacks.nvim/issues/1302) ([92786c5](https://github.com/folke/snacks.nvim/commit/92786c5b03ae4772521050acabcb619283eeb94a))
* **picker.git:** add confirmation before deleting a git branch ([#951](https://github.com/folke/snacks.nvim/issues/951)) ([337a3ae](https://github.com/folke/snacks.nvim/commit/337a3ae7eebb95020596f15a349a85d2f6be31a4))
* **picker.git:** add create and delete branch to git_branches ([#909](https://github.com/folke/snacks.nvim/issues/909)) ([8676c40](https://github.com/folke/snacks.nvim/commit/8676c409e148e28eff93c114aca0c1bf3d42281a))
* **picker.git:** allow passing extra args to git grep. Closes [#1184](https://github.com/folke/snacks.nvim/issues/1184) ([7122a03](https://github.com/folke/snacks.nvim/commit/7122a03fdf0b7bb9a5c6645b0e86f9e3a9f9290b))
* **picker.git:** allow passing extra args to other git pickers ([#1205](https://github.com/folke/snacks.nvim/issues/1205)) ([4d46574](https://github.com/folke/snacks.nvim/commit/4d46574b247d72bf1a602cdda2ddd8da39854234))
* **picker.lazy:** don't use `grep`. Parse spec files manually. Closes [#972](https://github.com/folke/snacks.nvim/issues/972) ([0928007](https://github.com/folke/snacks.nvim/commit/09280078e8339f018be5249fe0e1d7b9d32db7f7))
* **picker.lsp:** added original symbol to item.item. Closes [#1171](https://github.com/folke/snacks.nvim/issues/1171) ([45a6f8d](https://github.com/folke/snacks.nvim/commit/45a6f8d1ee0c323246413d1e1d43b0f0c9da18a2))
* **picker.lsp:** use existing buffers for preview when opened ([d4e6353](https://github.com/folke/snacks.nvim/commit/d4e63531c9fba63ded6fb470a5d53c98af110478))
* **picker.preview:** allow confguring `preview = {main = true, enabled = false}` ([1839c65](https://github.com/folke/snacks.nvim/commit/1839c65f6784bedb7ae96a84ee741fa5c0023226))
* **picker.preview:** allow passing additional args to the git preview command ([910437f](https://github.com/folke/snacks.nvim/commit/910437f1451ccaaa495aa1eca99e0a73fc798d40))
* **picker.proc:** added proc debug mode ([d870f16](https://github.com/folke/snacks.nvim/commit/d870f164534d1853fd8c599d7933cc5324272a09))
* **picker.undo:** `ctrl+y` to yank added lines, `ctrl+shift+y` to yank deleted lines ([3baf95d](https://github.com/folke/snacks.nvim/commit/3baf95d3a1005105b57ce53644ff6224ee3afa1c))
* **picker.undo:** added ctrl+y to yank added lines from undo ([811a24c](https://github.com/folke/snacks.nvim/commit/811a24cc16a8e9b7ec947c95b73e1fe05e4692d1))
* **picker.util:** lua globber ([97dcd9c](https://github.com/folke/snacks.nvim/commit/97dcd9c168c667538a4c6cc1384c4981a37afcad))
* **picker.util:** utility function to get all bins on the PATH ([5d42c7e](https://github.com/folke/snacks.nvim/commit/5d42c7e5e480bde04fd9506b3df64b579446c4f9))
* **picker:** `opts.focus` can be used to set default focus window. `opts.enter` if picker should be focused on enter. Closes [#1162](https://github.com/folke/snacks.nvim/issues/1162) ([e8de28b](https://github.com/folke/snacks.nvim/commit/e8de28b56ec85ad45cdb3c303c5ee5da0e070baf))
* **picker:** add LSP symbol range to result item ([#1123](https://github.com/folke/snacks.nvim/issues/1123)) ([c0481ab](https://github.com/folke/snacks.nvim/commit/c0481ab0b69c6111bfc5077bd1550acbb480f05d))
* **picker:** added `c-q` to list ([6d0d2dc](https://github.com/folke/snacks.nvim/commit/6d0d2dc2a7e07de9704a172bd5295f4920eb965f))
* **picker:** added `git_grep` picker. Closes [#986](https://github.com/folke/snacks.nvim/issues/986) ([2dc9016](https://github.com/folke/snacks.nvim/commit/2dc901634b250059cc9b7129bdeeedd24520b86c))
* **picker:** added `lsp_config` source ([0d4aa98](https://github.com/folke/snacks.nvim/commit/0d4aa98cea0de6144853d820e52e6e35d0f0c609))
* **picker:** added treesitter symbols picker ([a6beb0f](https://github.com/folke/snacks.nvim/commit/a6beb0f280d3f43513998882faf199acf3818ddf))
* **picker:** allow complex titles ([#1112](https://github.com/folke/snacks.nvim/issues/1112)) ([f200b3f](https://github.com/folke/snacks.nvim/commit/f200b3f6c8f84147e1a80f70b8f1714645c59af6))
* **picker:** allow configuring file icon width. Closes [#981](https://github.com/folke/snacks.nvim/issues/981) ([52c1086](https://github.com/folke/snacks.nvim/commit/52c1086ecdf410dfec3317144d46de7c6f86c1ad))
* **picker:** allow overriding default file/dir/dir_open icons. Closes [#1199](https://github.com/folke/snacks.nvim/issues/1199) ([41c4391](https://github.com/folke/snacks.nvim/commit/41c4391b72ff5ef3dfa8216fc608bbe02bbd4d1c))
* **picker:** default `c-t` keymap to open in tab ([ffc6fe3](https://github.com/folke/snacks.nvim/commit/ffc6fe3965cb176c2b3e2bdb0aee4478e4dc2b94))
* **picker:** each window can now be `toggled` (also input), `hidden` and have `auto_hide` ([01efab2](https://github.com/folke/snacks.nvim/commit/01efab2ddb75d2077229231201c5a69ab2df3ad8))
* **picker:** get filetype from modeline when needed. Closes [#987](https://github.com/folke/snacks.nvim/issues/987) ([5af04ab](https://github.com/folke/snacks.nvim/commit/5af04ab6672ae38bf7d72427e75f925615f93904))
* **picker:** image previewer using kitty graphics protocol ([2b0aa93](https://github.com/folke/snacks.nvim/commit/2b0aa93efc9aa662e0cb9446cc4639f3be1a9d1e))
* **picker:** new native diff mode (disabled by default). Can be used to show delta diffs for undo. Closes [#1288](https://github.com/folke/snacks.nvim/issues/1288) ([d6a38ac](https://github.com/folke/snacks.nvim/commit/d6a38acbf5765eeb5ca2558bcb0d1ae1428dd2ca))
* **picker:** pin picker as a split to left/bottom/top/right with `ctrl+z+(hjkl)` ([27cba53](https://github.com/folke/snacks.nvim/commit/27cba535a6763cbca3f3162c5c4bb48c6f382005))
* **picker:** renamed `native` -> `builtin` + fixed diff mode used for undo. Closes [#1302](https://github.com/folke/snacks.nvim/issues/1302) ([bd6a62a](https://github.com/folke/snacks.nvim/commit/bd6a62af12ca5e8cab88b94912e65bff26c9feba))
* **scope:** allow injected languages to be parsed by treesitter ([#823](https://github.com/folke/snacks.nvim/issues/823)) ([aba21dd](https://github.com/folke/snacks.nvim/commit/aba21ddc712b12db8469680dd7f2080063cb6d5c))
* **scroll:** big rework to make scroll play nice with virtual lines ([e71955a](https://github.com/folke/snacks.nvim/commit/e71955a941300cd81bf6d7ab36d1352b62d6f568))
* **scroll:** scroll improvements. Closes [#1024](https://github.com/folke/snacks.nvim/issues/1024) ([73d2f0f](https://github.com/folke/snacks.nvim/commit/73d2f0f40c702acaf7a1a3e833fc5460cb552578))
* **statuscolumn:** added mouse click handler to open/close folds. Closes [#968](https://github.com/folke/snacks.nvim/issues/968) ([98a7b64](https://github.com/folke/snacks.nvim/commit/98a7b647c9e245ef02d57d566bf8461c2f7beb56))
* **terminal:** added `Snacks.terminal.list()`. Closes [#421](https://github.com/folke/snacks.nvim/issues/421). Closes [#759](https://github.com/folke/snacks.nvim/issues/759) ([73c4b62](https://github.com/folke/snacks.nvim/commit/73c4b628963004760ccced0192d1c2633c9e3657))
* **terminal:** added `start_insert` ([64129e4](https://github.com/folke/snacks.nvim/commit/64129e4c3c5b247c61b1f46bc0faaa1e69e7eef8))
* **terminal:** auto_close and auto_insert. Closes [#965](https://github.com/folke/snacks.nvim/issues/965) ([bb76cae](https://github.com/folke/snacks.nvim/commit/bb76cae87e81a871435570b91c8c6f6e27eb9955))
* **terminal:** don't use deprecated `vim.fn.termopen` on Neovim >= 0.10 ([37f6665](https://github.com/folke/snacks.nvim/commit/37f6665c488d90bf50b99cfe0b0fab40f990c497))
* test ([520ed85](https://github.com/folke/snacks.nvim/commit/520ed85169c873a8492077520ff37a5f0233c67d))
* **toggle:** allow user to add custom which-key description ([#1121](https://github.com/folke/snacks.nvim/issues/1121)) ([369732e](https://github.com/folke/snacks.nvim/commit/369732e65e0077e51487547131045526ccbdad1b))
* **treesitter:** add `tree` boolean to toggle on/off tree symbols ([#1105](https://github.com/folke/snacks.nvim/issues/1105)) ([c61f9eb](https://github.com/folke/snacks.nvim/commit/c61f9eb28695b9f96682d6dbf67072947dfa2737))
* **util:** `Snacks.util.winhl` helper to deal with `vim.wo.winhighlight` ([4c1d7b4](https://github.com/folke/snacks.nvim/commit/4c1d7b4720218122885877877e7883cc491133ed))
* **util:** base64 shim for Neovim < 0.10 ([96f1227](https://github.com/folke/snacks.nvim/commit/96f12274a49bb2e6d0d558e652c728d27d4c3ff8))
* **util:** Snacks.util.color can now get the color from a list of hl groups ([a33f65d](https://github.com/folke/snacks.nvim/commit/a33f65d936a85efa9aaee9e44bcd70069134a816))
* **util:** util.spawn ([a76fe13](https://github.com/folke/snacks.nvim/commit/a76fe13148a899274484972a8705052bef4baa93))
* **words:** add `filter` function for user to disable specific filetypes ([#1296](https://github.com/folke/snacks.nvim/issues/1296)) ([d62e752](https://github.com/folke/snacks.nvim/commit/d62e7527a5e9608ab0033bc63a329baf8757ea6d))
### Bug Fixes
* **all:** better support for opening windows / pickers / ... on multiple tab pages. Closes [#1043](https://github.com/folke/snacks.nvim/issues/1043) ([8272c1c](https://github.com/folke/snacks.nvim/commit/8272c1c66f43390294debb24759c32627653aedb))
* **bigfile:** check that passed path is the one from the buffer ([8deea64](https://github.com/folke/snacks.nvim/commit/8deea64dba3b9b8f57e52bb6b0133263f6ff171f))
* **buffers:** use `"` mark for full buffer position when set. Closes [#1160](https://github.com/folke/snacks.nvim/issues/1160) ([7d350bc](https://github.com/folke/snacks.nvim/commit/7d350bc0c7e897ad0d7bd7fc9a470dabecab32ca))
* **compat:** correct Neovim 0.11 check ([448a55a](https://github.com/folke/snacks.nvim/commit/448a55a0e3c437bacc945c4ea98a6342ccb2b769))
* **dashboard:** allow dashboard to be the main editor window ([e3ead3c](https://github.com/folke/snacks.nvim/commit/e3ead3c648b3b6c8af0557c6412ae0307cc92018))
* **dashboard:** dashboard can be a main editor window ([f36c70a](https://github.com/folke/snacks.nvim/commit/f36c70a912c2893b10336b4645d3447264813a34))
* **dashboard:** use `Snacks.util.icon` for icons. Closes [#1192](https://github.com/folke/snacks.nvim/issues/1192) ([c2f06da](https://github.com/folke/snacks.nvim/commit/c2f06daeca6c3304d1e94225323dbe8c2f7f797d))
* **debug:** better args handling for debugging cmds ([48a3fed](https://github.com/folke/snacks.nvim/commit/48a3fed3c51390650d134bc5d76d15ace8d614ea))
* **explorer.git:** always at `.git` directory to ignored ([f7a35b8](https://github.com/folke/snacks.nvim/commit/f7a35b8214f393e2412adc0c8f2fe85d956c4b02))
* **explorer.git:** better git status watching ([09349ec](https://github.com/folke/snacks.nvim/commit/09349ecd44040666db9d4835994a378a9ff53e8c))
* **explorer.git:** dont reset cursor when git status is done updating ([bc87992](https://github.com/folke/snacks.nvim/commit/bc87992e712c29ef8e826f3550f9b8e3f1a9308d))
* **explorer.git:** vim.schedule git updates ([3aad761](https://github.com/folke/snacks.nvim/commit/3aad7616209951320d54f83dd7df35d5578ea61f))
* **explorer.tree:** fix linux ([6f5399b](https://github.com/folke/snacks.nvim/commit/6f5399b47c55f916fcc3a82dcc71cce0eb5d7c92))
* **explorer.tree:** symlink directories ([e5f1e91](https://github.com/folke/snacks.nvim/commit/e5f1e91249b468ff3a7d14a8650074c27f1fdb30))
* **explorer.watch:** pcall watcher, since it can give errors on windows ([af96818](https://github.com/folke/snacks.nvim/commit/af968181af6ce6a988765fe51558b2caefdcf863))
* **explorer:** always refresh state when opening the picker since changes might have happened that were not monitored ([c61114f](https://github.com/folke/snacks.nvim/commit/c61114fb32910863a543a4a7a1f63e9915983d26))
* **explorer:** call original `on_close`. Closes [#971](https://github.com/folke/snacks.nvim/issues/971) ([a0bee9f](https://github.com/folke/snacks.nvim/commit/a0bee9f662d4e22c6533e6544b4daedecd2aacc0))
* **explorer:** change grep in item dir keymap to leader-/. Closes [#1000](https://github.com/folke/snacks.nvim/issues/1000) ([9dfa276](https://github.com/folke/snacks.nvim/commit/9dfa276ea424a091f5d5bdc008aff127850441b2))
* **explorer:** check that picker is still open ([50fa1be](https://github.com/folke/snacks.nvim/commit/50fa1be38ee8366d79e1fa58b38abf31d3955033))
* **explorer:** disable follow for explorer search by default. No longer needed. Link directories may show as files then though, but that's not an issue. See [#960](https://github.com/folke/snacks.nvim/issues/960) ([b9a17d8](https://github.com/folke/snacks.nvim/commit/b9a17d82a726dc6cfd9a0b4f8566178708073808))
* **explorer:** dont focus first file when not searching ([3fd437c](https://github.com/folke/snacks.nvim/commit/3fd437ccd38d79b876154097149d130cdb01e653))
* **explorer:** dont process git when picker closed ([c255d9c](https://github.com/folke/snacks.nvim/commit/c255d9c6a02f070f0048c5eaa40921f71e9f2acb))
* **explorer:** last status for indent guides taking hidden / ignored files into account ([94bd2ef](https://github.com/folke/snacks.nvim/commit/94bd2eff74acd7faa78760bf8a55d9c269e99190))
* **explorer:** strip cwd from search text for explorer items ([38f392a](https://github.com/folke/snacks.nvim/commit/38f392a8ad75ced790f89c8ef43a91f98a2bb6e3))
* **explorer:** windows ([b560054](https://github.com/folke/snacks.nvim/commit/b56005466952b759a2f610e8b3c8263444402d76))
* **exporer.tree:** and now hopefully on windows ([ef9b12d](https://github.com/folke/snacks.nvim/commit/ef9b12d68010a931c76533925a8c730123241635))
* **gitbrowse:** add support for GitHub Enterprise Cloud repo url ([#1089](https://github.com/folke/snacks.nvim/issues/1089)) ([97fd57e](https://github.com/folke/snacks.nvim/commit/97fd57e8a0555023d2968354ca5f2b62de988103))
* **gitbrowse:** cwd for permalinks ([#1038](https://github.com/folke/snacks.nvim/issues/1038)) ([0bf47dc](https://github.com/folke/snacks.nvim/commit/0bf47dc319e4d6848366aff5c1a42cd08672d3e3))
* **gitbrowse:** previous logic always overwrote 'commit' ([#1127](https://github.com/folke/snacks.nvim/issues/1127)) ([2f3f080](https://github.com/folke/snacks.nvim/commit/2f3f080ede4d5f75c0b02d1698156648832cb974))
* **git:** use nul char as separator for git status ([8e0dfd2](https://github.com/folke/snacks.nvim/commit/8e0dfd285665bedf67441efe11c9c1318781826f))
* **health:** skip dot dirs... Closes [#1293](https://github.com/folke/snacks.nvim/issues/1293) ([aaed4a9](https://github.com/folke/snacks.nvim/commit/aaed4a94111ddfd9d23cdecb01e4ae53030c2c3e))
* **image.doc:** crop inline typst equations properly ([#1320](https://github.com/folke/snacks.nvim/issues/1320)) ([4f8b9eb](https://github.com/folke/snacks.nvim/commit/4f8b9ebf717b8acf41be02b0bd5a6d75f6038ea7))
* **image.doc:** fixed at_cursor. Closes [#1258](https://github.com/folke/snacks.nvim/issues/1258) ([76f5ee4](https://github.com/folke/snacks.nvim/commit/76f5ee4a1bd2566fc1460a1b11aa6a0bc36d2f5d))
* **image.health:** add check for ghost-script to render pdfs. Closes [#1248](https://github.com/folke/snacks.nvim/issues/1248) ([2b52d89](https://github.com/folke/snacks.nvim/commit/2b52d89508a448a1ca0c500afbd325e77023afc1))
* **image.health:** allow `convert` if `magick` not available ([4589e25](https://github.com/folke/snacks.nvim/commit/4589e2575894090a1e62aae11cf17856f5b84ea5))
* **image.hover:** close when needed. Closes [#1229](https://github.com/folke/snacks.nvim/issues/1229) ([1f9ba12](https://github.com/folke/snacks.nvim/commit/1f9ba127554bd3bd9780bfb925adfdf1e0ee73f9))
* **image.latex:** include doc packages for math rendering. Closes [#1262](https://github.com/folke/snacks.nvim/issues/1262) ([2ee6488](https://github.com/folke/snacks.nvim/commit/2ee64887c2be80c6b7b8fac4bb0617c827fde0d0))
* **image.latex:** inline math formulas. Closes [#1246](https://github.com/folke/snacks.nvim/issues/1246) ([9e422e1](https://github.com/folke/snacks.nvim/commit/9e422e12876002cba59ac4825bbeea89996e0196))
* **image.markdown:** fix image treesitter query. Closes [#1300](https://github.com/folke/snacks.nvim/issues/1300) ([830ac62](https://github.com/folke/snacks.nvim/commit/830ac62815e70f3db35ed7a295710c836578c6e3))
* **image.terminal:** set passthrough=all instead of on for tmux. Closes [#1249](https://github.com/folke/snacks.nvim/issues/1249) ([efcc25d](https://github.com/folke/snacks.nvim/commit/efcc25dcfa3ccaa7aa0a11b6cf065f8b8d32e485))
* **image:** added support for relative paths. Closes [#1143](https://github.com/folke/snacks.nvim/issues/1143) ([2ef6375](https://github.com/folke/snacks.nvim/commit/2ef63754b9c2a835a1d464766a22ba1bd4b16ea3))
* **image:** better cell size calculation for non-HDPI displays ([e146a66](https://github.com/folke/snacks.nvim/commit/e146a66cb767c60c6e84b2ab9a4522abdb6a5cc0))
* **image:** better image position caluclation. Closes [#1268](https://github.com/folke/snacks.nvim/issues/1268) ([5c0607e](https://github.com/folke/snacks.nvim/commit/5c0607e31a76317bc34f840fe8cc283b6a8d00c5))
* **image:** create cache dir ([f8c4e03](https://github.com/folke/snacks.nvim/commit/f8c4e03d025de17fb2302b3253bc72b8c0693c24))
* **image:** delay sending first image, to make ghostty happy. Closes [#1333](https://github.com/folke/snacks.nvim/issues/1333) ([9aa8cbb](https://github.com/folke/snacks.nvim/commit/9aa8cbb8031750fce640d476df67d88f60fd7c4e))
* **image:** delete terminal image on exit, just to be sure ([317bfac](https://github.com/folke/snacks.nvim/commit/317bfaca65dc53aa0a74885cf0c48c64fdfc30a9))
* **image:** do not attach to invalid buffers ([#1238](https://github.com/folke/snacks.nvim/issues/1238)) ([9a5e4de](https://github.com/folke/snacks.nvim/commit/9a5e4deaec451e77464759b4d78e7207caee14a7))
* **image:** don't fallback to `convert` on windows, since that is a system tool ([c1a1984](https://github.com/folke/snacks.nvim/commit/c1a1984fdb537017b6239d5592d1f7d25a77caa9))
* **image:** failed state ([5a37d83](https://github.com/folke/snacks.nvim/commit/5a37d838973f216822448a9dae935724754acbf0))
* **image:** fix disappearing images when changing colorscheme ([44e2f8e](https://github.com/folke/snacks.nvim/commit/44e2f8e573a8e4971badb8c7d3c1181fed7d5de3))
* **image:** fixed gsub for angle brackets. Closes [#1301](https://github.com/folke/snacks.nvim/issues/1301) ([beaa1c2](https://github.com/folke/snacks.nvim/commit/beaa1c2efcc598a9752b4536ef95606a10835aaa))
* **image:** fixup ([de3cba5](https://github.com/folke/snacks.nvim/commit/de3cba5158509b82e2f0ff9fc9101effccc1a863))
* **image:** handle file uppercase file extensions. Closes [#1202](https://github.com/folke/snacks.nvim/issues/1202) ([356f621](https://github.com/folke/snacks.nvim/commit/356f6216b90b85878af2c0134c8f3955349cae18))
* **image:** handle inline images at the same TS node, but that changed url. See [#1203](https://github.com/folke/snacks.nvim/issues/1203) ([86e3ddf](https://github.com/folke/snacks.nvim/commit/86e3ddf2e4f7a08d8172d2b2383eb51b4c0bbb5f))
* **image:** hide progress when finished loading in for wezterm ([526896a](https://github.com/folke/snacks.nvim/commit/526896ad3e736786c4520efce6f97c831677ca69))
* **image:** let text conversion continue on errors. See [#1303](https://github.com/folke/snacks.nvim/issues/1303) ([6d1cda4](https://github.com/folke/snacks.nvim/commit/6d1cda4a6df71f146daf171fbd6d95e53123a61e))
* **image:** mermaid theme. Closes [#1282](https://github.com/folke/snacks.nvim/issues/1282) ([8117fb4](https://github.com/folke/snacks.nvim/commit/8117fb4cbbaec9fbcfe7fe0b6c3a9c933d6c27ee))
* **image:** move assertion for src/content. See [#1276](https://github.com/folke/snacks.nvim/issues/1276) ([31e21cc](https://github.com/folke/snacks.nvim/commit/31e21ccef857e600a72fc059ee660fd134595f9d))
* **image:** only load image when the file exists. Closes [#1143](https://github.com/folke/snacks.nvim/issues/1143) ([298499d](https://github.com/folke/snacks.nvim/commit/298499dcb943ab49946e648ab79bf14868480560))
* **image:** only setup tmux pass-through on supported terminals. Fixes [#1054](https://github.com/folke/snacks.nvim/issues/1054) ([78e692c](https://github.com/folke/snacks.nvim/commit/78e692cd07b752e29e021635a70f353024d9c9b4))
* **image:** prevent image id collisions by interleaving the nvim pid hash in the image id ([31788ba](https://github.com/folke/snacks.nvim/commit/31788ba74e12081e79165f4447f6ff0f7e33b696))
* **image:** relax check for wezterm. Closes [#1076](https://github.com/folke/snacks.nvim/issues/1076) ([8d5ae25](https://github.com/folke/snacks.nvim/commit/8d5ae25806f88ec6c79f094eb7f3cc3413584309))
* **image:** remove `wezterm` from supported terminals, since they don't support unicode placeholders. Closes [#1063](https://github.com/folke/snacks.nvim/issues/1063) ([345260f](https://github.com/folke/snacks.nvim/commit/345260f39f70d63625e63d3c6771b2a8224f45c9))
* **image:** remove debug ([13863ea](https://github.com/folke/snacks.nvim/commit/13863ea25d169ef35f939b836c5edf8116042b89))
* **image:** remove ft check, since we use lang already. Closes [#1177](https://github.com/folke/snacks.nvim/issues/1177) ([4bcd26a](https://github.com/folke/snacks.nvim/commit/4bcd26aca8150a70b40b62673731046f85a205ff))
* **image:** remove some default latex packages ([f45dd6c](https://github.com/folke/snacks.nvim/commit/f45dd6c44c1319a2660b3b390d8d39ec5f2d73dc))
* **image:** remove test ([462578e](https://github.com/folke/snacks.nvim/commit/462578edb8fb13f0c158d2c9ac9479109dfdab31))
* **image:** return converted filename instead of original src. Closes [#1213](https://github.com/folke/snacks.nvim/issues/1213) ([118eab0](https://github.com/folke/snacks.nvim/commit/118eab0cfd4093bcd2b120378e5ea0685a333950))
* **image:** show full size when not showing image inline ([d7c8fd9](https://github.com/folke/snacks.nvim/commit/d7c8fd9a482a98e44442071d1d02342ebb256be4))
* **image:** support Neovim < 0.10 ([c067ffe](https://github.com/folke/snacks.nvim/commit/c067ffe86ce931702f82d2a1bd4c0ea98c3bfdd0))
* **image:** wrong return when trying second command ([74c4298](https://github.com/folke/snacks.nvim/commit/74c42985be207f6c9ed164bd1fae6be81fecd5bb))
* **input:** add missing hl group for input title ([#1164](https://github.com/folke/snacks.nvim/issues/1164)) ([7014b91](https://github.com/folke/snacks.nvim/commit/7014b91b927a384a7219629cf53e19573c832c23))
* **layout:** deep merge instead of shallow merge for window options. Closes [#1166](https://github.com/folke/snacks.nvim/issues/1166) ([27256cf](https://github.com/folke/snacks.nvim/commit/27256cf989475e3305713341930a7709e3670eac))
* **layout:** just hide any layouts below a backdrop. easier and looks better. ([0dab071](https://github.com/folke/snacks.nvim/commit/0dab071dbabaea642f42b2a13d5fc8f00a391963))
* **layout:** make sure width/height are at least `1`. Closes [#1090](https://github.com/folke/snacks.nvim/issues/1090) ([c554097](https://github.com/folke/snacks.nvim/commit/c5540974fa7a55720f0a1e55d0afe948c8f8fe0a))
* **layout:** take winbar into account for split layouts. Closes [#996](https://github.com/folke/snacks.nvim/issues/996) ([e4e5040](https://github.com/folke/snacks.nvim/commit/e4e5040d9b9b58ac3bc44a6709bbb5e55e58adea))
* **layout:** zindex weirdness on stable. Closes [#1180](https://github.com/folke/snacks.nvim/issues/1180) ([72ffb3d](https://github.com/folke/snacks.nvim/commit/72ffb3d1a2812671bb3487e490a3b1dd380bc234))
* **notifier:** keep notif when current buf is notif buf ([a13c891](https://github.com/folke/snacks.nvim/commit/a13c891a59ec0e67a75824fe1505a9e57fbfca0f))
* **picker.actions:** better set cmdline. Closes [#1291](https://github.com/folke/snacks.nvim/issues/1291) ([570c035](https://github.com/folke/snacks.nvim/commit/570c035b9417aaa2f02cadf00c83f5b968a70b6c))
* **picker.actions:** check that plugin exists before loading it in help. Closes [#1134](https://github.com/folke/snacks.nvim/issues/1134) ([e326de9](https://github.com/folke/snacks.nvim/commit/e326de9e0ce4f97c974359568617dc69a0cd6d67))
* **picker.actions:** don't delete empty buffer when its in another tabpage. Closes [#1005](https://github.com/folke/snacks.nvim/issues/1005) ([1491b54](https://github.com/folke/snacks.nvim/commit/1491b543ef1d8a0eb29a6ebc35db4fb808dcb47f))
* **picker.actions:** don't reuse_win in floating windows (like the picker preview) ([4b9ea98](https://github.com/folke/snacks.nvim/commit/4b9ea98007cddc0af80fa0479a86a1bf2e880b66))
* **picker.actions:** fix qflist position ([#911](https://github.com/folke/snacks.nvim/issues/911)) ([6d3c135](https://github.com/folke/snacks.nvim/commit/6d3c1352358e0e2980f9f323b6ca8a62415963bc))
* **picker.actions:** keymap confirm. Closes [#1252](https://github.com/folke/snacks.nvim/issues/1252) ([a9a84dd](https://github.com/folke/snacks.nvim/commit/a9a84dde2e474eb9ee57630ab2f6418bfe1b380f))
* **picker.actions:** reverse prev/next on select with a reversed list layout. Closes [#1124](https://github.com/folke/snacks.nvim/issues/1124) ([eae55e7](https://github.com/folke/snacks.nvim/commit/eae55e7ca3b7c33882884a439e12d26200403a66))
* **picker.actions:** use `vim.v.register` instead of `+` as default. ([9ab6637](https://github.com/folke/snacks.nvim/commit/9ab6637df061fb03c6c5ba937dee5bfef92a6633))
* **picker.buffers:** remove `dd` to delete buffer from input keymaps. Closes [#1193](https://github.com/folke/snacks.nvim/issues/1193) ([f311d1c](https://github.com/folke/snacks.nvim/commit/f311d1c83a25fbce63e322c72ad6c99a02f84a2f))
* **picker.colorscheme:** use wildignore. Closes [#969](https://github.com/folke/snacks.nvim/issues/969) ([ba8badf](https://github.com/folke/snacks.nvim/commit/ba8badfe74783e97934c21a69e0c44883092587f))
* **picker.config:** use `<c-w>HJKL` to move float to far left/bottom/top/right. Only in normal mode. ([34dd83c](https://github.com/folke/snacks.nvim/commit/34dd83c2572658c3f6140e8a8acc1bcfbf7cf32b))
* **picker.explorer:** ensure diagnostics can be disabled ([#1145](https://github.com/folke/snacks.nvim/issues/1145)) ([885c140](https://github.com/folke/snacks.nvim/commit/885c1409e898b2f6f806cdb31f6ca9d7d84b4ff3))
* **picker.git:** account for deleted files in git diff. Closes [#1001](https://github.com/folke/snacks.nvim/issues/1001) ([e9e2e69](https://github.com/folke/snacks.nvim/commit/e9e2e6976e3cc7c1110892c9c4a6882dd88ca6fd))
* **picker.git:** apply args to `git`, and not `git grep`. ([2e284e2](https://github.com/folke/snacks.nvim/commit/2e284e23d956767a50321de9c9bb0c005ea7c51f))
* **picker.git:** better handling of multi file staging ([b39a3ba](https://github.com/folke/snacks.nvim/commit/b39a3ba40af7c63e0cf0f5e6a2c242c6d3f22591))
* **picker.git:** correct root dir for git log ([c114a0d](https://github.com/folke/snacks.nvim/commit/c114a0da1a3984345c3035474b8a688592288c9d))
* **picker.git:** formatting of git log ([f320026](https://github.com/folke/snacks.nvim/commit/f32002607a5a81a1d25eda27b954fc6ba8e9fd1b))
* **picker.git:** handle git status renames. Closes [#1003](https://github.com/folke/snacks.nvim/issues/1003) ([93ad23a](https://github.com/folke/snacks.nvim/commit/93ad23a0abb4c712722b74e3c066e6b42881fc81))
* **picker.git:** preserve chronological order when matching ([#1216](https://github.com/folke/snacks.nvim/issues/1216)) ([8b19fd0](https://github.com/folke/snacks.nvim/commit/8b19fd0332835d48f7fe9fe203fa1c2b27976cd2))
* **picker.git:** properly handle file renames for git log. Closes [#1154](https://github.com/folke/snacks.nvim/issues/1154) ([9c436cb](https://github.com/folke/snacks.nvim/commit/9c436cb273c9b6984da275ba449fda2780d4fa2e))
* **picker.help:** make sure plugin is loaded for which we want to view the help ([3841a87](https://github.com/folke/snacks.nvim/commit/3841a8705a5e433d88539176d7c67a0ee6a9a92c))
* **picker.highlight:** lower case treesitter parser name ([3367983](https://github.com/folke/snacks.nvim/commit/336798345c1503689917a4a4a03a03a3da33119a))
* **picker.highlights:** close on confirm. Closes [#1096](https://github.com/folke/snacks.nvim/issues/1096) ([76f6e4f](https://github.com/folke/snacks.nvim/commit/76f6e4f81cff6f00c8ff027af9351f38ffa6d9f0))
* **picker.input:** prevent save dialog ([fcb2f50](https://github.com/folke/snacks.nvim/commit/fcb2f508dd6b58c98b781229db895d22c69e6f21))
* **picker.lines:** use original buf instead of current (which can be the picker on refresh) ([7ccf9c9](https://github.com/folke/snacks.nvim/commit/7ccf9c9d6934a76d5bd835bbd6cf1e764960f14e))
* **picker.list:** `list:view` should never transform reverse. Closes [#1016](https://github.com/folke/snacks.nvim/issues/1016) ([be781f9](https://github.com/folke/snacks.nvim/commit/be781f9fcb3d99db03c9c6979386565b65f8801b))
* **picker.list:** allow horizontal scrolling in the list ([572436b](https://github.com/folke/snacks.nvim/commit/572436bc3f16691172a6a0e94c8ffaf16b4170f0))
* **picker.list:** better wrap settings for when wrapping is enabled ([a542ea4](https://github.com/folke/snacks.nvim/commit/a542ea4d3487bd1aa449350c320bfdbe0c23083b))
* **picker.list:** correct offset calculation for large scrolloff. Closes [#1208](https://github.com/folke/snacks.nvim/issues/1208) ([f4ca368](https://github.com/folke/snacks.nvim/commit/f4ca368672e2231cc34abbd96208812cc6bb1aa1))
* **picker.list:** don't return non-matching items. Closes [#1133](https://github.com/folke/snacks.nvim/issues/1133) ([d07e7ac](https://github.com/folke/snacks.nvim/commit/d07e7ac6209356f74405bdd9d881fcacdf80f5ad))
* **picker.list:** don't show preview when target cursor/top not yet reached. Closes [#1204](https://github.com/folke/snacks.nvim/issues/1204) ([b02cb5e](https://github.com/folke/snacks.nvim/commit/b02cb5e8826179b385b870edbda1631213391cf1))
* **picker.list:** dont transform with reverse for resolving target. Closes [#1142](https://github.com/folke/snacks.nvim/issues/1142) ([0e36317](https://github.com/folke/snacks.nvim/commit/0e363177bd4a8037a127bc3fab6bf9d442da1123))
* **picker.list:** keep existing target if it exists unless `force = true`. Closes [#1152](https://github.com/folke/snacks.nvim/issues/1152) ([121e74e](https://github.com/folke/snacks.nvim/commit/121e74e4a5b7962ee370a8d8ae75d1c7b4c2e11c))
* **picker.list:** let user override wrap ([22da4bd](https://github.com/folke/snacks.nvim/commit/22da4bd5118a63268e6516ac74a8c3dc514218d3))
* **picker.list:** reset preview when no results. Closes [#1133](https://github.com/folke/snacks.nvim/issues/1133) ([f8bc119](https://github.com/folke/snacks.nvim/commit/f8bc1192cb3f740913f9198fabaf87b46434a926))
* **picker.lsp:** fix indent guides for sorted document symbols ([17360e4](https://github.com/folke/snacks.nvim/commit/17360e400905f50c5cc513b072c207233f825a73))
* **picker.lsp:** handle invalid lsp kinds. Closes [#1182](https://github.com/folke/snacks.nvim/issues/1182) ([f3cdd02](https://github.com/folke/snacks.nvim/commit/f3cdd02620bd5075e453be7451a260dbbee68cab))
* **picker.lsp:** only sort when not getting workspace symbols. Closes [#1071](https://github.com/folke/snacks.nvim/issues/1071) ([d607d2e](https://github.com/folke/snacks.nvim/commit/d607d2e050d9ab19ebe51db38aab807958f05bad))
* **picker.lsp:** sort document symbols by position ([cc22177](https://github.com/folke/snacks.nvim/commit/cc22177dcf288195022b0f739da3d00fcf56e3d7))
* **picker.matcher:** don't optimize pattern subsets when pattern has a negation ([a6b3d78](https://github.com/folke/snacks.nvim/commit/a6b3d7840baef2cc9207353a7c1a782fc8508af9))
* **picker.matcher:** only consider subset patterns that contain only whitespace and alpha numeric chars. Closes [#1013](https://github.com/folke/snacks.nvim/issues/1013) ([fcf2311](https://github.com/folke/snacks.nvim/commit/fcf2311c0e68d91b71bc1be114ad13e84cd7771d))
* **picker.notifications:** close on confirm. Closes [#1092](https://github.com/folke/snacks.nvim/issues/1092) ([a8dda99](https://github.com/folke/snacks.nvim/commit/a8dda993e5f2a0262a2be1585511a6df7e5dcb8c))
* **picker.preview:** clear namespace on reset ([a6d418e](https://github.com/folke/snacks.nvim/commit/a6d418e877033de9a12288cdbf7e78d2f0f5d661))
* **picker.preview:** don't clear preview state on close so that colorscheme can be restored. Closes [#932](https://github.com/folke/snacks.nvim/issues/932) ([9688bd9](https://github.com/folke/snacks.nvim/commit/9688bd92cda4fbe57210bbdfbb9c940516382f9a))
* **picker.preview:** don't reset preview when filtering and the same item is previewed ([c8285c2](https://github.com/folke/snacks.nvim/commit/c8285c2ca2c4805019e105967f17e60f82faf106))
* **picker.preview:** fix newlines before setting lines of a buffer ([62c2c62](https://github.com/folke/snacks.nvim/commit/62c2c62671cf88ace1bd9fdd26411158d7072e0b))
* **picker.preview:** hide line numbers / status column for directory preview. Closes [#1029](https://github.com/folke/snacks.nvim/issues/1029) ([f9aca86](https://github.com/folke/snacks.nvim/commit/f9aca86bf3ddbbd56cb53f71250c301f90af35a2))
* **picker.preview:** preview for uris. Closes [#1075](https://github.com/folke/snacks.nvim/issues/1075) ([c1f93e2](https://github.com/folke/snacks.nvim/commit/c1f93e25bb927dce2e1eb46610b6347460f0c69b))
* **picker.preview:** update titles on layout update. Closes [#1113](https://github.com/folke/snacks.nvim/issues/1113) ([89b3ce1](https://github.com/folke/snacks.nvim/commit/89b3ce11ca700badc92af0e1a37be2e19b79cd55))
* **picker.preview:** work-around for Neovim's messy window-local options (that are never truly local). Closes [#1100](https://github.com/folke/snacks.nvim/issues/1100) ([e5960d8](https://github.com/folke/snacks.nvim/commit/e5960d8e32ed2771a1d84ce4532bf0e2dc4dc8ca))
* **picker.proc:** don't close stdout on proc exit, since it might still contain buffered output. Closes [#966](https://github.com/folke/snacks.nvim/issues/966) ([3b7021e](https://github.com/folke/snacks.nvim/commit/3b7021e7fdf88e13fdf06643ae9a7224e1291495))
* **picker.proc:** make sure to emit the last line when done. Closes [#1095](https://github.com/folke/snacks.nvim/issues/1095) ([b94926e](https://github.com/folke/snacks.nvim/commit/b94926e5cc697c54c73e7c2b3759c8432afca91d))
* **picker.projects:** add custom project dirs ([c7293bd](https://github.com/folke/snacks.nvim/commit/c7293bdfe7664eca6f49816795ffb7f2af5b8302))
* **picker.projects:** use fd or fdfind ([270250c](https://github.com/folke/snacks.nvim/commit/270250cf4646dbb16c3d1a453257a3f024b8f362))
* **picker.watch:** schedule_wrap. Closes [#1049](https://github.com/folke/snacks.nvim/issues/1049) ([f489d61](https://github.com/folke/snacks.nvim/commit/f489d61f54c3a32c35c439a16ff0f097dbe93028))
* **picker.zoxide:** directory icon ([#1031](https://github.com/folke/snacks.nvim/issues/1031)) ([33dbebb](https://github.com/folke/snacks.nvim/commit/33dbebb75395b5e80e441214985c0d9143d323d6))
* **picker:** `nil` on `:quit`. Closes [#1107](https://github.com/folke/snacks.nvim/issues/1107) ([1219f5e](https://github.com/folke/snacks.nvim/commit/1219f5e43baf1c17e305d605d3db8972aae19bf5))
* **picker:** `opts.focus = false` now works again ([031f9e9](https://github.com/folke/snacks.nvim/commit/031f9e96fb85cd417868ab2ba03946cb98fd06c8))
* **picker:** closed check for show preview. Closes [#1181](https://github.com/folke/snacks.nvim/issues/1181) ([c1f4d30](https://github.com/folke/snacks.nvim/commit/c1f4d3032529a7af3d0863c775841f6dc13e03d6))
* **picker:** consider zen windows as main. Closes [#973](https://github.com/folke/snacks.nvim/issues/973) ([b1db65a](https://github.com/folke/snacks.nvim/commit/b1db65ac61127581cbe3bca8e54a8faf8ce16e5f))
* **picker:** disabled preview main ([9fe43bd](https://github.com/folke/snacks.nvim/commit/9fe43bdf9b6c04b129e84bd7c2cb7ebd8e04bfae))
* **picker:** don't render list when closed. See [#1308](https://github.com/folke/snacks.nvim/issues/1308) ([681ae6e](https://github.com/folke/snacks.nvim/commit/681ae6e3078503d2c4cc137a492782a0ee3977b3))
* **picker:** exit insert mode before closing with `<c-c>` to prevent cursor shifting left. Close [#956](https://github.com/folke/snacks.nvim/issues/956) ([71eae96](https://github.com/folke/snacks.nvim/commit/71eae96bfa5ccafad9966a7bc40982ebe05d8f5d))
* **picker:** go back to last window on cancel instead of main ([4551f49](https://github.com/folke/snacks.nvim/commit/4551f499c7945036761fd48927cc07b9720fce56))
* **picker:** initial preview state when main ([cd6e336](https://github.com/folke/snacks.nvim/commit/cd6e336ec0dc8b95e7a75c86cba297a16929370e))
* **picker:** only show extmark errors when debug is enabled. Closes [#988](https://github.com/folke/snacks.nvim/issues/988) ([f6d9af7](https://github.com/folke/snacks.nvim/commit/f6d9af7410963780c48772f7bd9ee3f5e7be8599))
* **picker:** remove debug ([a23b10e](https://github.com/folke/snacks.nvim/commit/a23b10e6cafeae7b9e06be47ba49295d0c921a97))
* **picker:** remove debug :) ([3d53a73](https://github.com/folke/snacks.nvim/commit/3d53a7364e438a7652bb6b90b95c334c32cab938))
* **picker:** save toggles for resume. Closes [#1085](https://github.com/folke/snacks.nvim/issues/1085) ([e390713](https://github.com/folke/snacks.nvim/commit/e390713ac6f92d0076f38b518645b55222ecf4d1))
* **picker:** sometimes main layout win gets selected. Closes [#1015](https://github.com/folke/snacks.nvim/issues/1015) ([4799f82](https://github.com/folke/snacks.nvim/commit/4799f829683272b06ad9bf8b8e9816f28b3a46ef))
* **picker:** update titles last on show. Closes [#1113](https://github.com/folke/snacks.nvim/issues/1113) ([96796db](https://github.com/folke/snacks.nvim/commit/96796db21e474eff0d0ddeee2afa6c2c346756c7))
* **picker:** vim.ui.select callback is called when canceling selection ([#1115](https://github.com/folke/snacks.nvim/issues/1115)) ([4c3bfa2](https://github.com/folke/snacks.nvim/commit/4c3bfa29f3122c4fb855c1adaef01cf22612624a))
* **scroll:** added `keepjumps` ([7161dc1](https://github.com/folke/snacks.nvim/commit/7161dc1b570849324bb2b0b808c6f2cc46ef6f84))
* **statuscolumn:** only execute `za` when fold exists ([#1093](https://github.com/folke/snacks.nvim/issues/1093)) ([345eeb6](https://github.com/folke/snacks.nvim/commit/345eeb69417f5568930f283e3be01f0ef55bee63))
* **terminal:** check for 0.11 ([6e45829](https://github.com/folke/snacks.nvim/commit/6e45829879da987cb4ed01d3098eb2507da72343))
* **terminal:** softer check for using jobstart with `term=true` instead of deprecated termopen ([544a2ae](https://github.com/folke/snacks.nvim/commit/544a2ae01c28056629a0c90f8d0ff40995c84e42))
* **toggle:** hide toggle when real keymap does not exist. Closes [#378](https://github.com/folke/snacks.nvim/issues/378) ([ee9e617](https://github.com/folke/snacks.nvim/commit/ee9e6179fe18a2bf36ebb5e81ddf1052e04577dc))
* **win:** apply win-local window options for new buffers displayed in a window. Fixes [#925](https://github.com/folke/snacks.nvim/issues/925) ([cb99c46](https://github.com/folke/snacks.nvim/commit/cb99c46fa171134f582f6b13bef32f6d25ebda59))
* **win:** better handling when the command window is open. Closes [#1245](https://github.com/folke/snacks.nvim/issues/1245) ([7720410](https://github.com/folke/snacks.nvim/commit/77204102a1f5869bf37d8ccbc5e8e0769cfe8db4))
* **win:** call `on_close` before actually closing so that prev win can be set. Closes [#962](https://github.com/folke/snacks.nvim/issues/962) ([a1cb54c](https://github.com/folke/snacks.nvim/commit/a1cb54cc9e579c53bbd4b96949acf2341b31a3ee))
* **words:** default count to 1. Closes [#1307](https://github.com/folke/snacks.nvim/issues/1307) ([45ec90b](https://github.com/folke/snacks.nvim/commit/45ec90bdd91d7730b81662ee3bfcdd4a88ed908f))
* **zen:** properly get zoom options. Closes [#1207](https://github.com/folke/snacks.nvim/issues/1207) ([3100333](https://github.com/folke/snacks.nvim/commit/3100333fdb777853c77aeac46b92fcdaba8e3e57))
### Performance Improvements
* **dashboard:** speed up filtering for recent_files ([#1250](https://github.com/folke/snacks.nvim/issues/1250)) ([b91f417](https://github.com/folke/snacks.nvim/commit/b91f417670e8f35ac96a2ebdecceeafdcc43ba4a))
* **explorer:** disable watchdirs fallback watcher ([5d34380](https://github.com/folke/snacks.nvim/commit/5d34380310861cd42e32ce0865bd8cded9027b41))
* **explorer:** early exit for tree calculation ([1a30610](https://github.com/folke/snacks.nvim/commit/1a30610ab78cce8bb184166de2ef35ee2ca1987a))
* **explorer:** no need to get git status with `-uall`. Closes [#983](https://github.com/folke/snacks.nvim/issues/983) ([bc087d3](https://github.com/folke/snacks.nvim/commit/bc087d36d6126ccf25f8bb3ead405ec32547d85d))
* **explorer:** only update tree if git status actually changed ([5a2acf8](https://github.com/folke/snacks.nvim/commit/5a2acf82b2aff0b6f7121ce953c5754de6fd1e01))
* **explorer:** only update tree when diagnostics actually changed ([1142f46](https://github.com/folke/snacks.nvim/commit/1142f46a27358c8f48023382389a8b31c9628b6b))
* **image.convert:** identify during convert instead of calling identify afterwards ([7b7f42f](https://github.com/folke/snacks.nvim/commit/7b7f42fb3bee6083677d66b301424c26b4ff41c2))
* **image:** no need to run identify before convert for local files ([e2d9941](https://github.com/folke/snacks.nvim/commit/e2d99418968b0dc690ca6b56dac688d70e9b5e40))
* **picker.list:** only re-render when visible items changed ([c72e62e](https://github.com/folke/snacks.nvim/commit/c72e62ef9012161ec6cd86aa749d780f77d1cc87))
* **picker:** cache treesitter line highlights ([af31c31](https://github.com/folke/snacks.nvim/commit/af31c312872cab2a47e17ed2ee67bf5940a522d4))
* **picker:** cache wether ts lang exists and disable smooth scrolling on big files ([719b36f](https://github.com/folke/snacks.nvim/commit/719b36fa70c35a7015537aa0bfd2956f6128c87d))
* **scroll:** much better/easier/faster method for vertical cursor positioning ([a3194d9](https://github.com/folke/snacks.nvim/commit/a3194d95199c4699a4da0d4c425a19544ed8d670))
### Documentation
* docgen ([b503e3e](https://github.com/folke/snacks.nvim/commit/b503e3ee9fdd57202e5815747e67d1f6259468a4))
## [2.20.0](https://github.com/folke/snacks.nvim/compare/v2.19.0...v2.20.0) (2025-02-08)
### Features
* **picker.undo:** `ctrl+y` to yank added lines, `ctrl+shift+y` to yank deleted lines ([3baf95d](https://github.com/folke/snacks.nvim/commit/3baf95d3a1005105b57ce53644ff6224ee3afa1c))
* **picker:** added treesitter symbols picker ([a6beb0f](https://github.com/folke/snacks.nvim/commit/a6beb0f280d3f43513998882faf199acf3818ddf))
* **terminal:** added `Snacks.terminal.list()`. Closes [#421](https://github.com/folke/snacks.nvim/issues/421). Closes [#759](https://github.com/folke/snacks.nvim/issues/759) ([73c4b62](https://github.com/folke/snacks.nvim/commit/73c4b628963004760ccced0192d1c2633c9e3657))
### Bug Fixes
* **explorer:** change grep in item dir keymap to leader-/. Closes [#1000](https://github.com/folke/snacks.nvim/issues/1000) ([9dfa276](https://github.com/folke/snacks.nvim/commit/9dfa276ea424a091f5d5bdc008aff127850441b2))
* **layout:** take winbar into account for split layouts. Closes [#996](https://github.com/folke/snacks.nvim/issues/996) ([e4e5040](https://github.com/folke/snacks.nvim/commit/e4e5040d9b9b58ac3bc44a6709bbb5e55e58adea))
* **picker.git:** account for deleted files in git diff. Closes [#1001](https://github.com/folke/snacks.nvim/issues/1001) ([e9e2e69](https://github.com/folke/snacks.nvim/commit/e9e2e6976e3cc7c1110892c9c4a6882dd88ca6fd))
* **picker.git:** handle git status renames. Closes [#1003](https://github.com/folke/snacks.nvim/issues/1003) ([93ad23a](https://github.com/folke/snacks.nvim/commit/93ad23a0abb4c712722b74e3c066e6b42881fc81))
* **picker.lines:** use original buf instead of current (which can be the picker on refresh) ([7ccf9c9](https://github.com/folke/snacks.nvim/commit/7ccf9c9d6934a76d5bd835bbd6cf1e764960f14e))
* **picker.proc:** don't close stdout on proc exit, since it might still contain buffered output. Closes [#966](https://github.com/folke/snacks.nvim/issues/966) ([3b7021e](https://github.com/folke/snacks.nvim/commit/3b7021e7fdf88e13fdf06643ae9a7224e1291495))
## [2.19.0](https://github.com/folke/snacks.nvim/compare/v2.18.0...v2.19.0) (2025-02-07)
### Features
* **bigfile:** configurable average line length (default = 1000). Useful for minified files. Closes [#576](https://github.com/folke/snacks.nvim/issues/576). Closes [#372](https://github.com/folke/snacks.nvim/issues/372) ([7fa92a2](https://github.com/folke/snacks.nvim/commit/7fa92a24501fa85b567c130b4e026f9ca1efed17))
* **explorer:** add hl groups for ignored / hidden files. Closes [#887](https://github.com/folke/snacks.nvim/issues/887) ([85e1b34](https://github.com/folke/snacks.nvim/commit/85e1b343b0cc6d2facc0763d9e1c1de4b63b99ac))
* **explorer:** added ctrl+f to grep in the item's directory ([0454b21](https://github.com/folke/snacks.nvim/commit/0454b21165cb84d2f59a1daf6226de065c90d4f7))
* **explorer:** added ctrl+t to open a terminal in the item's directory ([81f9006](https://github.com/folke/snacks.nvim/commit/81f90062c50430c1bad9546fcb65c3e43a76be9b))
* **explorer:** added diagnostics file/directory status ([7f1b60d](https://github.com/folke/snacks.nvim/commit/7f1b60d5576345af5e7b990f3a9e4bca49cd3686))
* **explorer:** added quick nav with `[`, `]` with `d/w/e` for diagnostics ([d1d5585](https://github.com/folke/snacks.nvim/commit/d1d55850ecb4aac1396c314a159db1e90a34bd79))
* **explorer:** added support for live search ([82c4a50](https://github.com/folke/snacks.nvim/commit/82c4a50985c9bb9f4b1d598f10a30e1122a35212))
* **explorer:** allow disabling untracked git status. Closes [#983](https://github.com/folke/snacks.nvim/issues/983) ([a3b083b](https://github.com/folke/snacks.nvim/commit/a3b083b8443b1ae1299747fdac8da51c3160835b))
* **explorer:** different hl group for broken links ([1989921](https://github.com/folke/snacks.nvim/commit/1989921466e6b5234ae8f71add41b8defd55f732))
* **explorer:** disable fuzzy searches by default for explorer since it's too noisy and we can't sort on score due to tree view ([b07788f](https://github.com/folke/snacks.nvim/commit/b07788f14a28daa8d0b387c1258f8f348f47420f))
* **explorer:** file watcher when explorer is open ([6936c14](https://github.com/folke/snacks.nvim/commit/6936c1491d4aa8ffb4448acca677589a1472bb3a))
* **explorer:** file watching that works on all platforms ([8399465](https://github.com/folke/snacks.nvim/commit/8399465872c51fab54ad5d02eb315e258ec96ed1))
* **explorer:** focus on first file when searching in the explorer ([1d4bea4](https://github.com/folke/snacks.nvim/commit/1d4bea4a9ee8a5258c6ae085ac66dd5cc05a9749))
* **explorer:** git index watcher ([4c12475](https://github.com/folke/snacks.nvim/commit/4c12475e80528d8d48b9584d78d645e4a51c3298))
* **explorer:** rewrite that no longer depends on `fd` for exploring ([6149a7b](https://github.com/folke/snacks.nvim/commit/6149a7babbd2c6d9cd924bb70102d80a7f045287))
* **explorer:** show symlink target ([dfa79e0](https://github.com/folke/snacks.nvim/commit/dfa79e04436ebfdc83ba71c0048fc1636b4de5aa))
* **matcher:** call on_match after setting score ([23ce529](https://github.com/folke/snacks.nvim/commit/23ce529fb663337f9dc17ca08aa601b172469031))
* **picker.git:** add confirmation before deleting a git branch ([#951](https://github.com/folke/snacks.nvim/issues/951)) ([337a3ae](https://github.com/folke/snacks.nvim/commit/337a3ae7eebb95020596f15a349a85d2f6be31a4))
* **picker.git:** add create and delete branch to git_branches ([#909](https://github.com/folke/snacks.nvim/issues/909)) ([8676c40](https://github.com/folke/snacks.nvim/commit/8676c409e148e28eff93c114aca0c1bf3d42281a))
* **picker.lazy:** don't use `grep`. Parse spec files manually. Closes [#972](https://github.com/folke/snacks.nvim/issues/972) ([0928007](https://github.com/folke/snacks.nvim/commit/09280078e8339f018be5249fe0e1d7b9d32db7f7))
* **picker.lsp:** use existing buffers for preview when opened ([d4e6353](https://github.com/folke/snacks.nvim/commit/d4e63531c9fba63ded6fb470a5d53c98af110478))
* **picker.matcher:** internal `on_match` ([47b3b69](https://github.com/folke/snacks.nvim/commit/47b3b69570271b12bbd72b9dbcfbd445b915beca))
* **picker.preview:** allow confguring `preview = {main = true, enabled = false}` ([1839c65](https://github.com/folke/snacks.nvim/commit/1839c65f6784bedb7ae96a84ee741fa5c0023226))
* **picker.undo:** added ctrl+y to yank added lines from undo ([811a24c](https://github.com/folke/snacks.nvim/commit/811a24cc16a8e9b7ec947c95b73e1fe05e4692d1))
* **picker:** `picker:dir()` to get the dir of the item (when a directory) or it's parent (when a file) ([969608a](https://github.com/folke/snacks.nvim/commit/969608ab795718cc23299247bf4ea0a199fcca3f))
* **picker:** added `git_grep` picker. Closes [#986](https://github.com/folke/snacks.nvim/issues/986) ([2dc9016](https://github.com/folke/snacks.nvim/commit/2dc901634b250059cc9b7129bdeeedd24520b86c))
* **picker:** allow configuring file icon width. Closes [#981](https://github.com/folke/snacks.nvim/issues/981) ([52c1086](https://github.com/folke/snacks.nvim/commit/52c1086ecdf410dfec3317144d46de7c6f86c1ad))
* **picker:** better checkhealth ([b773368](https://github.com/folke/snacks.nvim/commit/b773368f8aa6e84a68e979f0e335d23de71f405a))
* **picker:** get filetype from modeline when needed. Closes [#987](https://github.com/folke/snacks.nvim/issues/987) ([5af04ab](https://github.com/folke/snacks.nvim/commit/5af04ab6672ae38bf7d72427e75f925615f93904))
* **picker:** opts.on_close ([6235f44](https://github.com/folke/snacks.nvim/commit/6235f44b115c45dd009c45b81a52f8d99863efaa))
* **picker:** pin picker as a split to left/bottom/top/right with `ctrl+z+(hjkl)` ([27cba53](https://github.com/folke/snacks.nvim/commit/27cba535a6763cbca3f3162c5c4bb48c6f382005))
* **rename:** add `old` to `on_rename` callback ([455228e](https://github.com/folke/snacks.nvim/commit/455228ed3a07bf3aee34a75910785b9978f53da6))
* **scope:** allow injected languages to be parsed by treesitter ([#823](https://github.com/folke/snacks.nvim/issues/823)) ([aba21dd](https://github.com/folke/snacks.nvim/commit/aba21ddc712b12db8469680dd7f2080063cb6d5c))
* **statuscolumn:** added mouse click handler to open/close folds. Closes [#968](https://github.com/folke/snacks.nvim/issues/968) ([98a7b64](https://github.com/folke/snacks.nvim/commit/98a7b647c9e245ef02d57d566bf8461c2f7beb56))
* **terminal:** added `start_insert` ([64129e4](https://github.com/folke/snacks.nvim/commit/64129e4c3c5b247c61b1f46bc0faaa1e69e7eef8))
* **terminal:** auto_close and auto_insert. Closes [#965](https://github.com/folke/snacks.nvim/issues/965) ([bb76cae](https://github.com/folke/snacks.nvim/commit/bb76cae87e81a871435570b91c8c6f6e27eb9955))
### Bug Fixes
* **bigfile:** check that passed path is the one from the buffer ([8deea64](https://github.com/folke/snacks.nvim/commit/8deea64dba3b9b8f57e52bb6b0133263f6ff171f))
* **explorer.git:** better git status watching ([09349ec](https://github.com/folke/snacks.nvim/commit/09349ecd44040666db9d4835994a378a9ff53e8c))
* **explorer.git:** dont reset cursor when git status is done updating ([bc87992](https://github.com/folke/snacks.nvim/commit/bc87992e712c29ef8e826f3550f9b8e3f1a9308d))
* **explorer.git:** vim.schedule git updates ([3aad761](https://github.com/folke/snacks.nvim/commit/3aad7616209951320d54f83dd7df35d5578ea61f))
* **explorer.tree:** fix linux ([6f5399b](https://github.com/folke/snacks.nvim/commit/6f5399b47c55f916fcc3a82dcc71cce0eb5d7c92))
* **explorer.tree:** symlink directories ([e5f1e91](https://github.com/folke/snacks.nvim/commit/e5f1e91249b468ff3a7d14a8650074c27f1fdb30))
* **explorer.watch:** pcall watcher, since it can give errors on windows ([af96818](https://github.com/folke/snacks.nvim/commit/af968181af6ce6a988765fe51558b2caefdcf863))
* **explorer:** always refresh state when opening the picker since changes might have happened that were not monitored ([c61114f](https://github.com/folke/snacks.nvim/commit/c61114fb32910863a543a4a7a1f63e9915983d26))
* **explorer:** call original `on_close`. Closes [#971](https://github.com/folke/snacks.nvim/issues/971) ([a0bee9f](https://github.com/folke/snacks.nvim/commit/a0bee9f662d4e22c6533e6544b4daedecd2aacc0))
* **explorer:** check that picker is still open ([50fa1be](https://github.com/folke/snacks.nvim/commit/50fa1be38ee8366d79e1fa58b38abf31d3955033))
* **explorer:** clear cache after action. Fixes [#890](https://github.com/folke/snacks.nvim/issues/890) ([34097ff](https://github.com/folke/snacks.nvim/commit/34097ff37e0fb53771bbe3bf927048d06b4576f6))
* **explorer:** clear selection after delete. Closes [#898](https://github.com/folke/snacks.nvim/issues/898) ([44733ea](https://github.com/folke/snacks.nvim/commit/44733eaa78fb899dc3b3d72d7cac6f447356a287))
* **explorer:** disable follow for explorer search by default. No longer needed. Link directories may show as files then though, but that's not an issue. See [#960](https://github.com/folke/snacks.nvim/issues/960) ([b9a17d8](https://github.com/folke/snacks.nvim/commit/b9a17d82a726dc6cfd9a0b4f8566178708073808))
* **explorer:** don't use --absolute-path option, since that resolves paths to realpath. See [#901](https://github.com/folke/snacks.nvim/issues/901). See [#905](https://github.com/folke/snacks.nvim/issues/905). See [#904](https://github.com/folke/snacks.nvim/issues/904) ([97570d2](https://github.com/folke/snacks.nvim/commit/97570d23ac42dac813c5eb49637381fa3b728246))
* **explorer:** dont focus first file when not searching ([3fd437c](https://github.com/folke/snacks.nvim/commit/3fd437ccd38d79b876154097149d130cdb01e653))
* **explorer:** dont process git when picker closed ([c255d9c](https://github.com/folke/snacks.nvim/commit/c255d9c6a02f070f0048c5eaa40921f71e9f2acb))
* **explorer:** last status for indent guides taking hidden / ignored files into account ([94bd2ef](https://github.com/folke/snacks.nvim/commit/94bd2eff74acd7faa78760bf8a55d9c269e99190))
* **explorer:** strip cwd from search text for explorer items ([38f392a](https://github.com/folke/snacks.nvim/commit/38f392a8ad75ced790f89c8ef43a91f98a2bb6e3))
* **explorer:** windows ([b560054](https://github.com/folke/snacks.nvim/commit/b56005466952b759a2f610e8b3c8263444402d76))
* **exporer.tree:** and now hopefully on windows ([ef9b12d](https://github.com/folke/snacks.nvim/commit/ef9b12d68010a931c76533925a8c730123241635))
* **git:** use nul char as separator for git status ([8e0dfd2](https://github.com/folke/snacks.nvim/commit/8e0dfd285665bedf67441efe11c9c1318781826f))
* **health:** better health checks for picker. Closes [#917](https://github.com/folke/snacks.nvim/issues/917) ([427f036](https://github.com/folke/snacks.nvim/commit/427f036c6532097859d9177f32ccb037803abaa4))
* **picker.actions:** close preview before buffer delete ([762821e](https://github.com/folke/snacks.nvim/commit/762821e420cef56b03b6897b008454eefe68fd1d))
* **picker.actions:** don't reuse_win in floating windows (like the picker preview) ([4b9ea98](https://github.com/folke/snacks.nvim/commit/4b9ea98007cddc0af80fa0479a86a1bf2e880b66))
* **picker.actions:** fix qflist position ([#911](https://github.com/folke/snacks.nvim/issues/911)) ([6d3c135](https://github.com/folke/snacks.nvim/commit/6d3c1352358e0e2980f9f323b6ca8a62415963bc))
* **picker.actions:** get win after splitting or tabnew. Fixes [#896](https://github.com/folke/snacks.nvim/issues/896) ([95d3e7f](https://github.com/folke/snacks.nvim/commit/95d3e7f96182e4cc8aa0c05a616a61eba9a77366))
* **picker.colorscheme:** use wildignore. Closes [#969](https://github.com/folke/snacks.nvim/issues/969) ([ba8badf](https://github.com/folke/snacks.nvim/commit/ba8badfe74783e97934c21a69e0c44883092587f))
* **picker.db:** better script to download sqlite3 on windows. See [#918](https://github.com/folke/snacks.nvim/issues/918) ([84d1a92](https://github.com/folke/snacks.nvim/commit/84d1a92faba55a470a6c52a1aca86988b0c57869))
* **picker.finder:** correct check if filter changed ([52bc24c](https://github.com/folke/snacks.nvim/commit/52bc24c23256246e863992dfcc3172c527254f55))
* **picker.input:** fixed startinsert weirdness with prompt buffers (again) ([c030827](https://github.com/folke/snacks.nvim/commit/c030827d7ad3fe7117bf81c0db1613c958015211))
* **picker.input:** set as not modified when setting input through API ([54a041f](https://github.com/folke/snacks.nvim/commit/54a041f7fca05234379d7bceff6b036acc679cdc))
* **picker.list:** better wrap settings for when wrapping is enabled ([a542ea4](https://github.com/folke/snacks.nvim/commit/a542ea4d3487bd1aa449350c320bfdbe0c23083b))
* **picker.list:** let user override wrap ([22da4bd](https://github.com/folke/snacks.nvim/commit/22da4bd5118a63268e6516ac74a8c3dc514218d3))
* **picker.list:** nil check ([c22e46a](https://github.com/folke/snacks.nvim/commit/c22e46ab9a1f1416368759e0979bc5c0c64c0084))
* **picker.lsp:** fix indent guides for sorted document symbols ([17360e4](https://github.com/folke/snacks.nvim/commit/17360e400905f50c5cc513b072c207233f825a73))
* **picker.lsp:** sort document symbols by position ([cc22177](https://github.com/folke/snacks.nvim/commit/cc22177dcf288195022b0f739da3d00fcf56e3d7))
* **picker.matcher:** don't optimize pattern subsets when pattern has a negation ([a6b3d78](https://github.com/folke/snacks.nvim/commit/a6b3d7840baef2cc9207353a7c1a782fc8508af9))
* **picker.preview:** don't clear preview state on close so that colorscheme can be restored. Closes [#932](https://github.com/folke/snacks.nvim/issues/932) ([9688bd9](https://github.com/folke/snacks.nvim/commit/9688bd92cda4fbe57210bbdfbb9c940516382f9a))
* **picker.preview:** update main preview when changing the layout ([604c603](https://github.com/folke/snacks.nvim/commit/604c603dfafdac0c2edc725ff8bcdcc395100028))
* **picker.projects:** add custom project dirs ([c7293bd](https://github.com/folke/snacks.nvim/commit/c7293bdfe7664eca6f49816795ffb7f2af5b8302))
* **picker.projects:** use fd or fdfind ([270250c](https://github.com/folke/snacks.nvim/commit/270250cf4646dbb16c3d1a453257a3f024b8f362))
* **picker.select:** default height shows just the items. See [#902](https://github.com/folke/snacks.nvim/issues/902) ([c667622](https://github.com/folke/snacks.nvim/commit/c667622fb7569a020195e3e35c1405e4a1fa0e7e))
* **picker:** better handling when entering the root layout window. Closes [#894](https://github.com/folke/snacks.nvim/issues/894) ([e294fd8](https://github.com/folke/snacks.nvim/commit/e294fd8a273b1f5622c8a3259802d91a1ed01110))
* **picker:** consider zen windows as main. Closes [#973](https://github.com/folke/snacks.nvim/issues/973) ([b1db65a](https://github.com/folke/snacks.nvim/commit/b1db65ac61127581cbe3bca8e54a8faf8ce16e5f))
* **picker:** disabled preview main ([9fe43bd](https://github.com/folke/snacks.nvim/commit/9fe43bdf9b6c04b129e84bd7c2cb7ebd8e04bfae))
* **picker:** exit insert mode before closing with `<c-c>` to prevent cursor shifting left. Close [#956](https://github.com/folke/snacks.nvim/issues/956) ([71eae96](https://github.com/folke/snacks.nvim/commit/71eae96bfa5ccafad9966a7bc40982ebe05d8f5d))
* **picker:** initial preview state when main ([cd6e336](https://github.com/folke/snacks.nvim/commit/cd6e336ec0dc8b95e7a75c86cba297a16929370e))
* **picker:** only show extmark errors when debug is enabled. Closes [#988](https://github.com/folke/snacks.nvim/issues/988) ([f6d9af7](https://github.com/folke/snacks.nvim/commit/f6d9af7410963780c48772f7bd9ee3f5e7be8599))
* **win:** apply win-local window options for new buffers displayed in a window. Fixes [#925](https://github.com/folke/snacks.nvim/issues/925) ([cb99c46](https://github.com/folke/snacks.nvim/commit/cb99c46fa171134f582f6b13bef32f6d25ebda59))
* **win:** better handling of alien buffers opening in managed windows. See [#886](https://github.com/folke/snacks.nvim/issues/886) ([c8430fd](https://github.com/folke/snacks.nvim/commit/c8430fdd8dec6aa21c73f293cbd363084fb56ab0))
### Performance Improvements
* **explorer:** disable watchdirs fallback watcher ([5d34380](https://github.com/folke/snacks.nvim/commit/5d34380310861cd42e32ce0865bd8cded9027b41))
* **explorer:** early exit for tree calculation ([1a30610](https://github.com/folke/snacks.nvim/commit/1a30610ab78cce8bb184166de2ef35ee2ca1987a))
* **explorer:** no need to get git status with `-uall`. Closes [#983](https://github.com/folke/snacks.nvim/issues/983) ([bc087d3](https://github.com/folke/snacks.nvim/commit/bc087d36d6126ccf25f8bb3ead405ec32547d85d))
* **picker.list:** only re-render when visible items changed ([c72e62e](https://github.com/folke/snacks.nvim/commit/c72e62ef9012161ec6cd86aa749d780f77d1cc87))
* **picker:** cache treesitter line highlights ([af31c31](https://github.com/folke/snacks.nvim/commit/af31c312872cab2a47e17ed2ee67bf5940a522d4))
* **picker:** cache wether ts lang exists and disable smooth scrolling on big files ([719b36f](https://github.com/folke/snacks.nvim/commit/719b36fa70c35a7015537aa0bfd2956f6128c87d))
## [2.18.0](https://github.com/folke/snacks.nvim/compare/v2.17.0...v2.18.0) (2025-02-03)
### Features
* **dashboard:** play nice with file explorer netrw replacement ([5420a64](https://github.com/folke/snacks.nvim/commit/5420a64b66fd7350f5bb9d5dea2372850ea59969))
* **explorer.git:** added git_status_open. When false, then dont show recursive git status in open directories ([8646ba4](https://github.com/folke/snacks.nvim/commit/8646ba469630b73a34c06243664fb5607c0a43fa))
* **explorer:** added `]g` and `[g` to jump between files mentioned in `git status` ([263dfde](https://github.com/folke/snacks.nvim/commit/263dfde1b598e0fbba5f0031b8976e3c979f553c))
* **explorer:** added git status. Closes [#817](https://github.com/folke/snacks.nvim/issues/817) ([5cae48d](https://github.com/folke/snacks.nvim/commit/5cae48d93c875efa302bdffa995e4b057e2c3731))
* **explorer:** hide git status for open directories by default. it's mostly redundant ([b40c0d4](https://github.com/folke/snacks.nvim/commit/b40c0d4ee4e53aadc5fcf0900e58690c49f9763f))
* **explorer:** keep expanded dir state. Closes [#816](https://github.com/folke/snacks.nvim/issues/816) ([31984e8](https://github.com/folke/snacks.nvim/commit/31984e88a51652bda4997456c53113cbdc811cb4))
* **explorer:** more keymaps and tree rework. See [#837](https://github.com/folke/snacks.nvim/issues/837) ([2ff3893](https://github.com/folke/snacks.nvim/commit/2ff389312a78a8615754c2dee32b96211c9f9c54))
* **explorer:** navigate with h/l to close/open directories. Closes [#833](https://github.com/folke/snacks.nvim/issues/833) ([4b29ddc](https://github.com/folke/snacks.nvim/commit/4b29ddc5d9856ff49a07d77a43634e00b06f4d31))
* **explorer:** new `explorer` module with shortcut to start explorer picker and netrw replacement functionlity ([670c673](https://github.com/folke/snacks.nvim/commit/670c67366f0025fc4ebb78ba35a7586b7477989a))
* **explorer:** recursive copy and copying of selected items with `c` ([2528fcb](https://github.com/folke/snacks.nvim/commit/2528fcb02ceab7b19ee72a94b93c620259881e65))
* **explorer:** update on cwd change ([8dea225](https://github.com/folke/snacks.nvim/commit/8dea2252094ca3dc6d2073ab0015b7bcee396e24))
* **explorer:** update status when saving a file that is currently visible ([78d4116](https://github.com/folke/snacks.nvim/commit/78d4116662d38acb8456ffc6869204b487b472f8))
* **picker.commands:** do not autorun commands that require arguments ([#879](https://github.com/folke/snacks.nvim/issues/879)) ([62d99ed](https://github.com/folke/snacks.nvim/commit/62d99ed2a3711769e34fbc33c7072075824d256a))
* **picker.frecency:** added frecency support for directories ([ce67fa9](https://github.com/folke/snacks.nvim/commit/ce67fa9e31467590c750e203e27d3e6df293f2ad))
* **picker.input:** search syntax highlighting ([4242f90](https://github.com/folke/snacks.nvim/commit/4242f90268c93e7e546c195df26d9f0ee6b10645))
* **picker.lines:** jump to first position of match. Closes [#806](https://github.com/folke/snacks.nvim/issues/806) ([ae897f3](https://github.com/folke/snacks.nvim/commit/ae897f329f06695ee3482e2cd768797d5af3e277))
* **picker.list:** use regular CursorLine when picker window is not focused ([8a570bb](https://github.com/folke/snacks.nvim/commit/8a570bb48ba3536dcfe51f08547896b55fcb0e4d))
* **picker.matcher:** added opts.matcher.history_bonus that does fzf's scheme=history. Closes [#882](https://github.com/folke/snacks.nvim/issues/882). Closes [#872](https://github.com/folke/snacks.nvim/issues/872) ([78c2853](https://github.com/folke/snacks.nvim/commit/78c28535ddd4e3973bcdc9bdf342a37979010918))
* **picker.pickwin:** optional win/buf filter. Closes [#877](https://github.com/folke/snacks.nvim/issues/877) ([5c5b40b](https://github.com/folke/snacks.nvim/commit/5c5b40b5d0ed4166c751a11a839b015f4ad6e26a))
* **picker.projects:** added `<c-t>` to open a new tab page with the projects picker ([ced377a](https://github.com/folke/snacks.nvim/commit/ced377a05783073ab3a8506b5a9b0ffaf8293773))
* **picker.projects:** allow disabling projects from recent files ([c2dedb6](https://github.com/folke/snacks.nvim/commit/c2dedb647f6e170ee4defed647c7f89a51ee9fd0))
* **picker.projects:** default to tcd instead of cd ([3d2a075](https://github.com/folke/snacks.nvim/commit/3d2a07503f0724794a7e262a2f570a13843abedf))
* **picker.projects:** enabled frecency for projects picker ([5a20565](https://github.com/folke/snacks.nvim/commit/5a2056575faa50f788293ee787b803c15f42a9e0))
* **picker.projects:** projects now automatically processes dev folders and added a bunch of actions/keymaps. Closes [#871](https://github.com/folke/snacks.nvim/issues/871) ([6f8f0d3](https://github.com/folke/snacks.nvim/commit/6f8f0d3c727fe035dffc0bc4c1843e2a06eee1f2))
* **picker.undo:** better undo tree visualization. Closes [#863](https://github.com/folke/snacks.nvim/issues/863) ([44b8e38](https://github.com/folke/snacks.nvim/commit/44b8e3820493ca774cd220e3daf85c16954e74c7))
* **picker.undo:** make diff opts for undo configurable ([d61fb45](https://github.com/folke/snacks.nvim/commit/d61fb453c6c23976759e16a33fd8d6cb79cc59bc))
* **picker:** added support for double cliking and confirm ([8b26bae](https://github.com/folke/snacks.nvim/commit/8b26bae6bb01db22dbd3c6f868736487265025c0))
* **picker:** automatically download sqlite3.dll on Windows when using frecency / history for the first time. ([65907f7](https://github.com/folke/snacks.nvim/commit/65907f75ba52c09afc16e3d8d3c7ac67a3916237))
* **picker:** beter API to interact with active pickers. Closes [#851](https://github.com/folke/snacks.nvim/issues/851) ([6a83373](https://github.com/folke/snacks.nvim/commit/6a8337396ad843b27bdfe0a03ac2ce26ccf13092))
* **picker:** better health checks. Fixes [#855](https://github.com/folke/snacks.nvim/issues/855) ([d245925](https://github.com/folke/snacks.nvim/commit/d2459258f1a56109a2ad506f4a4dd6c69f2bb9f2))
* **picker:** history per source. Closes [#843](https://github.com/folke/snacks.nvim/issues/843) ([35295e0](https://github.com/folke/snacks.nvim/commit/35295e0eb2ee261e6173545190bc6c181fd08067))
### Bug Fixes
* **dashboard:** open pull requests with P instead of p in the github exmaple ([b2815d7](https://github.com/folke/snacks.nvim/commit/b2815d7f79e82d09cde5c9bb8e6fd13976b4d618))
* **dashboard:** update on VimResized and WinResized ([558b0ee](https://github.com/folke/snacks.nvim/commit/558b0ee04d0c6e1acf842774fbf9e02cce3efb0e))
* **explorer:** after search, cursor always jumped to top. Closes [#827](https://github.com/folke/snacks.nvim/issues/827) ([d17449e](https://github.com/folke/snacks.nvim/commit/d17449ee90b78843a22ee12ae29c3c110b28eac7))
* **explorer:** always use `--follow` to make sure we see dir symlinks as dirs. Fixes [#814](https://github.com/folke/snacks.nvim/issues/814) ([151fd3d](https://github.com/folke/snacks.nvim/commit/151fd3d62d73e0ec122bb243003c3bd59d53f8ef))
* **explorer:** cwd is now changed automatically, so no need to update state. ([5549d4e](https://github.com/folke/snacks.nvim/commit/5549d4e848b865ad4cc5bbb9bdd9487d631c795b))
* **explorer:** don't disable netrw fully. Just the autocmd that loads a directory ([836eb9a](https://github.com/folke/snacks.nvim/commit/836eb9a4e9ca0d7973f733203871d70691447c2b))
* **explorer:** don't try to show when closed. Fixes [#836](https://github.com/folke/snacks.nvim/issues/836) ([6921cd0](https://github.com/folke/snacks.nvim/commit/6921cd06ac7b530d786b2282afdfce67762008f1))
* **explorer:** fix git status sorting ([551d053](https://github.com/folke/snacks.nvim/commit/551d053c7ccc635249c262a5ea38b5d7aa814b3a))
* **explorer:** fixed hierarchical sorting. Closes [#828](https://github.com/folke/snacks.nvim/issues/828) ([fa32e20](https://github.com/folke/snacks.nvim/commit/fa32e20e9910f8071979f16788832027d1e25850))
* **explorer:** keep global git status cache ([a54a21a](https://github.com/folke/snacks.nvim/commit/a54a21adc0e67b97fb787adcbaaf4578c6f44476))
* **explorer:** remove sleep :) ([efbc4a1](https://github.com/folke/snacks.nvim/commit/efbc4a12af6aae39dadeab0badb84d04a94d5f85))
* **git:** use os.getenv to get env var. Fixes [#5504](https://github.com/folke/snacks.nvim/issues/5504) ([16d700e](https://github.com/folke/snacks.nvim/commit/16d700eb65fc320a5ab8e131d8f5d185b241887b))
* **layout:** adjust zindex when needed when another layout is already open. Closes [#826](https://github.com/folke/snacks.nvim/issues/826) ([ab8af1b](https://github.com/folke/snacks.nvim/commit/ab8af1bb32a4d9f82156122056d07a0850c2a828))
* **layout:** destroy in schedule. Fixes [#861](https://github.com/folke/snacks.nvim/issues/861) ([c955a8d](https://github.com/folke/snacks.nvim/commit/c955a8d1ef543fd56907d5291e92e62fd944db9b))
* **picker.actions:** fix split/vsplit/tab. Closes [#818](https://github.com/folke/snacks.nvim/issues/818) ([ff02241](https://github.com/folke/snacks.nvim/commit/ff022416dd6e6dade2ee822469d0087fcf3e0509))
* **picker.actions:** pass edit commands to jump. Closes [#859](https://github.com/folke/snacks.nvim/issues/859) ([df0e3e3](https://github.com/folke/snacks.nvim/commit/df0e3e3d861fd7b8ab85b3e8dbca97817b3d6604))
* **picker.actions:** reworked split/vsplit/drop/tab cmds to better do what's intended. Closes [#854](https://github.com/folke/snacks.nvim/issues/854) ([2946875](https://github.com/folke/snacks.nvim/commit/2946875af09f5f439ce64b78da8da6cf28523b8c))
* **picker.actions:** tab -> tabnew. Closes [#842](https://github.com/folke/snacks.nvim/issues/842) ([d962d5f](https://github.com/folke/snacks.nvim/commit/d962d5f3359dc91da7aa54388515fd0b03a2fe8b))
* **picker.explorer:** do LSP stuff on move ([894ff74](https://github.com/folke/snacks.nvim/commit/894ff749300342593007e6366894b681b3148f19))
* **picker.explorer:** use cached git status ([1ce435c](https://github.com/folke/snacks.nvim/commit/1ce435c6eb161feae63c8ddfe3e1aaf98b2aa41d))
* **picker.format:** extra slash in path ([dad3e00](https://github.com/folke/snacks.nvim/commit/dad3e00e83ec8a8af92e778e29f2fe200ad0d969))
* **picker.format:** use item.file for filename_only ([e784a9e](https://github.com/folke/snacks.nvim/commit/e784a9e6723371f8f453a92edb03d68428da74cc))
* **picker.git_log:** add extra space between the date and the message ([#885](https://github.com/folke/snacks.nvim/issues/885)) ([d897ead](https://github.com/folke/snacks.nvim/commit/d897ead2b78a73a186a3cb1b735a10f2606ddb36))
* **picker.keymaps:** added normalized lhs to search text ([fbd39a4](https://github.com/folke/snacks.nvim/commit/fbd39a48df085a7df979a06b1003faf86625c157))
* **picker.lazy:** don't use live searches. Fixes [#809](https://github.com/folke/snacks.nvim/issues/809) ([1a5fd93](https://github.com/folke/snacks.nvim/commit/1a5fd93b89904b8f8029e6ee74e6d6ada87f28c5))
* **picker.lines:** col is first non-whitespace. Closes [#806](https://github.com/folke/snacks.nvim/issues/806) ([ec8eb60](https://github.com/folke/snacks.nvim/commit/ec8eb6051530261e7d0e5566721e5c396c1ed6cd))
* **picker.list:** better virtual scrolling that works from any window ([4a50291](https://github.com/folke/snacks.nvim/commit/4a502914486346940389a99690578adca9a820bb))
* **picker.matcher:** fix cwd_bonus check ([00af290](https://github.com/folke/snacks.nvim/commit/00af2909064433ee84280dd64233a34b0f8d6027))
* **picker.matcher:** regex offset by one. Fixes [#878](https://github.com/folke/snacks.nvim/issues/878) ([9a82f0a](https://github.com/folke/snacks.nvim/commit/9a82f0a564df3e4f017e9b66da6baa41196962b7))
* **picker.undo:** add newlines ([72826a7](https://github.com/folke/snacks.nvim/commit/72826a72de93f49b2446c691e3bef04df1a44dde))
* **picker.undo:** cleanup tmp buffer ([8368176](https://github.com/folke/snacks.nvim/commit/83681762435a425ab1edb10fe3244b3e8b1280c2))
* **picker.undo:** copy over buffer lines instead of just the file ([c900e2c](https://github.com/folke/snacks.nvim/commit/c900e2cb3ab83c299c95756fc34e4ae52f4e72e9))
* **picker.undo:** disable swap for tmp undo buffer ([033db25](https://github.com/folke/snacks.nvim/commit/033db250cd688872724a84deb623b599662d79c5))
* **picker:** better main window management. Closes [#842](https://github.com/folke/snacks.nvim/issues/842) ([f0f053a](https://github.com/folke/snacks.nvim/commit/f0f053a1d9b16edaa27f05e20ad6fd862db8c6f7))
* **picker:** improve resume. Closes [#853](https://github.com/folke/snacks.nvim/issues/853) ([0f5b30b](https://github.com/folke/snacks.nvim/commit/0f5b30b41196d831cda84e4b792df2ce765fd856))
* **picker:** make pick_win work with split layouts. Closes [#834](https://github.com/folke/snacks.nvim/issues/834) ([6dbc267](https://github.com/folke/snacks.nvim/commit/6dbc26757cb043c8153a4251a1f75bff4dcadf68))
* **picker:** multi layouts that need async task work again. ([cd44efb](https://github.com/folke/snacks.nvim/commit/cd44efb60ce70382de02d069e269bb40e5e7fa22))
* **picker:** no auto-close when entering a floating window ([08e6c12](https://github.com/folke/snacks.nvim/commit/08e6c12358d57dfb497f8ce7de7eb09134868dc7))
* **picker:** no need to track jumping ([b37ea74](https://github.com/folke/snacks.nvim/commit/b37ea748b6ff56cd479600b1c39d19a308ee7eae))
* **picker:** propagate WinEnter when going to the real window after entering the layout split window ([8555789](https://github.com/folke/snacks.nvim/commit/8555789d86f7f6127fdf023723775207972e0c44))
* **picker:** show regex matches in list when needed. Fixes [#878](https://github.com/folke/snacks.nvim/issues/878) ([1d99bac](https://github.com/folke/snacks.nvim/commit/1d99bac9bcf75a11adc6cd78cde4477a95f014bd))
* **picker:** show_empty for files / grep. Closes [#808](https://github.com/folke/snacks.nvim/issues/808) ([a13ff6f](https://github.com/folke/snacks.nvim/commit/a13ff6fe0f68c3242d6be5e352d762b6037a9695))
* **util:** better default icons when no icon plugin is installed ([0e4ddfd](https://github.com/folke/snacks.nvim/commit/0e4ddfd3ee1d81def4028e52e44e45ac3ce98cfc))
* **util:** better keymap normalization ([e1566a4](https://github.com/folke/snacks.nvim/commit/e1566a483df1badc97729f66b1faf358d2bd3362))
* **util:** normkey. Closes [#763](https://github.com/folke/snacks.nvim/issues/763) ([6972960](https://github.com/folke/snacks.nvim/commit/69729608e101923810a13942f0b3bef98f253592))
* **win:** close help when leaving the win buffer ([4aba559](https://github.com/folke/snacks.nvim/commit/4aba559c6e321f90524a2e8164b8fd1f9329552e))
### Performance Improvements
* **explorer:** don't wait till git status finished. Update tree when needed. See [#869](https://github.com/folke/snacks.nvim/issues/869) ([287db30](https://github.com/folke/snacks.nvim/commit/287db30ed21dc2a8be80fabcffcec9b1b878e04e))
* **explorer:** use cache when possible for opening/closing directories. Closes [#869](https://github.com/folke/snacks.nvim/issues/869) ([cef4fc9](https://github.com/folke/snacks.nvim/commit/cef4fc91813ba6e6932db88a1c9e82a30ea51349))
* **git:** also check top-level path to see if it's a git root. Closes [#807](https://github.com/folke/snacks.nvim/issues/807) ([b9e7c51](https://github.com/folke/snacks.nvim/commit/b9e7c51e8f7eea876275e52f1083b58f9d2df92f))
* **picker.files:** no need to check every time for cmd availability ([8f87c2c](https://github.com/folke/snacks.nvim/commit/8f87c2c32bbb75a4fad4f5768d5faa963c4f66d8))
* **picker.undo:** more performance improvements for the undo picker ([3d4b8ee](https://github.com/folke/snacks.nvim/commit/3d4b8eeea9380eb7488217af74f9448eaa7b376e))
* **picker.undo:** use a tmp buffer to get diffs. Way faster than before. Closes [#863](https://github.com/folke/snacks.nvim/issues/863) ([d4a5449](https://github.com/folke/snacks.nvim/commit/d4a54498131a5d9027bccdf2cd0edd2d22594ce7))
## [2.17.0](https://github.com/folke/snacks.nvim/compare/v2.16.0...v2.17.0) (2025-01-30)
### Features
* **picker.actions:** allow selecting the visual selection with `<Tab>` ([96c76c6](https://github.com/folke/snacks.nvim/commit/96c76c6d9d401c2205d73639389b32470c550e6a))
* **picker.explorer:** focus dir on confirm from search ([605f745](https://github.com/folke/snacks.nvim/commit/605f7451984f0011635423571ad83ab74f342ed8))
### Bug Fixes
* **git:** basic support for git work trees ([d76d9aa](https://github.com/folke/snacks.nvim/commit/d76d9aaaf2399c6cf15c5b37a9183680b106a4af))
* **picker.preview:** properly refresh the preview after layout changes. Fixes [#802](https://github.com/folke/snacks.nvim/issues/802) ([47993f9](https://github.com/folke/snacks.nvim/commit/47993f9a809ce13e98c3132d463d5a3002289fd6))
* **picker:** add proper close ([15a9411](https://github.com/folke/snacks.nvim/commit/15a94117e17d78c8c2e579d20988d4cb9e85d098))
* **picker:** make jumping work again... ([f40f338](https://github.com/folke/snacks.nvim/commit/f40f338d669bf2d54b224e4a973c52c8157fe505))
* **picker:** show help for input / list window with `?`. ([87dab7e](https://github.com/folke/snacks.nvim/commit/87dab7eca7949b85c0ee688f86c08b8c437f9433))
* **win:** properly handle closing the last window. Fixes [#793](https://github.com/folke/snacks.nvim/issues/793) ([18de5bb](https://github.com/folke/snacks.nvim/commit/18de5bb23898fa2055afee5035c97a2abe4aae6b))
## [2.16.0](https://github.com/folke/snacks.nvim/compare/v2.15.0...v2.16.0) (2025-01-30)
### Features
* **layout:** added support for split layouts (root box can be a split) ([6da592e](https://github.com/folke/snacks.nvim/commit/6da592e130295388ee64fe282eb0dafa0b99fa2f))
* **layout:** make fullscreen work for split layouts ([115f8c6](https://github.com/folke/snacks.nvim/commit/115f8c6ae9c9a57b36677b728a6f6cc9207c6489))
* **picker.actions:** added separate hl group for pick win current ([9b80e44](https://github.com/folke/snacks.nvim/commit/9b80e444f548aea26214a95ad9e1affc4ef5d91c))
* **picker.actions:** separate edit_split etc in separate split and edit actions. Fixes [#791](https://github.com/folke/snacks.nvim/issues/791) ([3564f4f](https://github.com/folke/snacks.nvim/commit/3564f4fede6feefdfe1dc200295eb3b162996d6d))
* **picker.config:** added `opts.config` which can be a function that can change the resolved options ([b37f368](https://github.com/folke/snacks.nvim/commit/b37f368a81d0a6ce8b7c9f683f9c0c736af6de36))
* **picker.explorer:** added `explorer_move` action mapped to `m` ([08b9083](https://github.com/folke/snacks.nvim/commit/08b9083f4759c87c93f6afb4af0a1f3d2b8ad1fa))
* **picker.explorer:** live search ([db52796](https://github.com/folke/snacks.nvim/commit/db52796e79c63dfa0d5d689d5d13b120f6184642))
* **picker.files:** allow forcing the files finder to use a certain cmd ([3e1dc30](https://github.com/folke/snacks.nvim/commit/3e1dc300cc98815ad74ae11c98f7ebebde966c39))
* **picker.format:** better path formatting for directories ([08f3c32](https://github.com/folke/snacks.nvim/commit/08f3c32c7d64a81ea35d1cb0d22fc140d25c9088))
* **picker.format:** directory formatting ([847509e](https://github.com/folke/snacks.nvim/commit/847509e12c0cd95355cb05c97e1bc8bedde29957))
* **picker.jump:** added `opts.jump.close`, which default to true, but is false for explorer ([a9591ed](https://github.com/folke/snacks.nvim/commit/a9591ed43f4de3b611028eadce7d36c4b3dedca8))
* **picker.list:** added support for setting a cursor/topline target for the next render. Target clears when reached, or when finders finishes. ([da08379](https://github.com/folke/snacks.nvim/commit/da083792053e41c57e8ca5e9fe9e5b175b1e378d))
* **picker:** `opts.focus = "input"|"list"|false` to configure what to focus (if anything) when showing the picker ([5a8d798](https://github.com/folke/snacks.nvim/commit/5a8d79847b1959f9c9515b51a062f6acbe22f1a4))
* **picker:** `picker:iter()` now also returns `idx` ([118d908](https://github.com/folke/snacks.nvim/commit/118d90899d7b2bb0a28a799dbf2a21ed39516e66))
* **picker:** added `edit_win` action bound to `ctrl+enter` to pick a window and edit ([2ba5be8](https://github.com/folke/snacks.nvim/commit/2ba5be84910d14454292423f08ad83ea213de2ba))
* **picker:** added `git_stash` picker. Closes [#762](https://github.com/folke/snacks.nvim/issues/762) ([bb3db11](https://github.com/folke/snacks.nvim/commit/bb3db117a45da1dabe76f08a75144b028314e6b6))
* **picker:** added `notifications` picker. Closes [#738](https://github.com/folke/snacks.nvim/issues/738) ([32cffd2](https://github.com/folke/snacks.nvim/commit/32cffd2e603ccace129b62c777933a42203c5c77))
* **picker:** added support for split layouts to picker (sidebar and ivy_split) ([5496c22](https://github.com/folke/snacks.nvim/commit/5496c22b6e20a26d2252543029faead946cc2ce9))
* **picker:** added support to keep the picker open when focusing another window (auto_close = false) ([ad8f166](https://github.com/folke/snacks.nvim/commit/ad8f16632c63a3082ea0e80a39cdbd774624532a))
* **picker:** new file explorer `Snacks.picker.explorer()` ([00613bd](https://github.com/folke/snacks.nvim/commit/00613bd4163c89e01c1d534d283cfe531773fdc8))
* **picker:** opening a picker with the same source as an active picker, will close it instead (toggle) ([b6cf033](https://github.com/folke/snacks.nvim/commit/b6cf033051aa2f859d9d217bc60e89806fcf5377))
* **picker:** reworked toggles (flags). they're now configurable. Closes [#770](https://github.com/folke/snacks.nvim/issues/770) ([e16a6a4](https://github.com/folke/snacks.nvim/commit/e16a6a441322c944b41e9ae5b30ba816145218cd))
* **rename:** optional `file`, `on_rename` for `Snacks.rename.rename_file()` ([9d8c277](https://github.com/folke/snacks.nvim/commit/9d8c277bebb9483b1d46c7eeeff348966076347f))
### Bug Fixes
* **bigfile:** check if buf still exists when applying syntax. Fixes [#737](https://github.com/folke/snacks.nvim/issues/737) ([08852ac](https://github.com/folke/snacks.nvim/commit/08852ac7f811f51d47a590d62df805d0e84e611a))
* **bufdelete:** ctrl-c throw error in `fn.confirm` ([#750](https://github.com/folke/snacks.nvim/issues/750)) ([3a3e795](https://github.com/folke/snacks.nvim/commit/3a3e79535bb085815d3add9f678d30b98b5f900f))
* **bufdelete:** invalid lua ([b1f4f99](https://github.com/folke/snacks.nvim/commit/b1f4f99a51ef1ca11a0c802b847501b71f09161b))
* **dashboard:** better handling of closed dashboard win ([6cb7fdf](https://github.com/folke/snacks.nvim/commit/6cb7fdfb036239b9c1b6d147633e494489a45191))
* **dashboard:** don't override user configuration ([#774](https://github.com/folke/snacks.nvim/issues/774)) ([5ff2ad3](https://github.com/folke/snacks.nvim/commit/5ff2ad320b0cd1e17d48862c74af0df205894f37))
* **dashboard:** fix dasdhboard when opening in a new win. Closes [#767](https://github.com/folke/snacks.nvim/issues/767) ([d44b978](https://github.com/folke/snacks.nvim/commit/d44b978d7dbe7df8509a172cef0913b5a9ac77e3))
* **dashboard:** prevent starting picker twice when no session manager. Fixes [#783](https://github.com/folke/snacks.nvim/issues/783) ([2f396b3](https://github.com/folke/snacks.nvim/commit/2f396b341dc1a072643eb402bfaa8a73f6be19a1))
* **filter:** insert path from `filter.paths` into `self.paths` ([#761](https://github.com/folke/snacks.nvim/issues/761)) ([ac20c6f](https://github.com/folke/snacks.nvim/commit/ac20c6ff5d0ac8747e164d592e8ae7e8f2581b2e))
* **layout:** better handling of resizing of split layouts ([c8ce9e2](https://github.com/folke/snacks.nvim/commit/c8ce9e2b33623d21901e02213319270936e4545f))
* **layout:** better update check for split layouts ([b50d697](https://github.com/folke/snacks.nvim/commit/b50d697ce45dbee5efe25371428b7f23b037d0ed))
* **layout:** make sure split layouts are still visible when a float layout with backdrop opens ([696d198](https://github.com/folke/snacks.nvim/commit/696d1981b18ad1f0cc0e480aafed78a064730417))
* **matcher.score:** correct prev_class for transition bonusses when in a gap. Fixes [#787](https://github.com/folke/snacks.nvim/issues/787) ([b45d0e0](https://github.com/folke/snacks.nvim/commit/b45d0e03579c80ac901261e0e2705a1be3dfcb20))
* **picker.actions:** detect and report circular action references ([0ffc003](https://github.com/folke/snacks.nvim/commit/0ffc00367a957c1602df745c2038600d48d96305))
* **picker.actions:** proper cr check ([6c9f866](https://github.com/folke/snacks.nvim/commit/6c9f866b3123cbc8cbef91f55593d30d98d4f26a))
* **picker.actions:** stop pick_win when no target and only unhide when picker wasn't stopped ([4a1d189](https://github.com/folke/snacks.nvim/commit/4a1d189f9f7afac4180f7a459597bb094d11435b))
* **picker.actions:** when only 1 win, `pick_win` will select that automatically. Show warning when no windows. See [#623](https://github.com/folke/snacks.nvim/issues/623) ([ba5a70b](https://github.com/folke/snacks.nvim/commit/ba5a70b84d12aa9e497cfea86d5358aa5cf0aad3))
* **picker.config:** fix wrong `opts.cwd = true` config. Closes [#757](https://github.com/folke/snacks.nvim/issues/757) ([ea44a2d](https://github.com/folke/snacks.nvim/commit/ea44a2d4c21aa10fb57fe08b974999f7b8d117d2))
* **picker.config:** normalize `opts.cwd` ([69c013e](https://github.com/folke/snacks.nvim/commit/69c013e1b27e2f70def48576aaffcc1081fa0e47))
* **picker.explorer:** fix cwd for items ([71070b7](https://github.com/folke/snacks.nvim/commit/71070b78f0482a42448da2cee64ed0d84c507314))
* **picker.explorer:** stop file follow when picker was closed ([89fcb3b](https://github.com/folke/snacks.nvim/commit/89fcb3bb2025cb1c986e9af3478715f6e0bdf425))
* **picker.explorer:** when searching, go to first non internal node in the list ([276497b](https://github.com/folke/snacks.nvim/commit/276497b3969cdefd18aa731c5e3d5c1bb8289cca))
* **picker.filter:** proper cwd check. See [#757](https://github.com/folke/snacks.nvim/issues/757) ([e4ae9e3](https://github.com/folke/snacks.nvim/commit/e4ae9e32295d688a1e0d3f59ab1ba4cc78d1ba89))
* **picker.git:** better stash pattern. Closes [#775](https://github.com/folke/snacks.nvim/issues/775) ([e960010](https://github.com/folke/snacks.nvim/commit/e960010496f860d1077f1e54d193e127ad7e26ad))
* **picker.git:** default to git root for `git_files`. Closes [#751](https://github.com/folke/snacks.nvim/issues/751) ([3cdebee](https://github.com/folke/snacks.nvim/commit/3cdebee880742970df1a1f685be4802b90642c7d))
* **picker.git:** ignore autostash ([2b15357](https://github.com/folke/snacks.nvim/commit/2b15357c25db315567f08e7ec8d5c85c94d0753f))
* **picker.git:** show diff for staged files. Fixes [#747](https://github.com/folke/snacks.nvim/issues/747) ([e87f0ff](https://github.com/folke/snacks.nvim/commit/e87f0ffcd100a3a6686549e25f480c1311f08d8f))
* **picker.layout:** fix list cursorline when layout updates ([3f43026](https://github.com/folke/snacks.nvim/commit/3f43026f579f33b679a924dea699df86e8b965b2))
* **picker.layout:** make split layouts work in layout preview ([215ae72](https://github.com/folke/snacks.nvim/commit/215ae72daaed5d7ee18b72e8b14bfd6a727bc939))
* **picker.lsp:** remove symbol detail from search text. too noisy ([92710df](https://github.com/folke/snacks.nvim/commit/92710dfb0bacc72a82e0172bb06f5eb9ad82964a))
* **picker.multi:** apply source filter settings for multi source pickers. See [#761](https://github.com/folke/snacks.nvim/issues/761) ([4e30ff0](https://github.com/folke/snacks.nvim/commit/4e30ff0f1ed58b0bdc8fd3f5f1a9a440959eb998))
* **picker.preview:** don't enable numbers when minimal=true ([04e2995](https://github.com/folke/snacks.nvim/commit/04e2995bbfc505d0fc91263712d0255f102f404e))
* **picker.preview:** don't error on invalid start positions for regex. Fixes [#784](https://github.com/folke/snacks.nvim/issues/784) ([460b58b](https://github.com/folke/snacks.nvim/commit/460b58bdbd57e32a1bed22b3e176fa53befeafaa))
* **picker.preview:** only show binary message when binary and no ft. Closes [#729](https://github.com/folke/snacks.nvim/issues/729) ([ea838e2](https://github.com/folke/snacks.nvim/commit/ea838e28383d74d60cd6d714cac9b007a4a4469a))
* **picker.resume:** fix picker is nil ([#772](https://github.com/folke/snacks.nvim/issues/772)) ([1a5a087](https://github.com/folke/snacks.nvim/commit/1a5a0871c822e5de8e69c10bb1d6cb3dfc2f5c86))
* **picker.score:** scoring closer to fzf. See [#787](https://github.com/folke/snacks.nvim/issues/787) ([390f017](https://github.com/folke/snacks.nvim/commit/390f017c3b227377c09ae6572f88b7c42304b811))
* **picker.select:** allow configuring `vim.ui.select` with the `select` source. Closes [#776](https://github.com/folke/snacks.nvim/issues/776) ([d70af2d](https://github.com/folke/snacks.nvim/commit/d70af2d253f61164a44a8676a5fc316cad10497f))
* **picker.util:** proper cwd check for paths. Fixes [#754](https://github.com/folke/snacks.nvim/issues/754). See [#757](https://github.com/folke/snacks.nvim/issues/757) ([1069d78](https://github.com/folke/snacks.nvim/commit/1069d783347a7a5213240e2e12e485ab57e15bd8))
* **picker:** better handling of win Enter/Leave mostly for split layouts ([046653a](https://github.com/folke/snacks.nvim/commit/046653a4f166633339a276999738bac43c3c1388))
* **picker:** don't destroy active pickers (only an issue when multiple pickers were open) ([b479f10](https://github.com/folke/snacks.nvim/commit/b479f10b24a8cf5325bc575e1bab2fc51ebfde45))
* **picker:** only do preview scrolling when preview is scrolling and removed default preview horizontal scrolling keymaps ([a998c71](https://github.com/folke/snacks.nvim/commit/a998c714c31ab92a06b9edafef71251b63f0eb5b))
* **picker:** show new notifications on top ([0df7c0b](https://github.com/folke/snacks.nvim/commit/0df7c0bef59be861f3e6682aa1381f6422f4a0af))
* **picker:** split edit_win in `{"pick_win", "jump"}` ([dcd3bc0](https://github.com/folke/snacks.nvim/commit/dcd3bc03295a8521773c04671298bd3fdcb14f7b))
* **picker:** stopinsert again ([2250c57](https://github.com/folke/snacks.nvim/commit/2250c57529b1a8da4d96966db1cd9a46b73d8007))
* **win:** don't destroy opts. Fixes [#726](https://github.com/folke/snacks.nvim/issues/726) ([473be03](https://github.com/folke/snacks.nvim/commit/473be039e59730b0554a7dfda2eb800ecf7a948e))
* **win:** error when enabling padding with `listchars=""` ([#786](https://github.com/folke/snacks.nvim/issues/786)) ([6effbcd](https://github.com/folke/snacks.nvim/commit/6effbcdff110c16f49c2cef5d211db86f6db5820))
### Performance Improvements
* **picker.matcher:** optimize matcher priorities and skip items that can't match for pattern subset ([dfaa18d](https://github.com/folke/snacks.nvim/commit/dfaa18d1c72a78cacfe0a682c853b7963641444c))
* **picker.recent:** correct generator for old files ([5f32414](https://github.com/folke/snacks.nvim/com
gitextract_ihjv8qnw/ ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ ├── labeler.yml │ ├── release-please-config.json │ ├── release-please-manifest.json │ └── workflows/ │ ├── ci.yml │ ├── labeler.yml │ ├── pr.yml │ ├── stale.yml │ └── update.yml ├── .gitignore ├── .markdownlint-cli2.yaml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── doc/ │ ├── snacks.nvim-animate.txt │ ├── snacks.nvim-bigfile.txt │ ├── snacks.nvim-bufdelete.txt │ ├── snacks.nvim-dashboard.txt │ ├── snacks.nvim-debug.txt │ ├── snacks.nvim-dim.txt │ ├── snacks.nvim-explorer.txt │ ├── snacks.nvim-gh.txt │ ├── snacks.nvim-git.txt │ ├── snacks.nvim-gitbrowse.txt │ ├── snacks.nvim-health.txt │ ├── snacks.nvim-image.txt │ ├── snacks.nvim-indent.txt │ ├── snacks.nvim-init.txt │ ├── snacks.nvim-input.txt │ ├── snacks.nvim-keymap.txt │ ├── snacks.nvim-layout.txt │ ├── snacks.nvim-lazygit.txt │ ├── snacks.nvim-meta.txt │ ├── snacks.nvim-notifier.txt │ ├── snacks.nvim-notify.txt │ ├── snacks.nvim-picker.txt │ ├── snacks.nvim-profiler.txt │ ├── snacks.nvim-quickfile.txt │ ├── snacks.nvim-rename.txt │ ├── snacks.nvim-scope.txt │ ├── snacks.nvim-scratch.txt │ ├── snacks.nvim-scroll.txt │ ├── snacks.nvim-statuscolumn.txt │ ├── snacks.nvim-styles.txt │ ├── snacks.nvim-terminal.txt │ ├── snacks.nvim-toggle.txt │ ├── snacks.nvim-util.txt │ ├── snacks.nvim-win.txt │ ├── snacks.nvim-words.txt │ ├── snacks.nvim-zen.txt │ └── snacks.nvim.txt ├── docs/ │ ├── animate.md │ ├── bigfile.md │ ├── bufdelete.md │ ├── dashboard.md │ ├── debug.md │ ├── dim.md │ ├── examples/ │ │ ├── dashboard.lua │ │ ├── init.lua │ │ └── picker.lua │ ├── explorer.md │ ├── gh.md │ ├── git.md │ ├── gitbrowse.md │ ├── health.md │ ├── image.md │ ├── indent.md │ ├── init.md │ ├── input.md │ ├── keymap.md │ ├── layout.md │ ├── lazygit.md │ ├── meta.md │ ├── notifier.md │ ├── notify.md │ ├── picker.md │ ├── profiler.md │ ├── quickfile.md │ ├── rename.md │ ├── scope.md │ ├── scratch.md │ ├── scroll.md │ ├── statuscolumn.md │ ├── styles.md │ ├── terminal.md │ ├── toggle.md │ ├── util.md │ ├── win.md │ ├── words.md │ └── zen.md ├── lua/ │ ├── snacks/ │ │ ├── animate/ │ │ │ ├── easing.lua │ │ │ └── init.lua │ │ ├── bigfile.lua │ │ ├── bufdelete.lua │ │ ├── compat.lua │ │ ├── dashboard.lua │ │ ├── debug.lua │ │ ├── dim.lua │ │ ├── explorer/ │ │ │ ├── actions.lua │ │ │ ├── diagnostics.lua │ │ │ ├── git.lua │ │ │ ├── init.lua │ │ │ ├── tree.lua │ │ │ └── watch.lua │ │ ├── gh/ │ │ │ ├── actions.lua │ │ │ ├── api.lua │ │ │ ├── buf.lua │ │ │ ├── init.lua │ │ │ ├── item.lua │ │ │ ├── render/ │ │ │ │ └── init.lua │ │ │ └── types.lua │ │ ├── git.lua │ │ ├── gitbrowse.lua │ │ ├── health.lua │ │ ├── image/ │ │ │ ├── buf.lua │ │ │ ├── convert.lua │ │ │ ├── doc.lua │ │ │ ├── image.lua │ │ │ ├── init.lua │ │ │ ├── inline.lua │ │ │ ├── placement.lua │ │ │ ├── terminal.lua │ │ │ └── util.lua │ │ ├── indent.lua │ │ ├── init.lua │ │ ├── input.lua │ │ ├── keymap.lua │ │ ├── layout.lua │ │ ├── lazygit.lua │ │ ├── meta/ │ │ │ ├── docs.lua │ │ │ ├── init.lua │ │ │ └── types.lua │ │ ├── notifier.lua │ │ ├── notify.lua │ │ ├── picker/ │ │ │ ├── actions.lua │ │ │ ├── config/ │ │ │ │ ├── defaults.lua │ │ │ │ ├── highlights.lua │ │ │ │ ├── init.lua │ │ │ │ ├── layouts.lua │ │ │ │ └── sources.lua │ │ │ ├── core/ │ │ │ │ ├── _health.lua │ │ │ │ ├── actions.lua │ │ │ │ ├── filter.lua │ │ │ │ ├── finder.lua │ │ │ │ ├── frecency.lua │ │ │ │ ├── input.lua │ │ │ │ ├── list.lua │ │ │ │ ├── main.lua │ │ │ │ ├── matcher.lua │ │ │ │ ├── picker.lua │ │ │ │ ├── preview.lua │ │ │ │ └── score.lua │ │ │ ├── format.lua │ │ │ ├── init.lua │ │ │ ├── preview.lua │ │ │ ├── resume.lua │ │ │ ├── select.lua │ │ │ ├── sort.lua │ │ │ ├── source/ │ │ │ │ ├── buffers.lua │ │ │ │ ├── diagnostics.lua │ │ │ │ ├── diff.lua │ │ │ │ ├── explorer.lua │ │ │ │ ├── files.lua │ │ │ │ ├── gh.lua │ │ │ │ ├── git.lua │ │ │ │ ├── grep.lua │ │ │ │ ├── help.lua │ │ │ │ ├── icons.lua │ │ │ │ ├── lazy.lua │ │ │ │ ├── lines.lua │ │ │ │ ├── lsp/ │ │ │ │ │ ├── config.lua │ │ │ │ │ └── init.lua │ │ │ │ ├── meta.lua │ │ │ │ ├── proc.lua │ │ │ │ ├── qf.lua │ │ │ │ ├── recent.lua │ │ │ │ ├── scratch.lua │ │ │ │ ├── snacks.lua │ │ │ │ ├── system.lua │ │ │ │ ├── treesitter.lua │ │ │ │ └── vim.lua │ │ │ ├── transform.lua │ │ │ ├── types.lua │ │ │ └── util/ │ │ │ ├── async.lua │ │ │ ├── db.lua │ │ │ ├── diff.lua │ │ │ ├── highlight.lua │ │ │ ├── history.lua │ │ │ ├── init.lua │ │ │ ├── kv.lua │ │ │ ├── markdown.lua │ │ │ ├── minheap.lua │ │ │ ├── queue.lua │ │ │ └── spinner.lua │ │ ├── profiler/ │ │ │ ├── core.lua │ │ │ ├── init.lua │ │ │ ├── loc.lua │ │ │ ├── picker.lua │ │ │ ├── tracer.lua │ │ │ └── ui.lua │ │ ├── quickfile.lua │ │ ├── rename.lua │ │ ├── scope.lua │ │ ├── scratch.lua │ │ ├── scroll.lua │ │ ├── statuscolumn.lua │ │ ├── terminal.lua │ │ ├── toggle.lua │ │ ├── util/ │ │ │ ├── init.lua │ │ │ ├── job.lua │ │ │ ├── lsp.lua │ │ │ └── spawn.lua │ │ ├── win.lua │ │ ├── words.lua │ │ └── zen.lua │ └── trouble/ │ └── sources/ │ └── profiler.lua ├── plugin/ │ └── snacks.lua ├── queries/ │ ├── css/ │ │ └── images.scm │ ├── html/ │ │ └── images.scm │ ├── javascript/ │ │ └── images.scm │ ├── latex/ │ │ └── images.scm │ ├── lua/ │ │ ├── highlights.scm │ │ └── injections.scm │ ├── markdown/ │ │ ├── images.scm │ │ └── injections.scm │ ├── markdown_inline/ │ │ └── images.scm │ ├── norg/ │ │ └── images.scm │ ├── scss/ │ │ └── images.scm │ ├── svelte/ │ │ └── images.scm │ ├── tsx/ │ │ └── images.scm │ ├── typst/ │ │ └── images.scm │ └── vue/ │ └── images.scm ├── scripts/ │ ├── docs │ ├── docs-post │ └── test ├── selene.toml ├── stylua.toml ├── tests/ │ ├── config_spec.lua │ ├── gitbrowse_spec.lua │ ├── image/ │ │ ├── big.md │ │ ├── math.md │ │ ├── test-mermaid.md │ │ ├── test.aux │ │ ├── test.css │ │ ├── test.html │ │ ├── test.jsx │ │ ├── test.md │ │ ├── test.mmd │ │ ├── test.norg │ │ ├── test.org │ │ ├── test.scss │ │ ├── test.svelte │ │ ├── test.tex │ │ ├── test.tsx │ │ ├── test.typ │ │ ├── test.vue │ │ └── test2.md │ ├── minit.lua │ ├── picker/ │ │ ├── diff_spec.lua │ │ ├── git_status_spec.lua │ │ ├── matcher_spec.lua │ │ ├── minheap_spec.lua │ │ └── util_spec.lua │ ├── scope_spec.lua │ ├── terminal_spec.lua │ └── util_spec.lua └── vim.yml
Condensed preview — 272 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,656K chars).
[
{
"path": ".editorconfig",
"chars": 98,
"preview": "root = true\n\n[*]\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\ncharset = utf-8\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2549,
"preview": "name: Bug Report\ndescription: File a bug/issue\ntitle: \"bug: \"\nlabels: [bug]\nbody:\n - type: markdown\n attributes:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 168,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Ask a question\n url: https://github.com/folke/snacks.nvim/discus"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1249,
"preview": "name: Feature Request\ndescription: Suggest a new feature\ntitle: \"feature: \"\nlabels: [enhancement]\nbody:\n - type: checkb"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 334,
"preview": "## Description\n\n<!-- Describe the big picture of your changes to communicate to the maintainers\n why we should accept t"
},
{
"path": ".github/dependabot.yml",
"chars": 118,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n"
},
{
"path": ".github/labeler.yml",
"chars": 3091,
"preview": "# .github/labeler.yml\n\n# Label for any files under the `doc/` directory\ndocs-vim:\n - changed-files:\n - any-glob-to"
},
{
"path": ".github/release-please-config.json",
"chars": 219,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json\",\n \"packages\": {\n "
},
{
"path": ".github/release-please-manifest.json",
"chars": 20,
"preview": "{\n \".\": \"2.31.0\"\n}\n"
},
{
"path": ".github/workflows/ci.yml",
"chars": 220,
"preview": "name: CI\n\non:\n push:\n branches: [main, master]\n pull_request:\n\njobs:\n ci:\n uses: folke/github/.github/workflows"
},
{
"path": ".github/workflows/labeler.yml",
"chars": 144,
"preview": "name: \"PR Labeler\"\non:\n - pull_request_target\n\njobs:\n labeler:\n uses: folke/github/.github/workflows/labeler.yml@ma"
},
{
"path": ".github/workflows/pr.yml",
"chars": 275,
"preview": "name: PR Title\n\non:\n pull_request_target:\n types:\n - opened\n - edited\n - synchronize\n - reopened"
},
{
"path": ".github/workflows/stale.yml",
"chars": 236,
"preview": "name: Stale Issues & PRs\n\non:\n schedule:\n - cron: \"30 1 * * *\"\n\njobs:\n stale:\n if: contains(fromJSON('[\"folke\", "
},
{
"path": ".github/workflows/update.yml",
"chars": 272,
"preview": "name: Update Repo\n\non:\n workflow_dispatch:\n schedule:\n # Run every hour\n - cron: \"0 * * * *\"\n\njobs:\n update:\n "
},
{
"path": ".gitignore",
"chars": 70,
"preview": "*.log\n/.repro\n/.tests\n/build\n/debug\n/doc/tags\nfoo.*\nnode_modules\ntt.*\n"
},
{
"path": ".markdownlint-cli2.yaml",
"chars": 38,
"preview": "config:\n MD013: false\n MD033: false\n"
},
{
"path": "CHANGELOG.md",
"chars": 305707,
"preview": "# Changelog\n\n## [2.31.0](https://github.com/folke/snacks.nvim/compare/v2.30.0...v2.31.0) (2026-03-20)\n\n\n### Features\n\n* "
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 17472,
"preview": "# 🍿 `snacks.nvim`\n\nA collection of small QoL plugins for Neovim.\n\n## ✨ Features\n\n<!-- toc:start -->\n\n| Snack | Descripti"
},
{
"path": "doc/snacks.nvim-animate.txt",
"chars": 5097,
"preview": "*snacks-animate* snacks animate docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-bigfile.txt",
"chars": 2449,
"preview": "*snacks-bigfile* snacks bigfile docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-bufdelete.txt",
"chars": 2612,
"preview": "*snacks-bufdelete* snacks bufdelete docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-dashboard.txt",
"chars": 25672,
"preview": "*snacks-dashboard* snacks dashboard docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-debug.txt",
"chars": 6239,
"preview": "*snacks-debug* snacks debug docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-dim.txt",
"chars": 3347,
"preview": "*snacks-dim* snacks dim docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-explorer.txt",
"chars": 7801,
"preview": "*snacks-explorer* snacks explorer docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-gh.txt",
"chars": 10637,
"preview": "*snacks-gh* snacks gh docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-git.txt",
"chars": 1896,
"preview": "*snacks-git* snacks git docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-gitbrowse.txt",
"chars": 5469,
"preview": "*snacks-gitbrowse* snacks gitbrowse docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-health.txt",
"chars": 2100,
"preview": "*snacks-health* snacks health docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-image.txt",
"chars": 12679,
"preview": "*snacks-image* snacks image docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-indent.txt",
"chars": 5754,
"preview": "*snacks-indent* snacks indent docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-init.txt",
"chars": 5712,
"preview": "*snacks-init* snacks init docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-input.txt",
"chars": 5442,
"preview": "*snacks-input* snacks input docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-keymap.txt",
"chars": 6426,
"preview": "*snacks-keymap* snacks keymap docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-layout.txt",
"chars": 6011,
"preview": "*snacks-layout* snacks layout docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-lazygit.txt",
"chars": 6039,
"preview": "*snacks-lazygit* snacks lazygit docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-meta.txt",
"chars": 1771,
"preview": "*snacks-meta* snacks meta docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-notifier.txt",
"chars": 12311,
"preview": "*snacks-notifier* snacks notifier docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-notify.txt",
"chars": 2243,
"preview": "*snacks-notify* snacks notify docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-picker.txt",
"chars": 117926,
"preview": "*snacks-picker* snacks picker docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-profiler.txt",
"chars": 18198,
"preview": "*snacks-profiler* snacks profiler docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-quickfile.txt",
"chars": 1353,
"preview": "*snacks-quickfile* snacks quickfile docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-rename.txt",
"chars": 6259,
"preview": "*snacks-rename* snacks rename docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-scope.txt",
"chars": 7464,
"preview": "*snacks-scope* snacks scope docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-scratch.txt",
"chars": 7237,
"preview": "*snacks-scratch* snacks scratch docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-scroll.txt",
"chars": 2968,
"preview": "*snacks-scroll* snacks scroll docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-statuscolumn.txt",
"chars": 3571,
"preview": "*snacks-statuscolumn* snacks statuscolumn docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-styles.txt",
"chars": 9851,
"preview": "*snacks-styles* snacks styles docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-terminal.txt",
"chars": 8885,
"preview": "*snacks-terminal* snacks terminal docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-toggle.txt",
"chars": 7058,
"preview": "*snacks-toggle* snacks toggle docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-util.txt",
"chars": 9070,
"preview": "*snacks-util* snacks util docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-win.txt",
"chars": 18394,
"preview": "*snacks-win* snacks win docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-words.txt",
"chars": 3177,
"preview": "*snacks-words* snacks words docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim-zen.txt",
"chars": 5120,
"preview": "*snacks-zen* snacks zen docs\n\n======================================================"
},
{
"path": "doc/snacks.nvim.txt",
"chars": 18885,
"preview": "*snacks* snacks docs\n\n======================================================"
},
{
"path": "docs/animate.md",
"chars": 3237,
"preview": "# 🍿 animate\n\nEfficient animation library including over 45 easing functions:\n\n- [Emmanuel Oga's easing functions](https:"
},
{
"path": "docs/bigfile.md",
"chars": 1572,
"preview": "# 🍿 bigfile\n\n`bigfile` adds a new filetype `bigfile` to Neovim that triggers when the file is\nlarger than the configured"
},
{
"path": "docs/bufdelete.md",
"chars": 1295,
"preview": "# 🍿 bufdelete\n\nDelete buffers without disrupting window layout.\n\nIf the buffer you want to close has changes,\na prompt w"
},
{
"path": "docs/dashboard.md",
"chars": 17866,
"preview": "# 🍿 dashboard\n\n## ✨ Features\n\n- declarative configuration\n- flexible layouts\n- multiple vertical panes\n- built-in sectio"
},
{
"path": "docs/debug.md",
"chars": 3515,
"preview": "# 🍿 debug\n\nUtility functions you can use in your code.\n\nPersonally, I have the code below at the top of my `init.lua`:\n\n"
},
{
"path": "docs/dim.md",
"chars": 1586,
"preview": "# 🍿 dim\n\nFocus on the active scope by dimming the rest.\n\nSimilar plugins:\n\n- [twilight.nvim](https://github.com/folke/tw"
},
{
"path": "docs/examples/dashboard.lua",
"chars": 6012,
"preview": "local M = {}\n\n---@type table<string, snacks.dashboard.Section>\nM.examples = {}\n\n-- Similar to the Emacs Doom dashboard\n-"
},
{
"path": "docs/examples/init.lua",
"chars": 3847,
"preview": "-- stylua: ignore\nreturn {\n \"folke/snacks.nvim\",\n priority = 1000,\n lazy = false,\n ---@type snacks.Config\n opts = {"
},
{
"path": "docs/examples/picker.lua",
"chars": 7297,
"preview": "local M = {}\n\nM.examples = {}\n\nM.examples.general = {\n \"folke/snacks.nvim\",\n opts = {\n picker = {},\n explorer = "
},
{
"path": "docs/explorer.md",
"chars": 4830,
"preview": "# 🍿 explorer\n\nA file explorer for snacks. This is actually a [picker](https://github.com/folke/snacks.nvim/blob/main/doc"
},
{
"path": "docs/gh.md",
"chars": 7997,
"preview": "# 🍿 gh\n\nA modern GitHub CLI integration for Neovim that brings GitHub issues and pull requests directly into your editor"
},
{
"path": "docs/git.md",
"chars": 705,
"preview": "# 🍿 git\n\n<!-- docgen -->\n\n## 🎨 Styles\n\nCheck the [styles](https://github.com/folke/snacks.nvim/blob/main/docs/styles.md)"
},
{
"path": "docs/gitbrowse.md",
"chars": 3534,
"preview": "# 🍿 gitbrowse\n\nOpen the repo of the active file in the browser (e.g., GitHub)\n\n<!-- docgen -->\n\n## 📦 Setup\n\n```lua\n-- la"
},
{
"path": "docs/health.md",
"chars": 916,
"preview": "# 🍿 health\n\n<!-- docgen -->\n\n## 📚 Types\n\n```lua\n---@class snacks.health.Tool\n---@field cmd string|string[]\n---@field ver"
},
{
"path": "docs/image.md",
"chars": 9229,
"preview": "# 🍿 image\n\n\n\n## ✨ Features\n\n- I"
},
{
"path": "docs/indent.md",
"chars": 3578,
"preview": "# 🍿 indent\n\nVisualize indent guides and scopes based on treesitter or indent.\n\nSimilar plugins:\n\n- [indent-blankline.nvi"
},
{
"path": "docs/init.md",
"chars": 3672,
"preview": "# 🍿 init\n\n<!-- docgen -->\n\n## ⚙️ Config\n\n```lua\n---@class snacks.Config\n---@field animate? snacks.animate.Config\n---@fie"
},
{
"path": "docs/input.md",
"chars": 2834,
"preview": "# 🍿 input\n\nBetter `vim.ui.input`.\n\n\n\n## Notification"
},
{
"path": "docs/notify.md",
"chars": 797,
"preview": "# 🍿 notify\n\n<!-- docgen -->\n\n## 📚 Types\n\n```lua\n---@alias snacks.notify.Opts snacks.notifier.Notif.opts|{once?: boolean}"
},
{
"path": "docs/picker.md",
"chars": 79266,
"preview": "# 🍿 picker\n\nSnacks now comes with a modern fuzzy-finder to navigate the Neovim universe.\n\n: "
},
{
"path": "lua/snacks/bigfile.lua",
"chars": 2328,
"preview": "---@private\n---@class snacks.bigfile\nlocal M = {}\n\nM.meta = {\n desc = \"Deal with big files\",\n needs_setup = true,\n}\n\n-"
},
{
"path": "lua/snacks/bufdelete.lua",
"chars": 3470,
"preview": "---@class snacks.bufdelete\n---@overload fun(buf?: number|snacks.bufdelete.Opts)\nlocal M = setmetatable({}, {\n __call = "
},
{
"path": "lua/snacks/compat.lua",
"chars": 654,
"preview": "---@generic T\n---@param t T\n---@return T\nlocal function wrap(t)\n return setmetatable({}, { __index = t })\nend\n\nlocal M "
},
{
"path": "lua/snacks/dashboard.lua",
"chars": 41658,
"preview": "---@class snacks.dashboard\n---@overload fun(opts?: snacks.dashboard.Opts): snacks.dashboard.Class\nlocal M = setmetatable"
},
{
"path": "lua/snacks/debug.lua",
"chars": 13457,
"preview": "---@class snacks.debug\n---@overload fun(...)\nlocal M = setmetatable({}, {\n __call = function(t, ...)\n return t.inspe"
},
{
"path": "lua/snacks/dim.lua",
"chars": 4108,
"preview": "---@class snacks.dim\n---@overload fun(opts: snacks.dim.Config)\nlocal M = setmetatable({}, {\n __call = function(M, ...)\n"
},
{
"path": "lua/snacks/explorer/actions.lua",
"chars": 10152,
"preview": "local Git = require(\"snacks.explorer.git\")\nlocal Tree = require(\"snacks.explorer.tree\")\n\n---@class snacks.explorer.diagn"
},
{
"path": "lua/snacks/explorer/diagnostics.lua",
"chars": 995,
"preview": "---@diagnostic disable: missing-fields\nlocal M = {}\n\n---@param cwd string\nfunction M.update(cwd)\n local Tree = require("
},
{
"path": "lua/snacks/explorer/git.lua",
"chars": 4250,
"preview": "---@diagnostic disable: missing-fields\nlocal M = {}\n\n---@class snacks.explorer.git.Status\n---@field status string\n---@fi"
},
{
"path": "lua/snacks/explorer/init.lua",
"chars": 3612,
"preview": "---@class snacks.explorer\n---@overload fun(opts?: snacks.picker.explorer.Config): snacks.Picker\nlocal M = setmetatable({"
},
{
"path": "lua/snacks/explorer/tree.lua",
"chars": 9799,
"preview": "---@class snacks.picker.explorer.Node\n---@field path string\n---@field name string\n---@field hidden? boolean\n---@field st"
},
{
"path": "lua/snacks/explorer/watch.lua",
"chars": 2846,
"preview": "local M = {}\n\nlocal Git = require(\"snacks.explorer.git\")\nlocal Tree = require(\"snacks.explorer.tree\")\n\nM._watches = {} -"
},
{
"path": "lua/snacks/gh/actions.lua",
"chars": 28742,
"preview": "local Api = require(\"snacks.gh.api\")\nlocal config = require(\"snacks.gh\").config()\n\nlocal M = {}\n\n---@class snacks.gh.act"
},
{
"path": "lua/snacks/gh/api.lua",
"chars": 14906,
"preview": "local Async = require(\"snacks.picker.util.async\")\nlocal Item = require(\"snacks.gh.item\")\nlocal Proc = require(\"snacks.ut"
},
{
"path": "lua/snacks/gh/buf.lua",
"chars": 5696,
"preview": "local Actions = require(\"snacks.gh.actions\")\nlocal Api = require(\"snacks.gh.api\")\nlocal Item = require(\"snacks.gh.item\")"
},
{
"path": "lua/snacks/gh/init.lua",
"chars": 5714,
"preview": "---@class snacks.gh\n---@field api snacks.gh.api\n---@field item snacks.picker.gh.Item\nlocal M = setmetatable({}, {\n ---@"
},
{
"path": "lua/snacks/gh/item.lua",
"chars": 4840,
"preview": "---@class snacks.picker.gh.Item\n---@field opts snacks.gh.api.Config\nlocal M = {}\n\nlocal time_fields = {\n created = \"cre"
},
{
"path": "lua/snacks/gh/render/init.lua",
"chars": 18726,
"preview": "local Markdown = require(\"snacks.picker.util.markdown\")\n\nlocal M = {}\nlocal H = Snacks.picker.highlight\nlocal U = Snacks"
},
{
"path": "lua/snacks/gh/types.lua",
"chars": 6978,
"preview": "---@class snacks.gh.api.Config\n---@field type \"issue\" | \"pr\"\n---@field repo? string\n---@field fields string[]\n---@field "
},
{
"path": "lua/snacks/git.lua",
"chars": 1583,
"preview": "---@class snacks.git\nlocal M = {}\n\nM.meta = {\n desc = \"Git utilities\",\n}\n\nSnacks.config.style(\"blame_line\", {\n width ="
},
{
"path": "lua/snacks/gitbrowse.lua",
"chars": 7966,
"preview": "---@class snacks.gitbrowse\n---@overload fun(opts?: snacks.gitbrowse.Config)\nlocal M = setmetatable({}, {\n __call = func"
},
{
"path": "lua/snacks/health.lua",
"chars": 4655,
"preview": "---@class snacks.health\n---@field ok fun(msg: string)\n---@field warn fun(msg: string)\n---@field error fun(msg: string)\n-"
},
{
"path": "lua/snacks/image/buf.lua",
"chars": 1601,
"preview": "---@class snacks.image.buf\nlocal M = {}\n\n---@param buf number\n---@param opts? snacks.image.Opts|{src?: string}\nfunction "
},
{
"path": "lua/snacks/image/convert.lua",
"chars": 13020,
"preview": "local Spawn = require(\"snacks.util.spawn\")\n\n---@class snacks.image.convert\nlocal M = {}\n\nlocal uv = vim.uv or vim.loop\n\n"
},
{
"path": "lua/snacks/image/doc.lua",
"chars": 13704,
"preview": "---@class snacks.image.doc\nlocal M = {}\n\n---@alias TSMatch {node:TSNode, meta:vim.treesitter.query.TSMetadata}\n---@alias"
},
{
"path": "lua/snacks/image/image.lua",
"chars": 5065,
"preview": "---@class snacks.Image\n---@field src string\n---@field file string\n---@field id number image id. unique per nvim instance"
},
{
"path": "lua/snacks/image/init.lua",
"chars": 12387,
"preview": "---@class snacks.image\n---@field terminal snacks.image.terminal\n---@field image snacks.Image\n---@field placement snacks."
},
{
"path": "lua/snacks/image/inline.lua",
"chars": 4126,
"preview": "---@class snacks.image.inline\n---@field buf number\n---@field imgs table<number, snacks.image.Placement>\n---@field idx ta"
},
{
"path": "lua/snacks/image/placement.lua",
"chars": 17872,
"preview": "---@class snacks.image.Placement\n---@field img snacks.Image\n---@field id number image placement id\n---@field ns number\n-"
},
{
"path": "lua/snacks/image/terminal.lua",
"chars": 7544,
"preview": "---@class snacks.image.terminal\n---@field transform? fun(data: string): string\nlocal M = {}\n\nlocal size ---@type snacks."
},
{
"path": "lua/snacks/image/util.lua",
"chars": 2795,
"preview": "---@class snacks.image.util\nlocal M = {}\n\nlocal dims = {} ---@type table<string, snacks.image.Size>\n\n--- Get the dimensi"
},
{
"path": "lua/snacks/indent.lua",
"chars": 17171,
"preview": "---@class snacks.indent\nlocal M = {}\n\nM.meta = {\n desc = \"Indent guides and scopes\",\n}\n\nM.enabled = false\n\n---@class sn"
},
{
"path": "lua/snacks/init.lua",
"chars": 5983,
"preview": "---@class Snacks: snacks.plugins\nlocal M = {}\n\nsetmetatable(M, {\n __index = function(t, k)\n ---@diagnostic disable-n"
},
{
"path": "lua/snacks/input.lua",
"chars": 8403,
"preview": "---@class snacks.input\n---@overload fun(opts: snacks.input.Opts, on_confirm: fun(value?: string)): snacks.win\nlocal M = "
},
{
"path": "lua/snacks/keymap.lua",
"chars": 7286,
"preview": "---@class snacks.keymap\nlocal M = {}\n\nM.meta = {\n desc = \"Better `vim.keymap` with support for filetypes and LSP client"
},
{
"path": "lua/snacks/layout.lua",
"chars": 16495,
"preview": "---@class snacks.layout\n---@field opts snacks.layout.Config\n---@field root snacks.win\n---@field wins table<string, snack"
},
{
"path": "lua/snacks/lazygit.lua",
"chars": 7142,
"preview": "---@class snacks.lazygit\n---@overload fun(opts?: snacks.lazygit.Config): snacks.win\nlocal M = setmetatable({}, {\n __cal"
},
{
"path": "lua/snacks/meta/docs.lua",
"chars": 20984,
"preview": "local M = {}\n\nM.meta = {\n desc = \"Doc-gen for Snacks\",\n hide = true,\n}\n\nlocal query = vim.treesitter.query.parse(\n \"l"
},
{
"path": "lua/snacks/meta/init.lua",
"chars": 1983,
"preview": "---@class snacks.meta\nlocal M = {}\n\nM.meta = {\n desc = \"Meta functions for Snacks\",\n readme = false,\n}\n\n---@class snac"
},
{
"path": "lua/snacks/meta/types.lua",
"chars": 2204,
"preview": "---@meta _\n\n---@class snacks.plugins\n---@field animate snacks.animate\n---@field bigfile snacks.bigfile\n---@field bufdele"
},
{
"path": "lua/snacks/notifier.lua",
"chars": 23179,
"preview": "---@class snacks.notifier\n---@overload fun(msg: string, level?: snacks.notifier.level|number, opts?: snacks.notifier.Not"
},
{
"path": "lua/snacks/notify.lua",
"chars": 1365,
"preview": "---@class snacks.notify\n---@overload fun(msg: string|string[], opts?: snacks.notify.Opts)\nlocal M = setmetatable({}, {\n "
},
{
"path": "lua/snacks/picker/actions.lua",
"chars": 22841,
"preview": "---@class snacks.picker.actions\n---@field [string] snacks.picker.Action.spec\nlocal M = {}\n\n---@class snacks.picker.jump."
},
{
"path": "lua/snacks/picker/config/defaults.lua",
"chars": 18907,
"preview": "local M = {}\n\n---@alias snacks.picker.format.resolve fun(max_width:number):snacks.picker.Highlight[]\n---@alias snacks.pi"
},
{
"path": "lua/snacks/picker/config/highlights.lua",
"chars": 3464,
"preview": "---@class snacks.picker.config.highlights\nlocal M = {}\n\nSnacks.util.set_hl({\n Match = \"Special\",\n Search = \"Search\",\n "
},
{
"path": "lua/snacks/picker/config/init.lua",
"chars": 10567,
"preview": "---@class snacks.picker.config\nlocal M = {}\n\n--- Source aliases\nM.alias = {\n live_grep = \"grep\",\n find_files = \"files\""
},
{
"path": "lua/snacks/picker/config/layouts.lua",
"chars": 4251,
"preview": "---@class snacks.picker.layouts\n---@field [string] snacks.picker.layout.Config\nlocal M = {}\n\nM.default = {\n layout = {\n"
},
{
"path": "lua/snacks/picker/config/sources.lua",
"chars": 29828,
"preview": "---@class snacks.picker.Config\n---@field supports_live? boolean\n\n---@class snacks.picker.sources.Config\n---@field [strin"
},
{
"path": "lua/snacks/picker/core/_health.lua",
"chars": 1687,
"preview": "local M = {}\n\n---@private\nfunction M.health()\n local config = Snacks.picker.config.get()\n if Snacks.config.get(\"picker"
},
{
"path": "lua/snacks/picker/core/actions.lua",
"chars": 3339,
"preview": "local M = {}\n\n---@alias snacks.picker.Action.fn fun(self: snacks.Picker, item?:snacks.picker.Item, action?:snacks.picker"
},
{
"path": "lua/snacks/picker/core/filter.lua",
"chars": 3582,
"preview": "---@class snacks.picker.Filter\n---@field pattern string Pattern used to filter items by the matcher\n---@field search str"
},
{
"path": "lua/snacks/picker/core/finder.lua",
"chars": 6112,
"preview": "local Async = require(\"snacks.picker.util.async\")\n\n---@class snacks.picker.Finder\n---@field _find snacks.picker.finder\n-"
},
{
"path": "lua/snacks/picker/core/frecency.lua",
"chars": 5349,
"preview": "-- Frecency based on exponential decay. Roughly based on:\n-- https://wiki.mozilla.org/User:Jesse/NewFrecency?title=User:"
},
{
"path": "lua/snacks/picker/core/input.lua",
"chars": 6072,
"preview": "---@class snacks.picker.input\n---@field win snacks.win\n---@field mode? string\n---@field totals string\n---@field picker s"
},
{
"path": "lua/snacks/picker/core/list.lua",
"chars": 18153,
"preview": "---@class snacks.picker.list\n---@field picker snacks.Picker\n---@field items snacks.picker.Item[]\n---@field top number\n--"
},
{
"path": "lua/snacks/picker/core/main.lua",
"chars": 2421,
"preview": "---@class snacks.picker.Main\n---@field opts snacks.picker.main.Config\n---@field win number\nlocal M = {}\nM.__index = M\n\n-"
},
{
"path": "lua/snacks/picker/core/matcher.lua",
"chars": 16021,
"preview": "local Async = require(\"snacks.picker.util.async\")\n\n---@class snacks.picker.Item\n---@field match_tick? number\n---@field m"
},
{
"path": "lua/snacks/picker/core/picker.lua",
"chars": 23669,
"preview": "local Async = require(\"snacks.picker.util.async\")\nlocal Finder = require(\"snacks.picker.core.finder\")\n\nlocal uv = vim.uv"
},
{
"path": "lua/snacks/picker/core/preview.lua",
"chars": 12838,
"preview": "---@class snacks.picker.Preview\n---@field item? snacks.picker.Item\n---@field pos? snacks.picker.Pos\n---@field win snacks"
},
{
"path": "lua/snacks/picker/core/score.lua",
"chars": 5695,
"preview": "--- This is a port of the scoring logic from fzf. See:\n--- https://github.com/junegunn/fzf/blob/master/src/algo/algo.go\n"
},
{
"path": "lua/snacks/picker/format.lua",
"chars": 23599,
"preview": "---@class snacks.picker.formatters\n---@field [string] snacks.picker.format\nlocal M = {}\n\nlocal uv = vim.uv or vim.loop\n\n"
},
{
"path": "lua/snacks/picker/init.lua",
"chars": 3147,
"preview": "---@class snacks.picker\n---@field actions snacks.picker.actions\n---@field config snacks.picker.config\n---@field format s"
},
{
"path": "lua/snacks/picker/preview.lua",
"chars": 11859,
"preview": "---@class snacks.picker.previewers\nlocal M = {}\n\nlocal uv = vim.uv or vim.loop\nlocal ns = vim.api.nvim_create_namespace("
},
{
"path": "lua/snacks/picker/resume.lua",
"chars": 2106,
"preview": "local M = {}\n\nM.state = {} ---@type table<string, snacks.picker.resume.State>\n\n---@param picker snacks.Picker\nfunction M"
},
{
"path": "lua/snacks/picker/select.lua",
"chars": 2637,
"preview": "local M = {}\n\n---@alias vim.ui.select.on_choice fun(item?: any, idx?: number)\n---@alias snacks.picker.ui_select fun(item"
},
{
"path": "lua/snacks/picker/sort.lua",
"chars": 1574,
"preview": "---@class snacks.picker.sorters\nlocal M = {}\n\n---@alias snacks.picker.sort.Field { name: string, desc: boolean, len?: bo"
},
{
"path": "lua/snacks/picker/source/buffers.lua",
"chars": 1867,
"preview": "local M = {}\n\n---@param opts snacks.picker.buffers.Config\n---@type snacks.picker.finder\nfunction M.buffers(opts, ctx)\n "
},
{
"path": "lua/snacks/picker/source/diagnostics.lua",
"chars": 1342,
"preview": "local M = {}\nlocal uv = vim.uv or vim.loop\n\n---@param opts snacks.picker.diagnostics.Config\n---@type snacks.picker.finde"
},
{
"path": "lua/snacks/picker/source/diff.lua",
"chars": 9452,
"preview": "local M = {}\n\n---@class snacks.picker.diff.Config: snacks.picker.proc.Config\n---@field cmd? string optional since diff c"
},
{
"path": "lua/snacks/picker/source/explorer.lua",
"chars": 10064,
"preview": "---@diagnostic disable: await-in-sync\nlocal Actions = require(\"snacks.explorer.actions\")\nlocal Tree = require(\"snacks.ex"
},
{
"path": "lua/snacks/picker/source/files.lua",
"chars": 5045,
"preview": "local M = {}\n\nlocal uv = vim.uv or vim.loop\n\n---@type {cmd:string[], args:string[], enabled?:boolean, available?:boolean"
},
{
"path": "lua/snacks/picker/source/gh.lua",
"chars": 10982,
"preview": "local Actions = require(\"snacks.gh.actions\")\nlocal Api = require(\"snacks.gh.api\")\n\nlocal M = {}\n\nM.actions = setmetatabl"
},
{
"path": "lua/snacks/picker/source/git.lua",
"chars": 12795,
"preview": "local M = {}\n\nlocal uv = vim.uv or vim.loop\n\nlocal commit_pat = (\"[a-z0-9]\"):rep(7)\n\n---@class snacks.picker.git.Args\n--"
},
{
"path": "lua/snacks/picker/source/grep.lua",
"chars": 4799,
"preview": "local M = {}\n\nlocal uv = vim.uv or vim.loop\n\nlocal MATCH_SEP = \"\"\n\n---@param opts snacks.picker.grep.Config\n---@param"
},
{
"path": "lua/snacks/picker/source/help.lua",
"chars": 2057,
"preview": "local M = {}\n\n---@param opts snacks.picker.help.Config\n---@type snacks.picker.finder\nfunction M.help(opts, ctx)\n local "
},
{
"path": "lua/snacks/picker/source/icons.lua",
"chars": 4878,
"preview": "local M = {}\n\n---@class snacks.picker.icons.Source\n---@field url string\n---@field v? number\n---@field priority? number\n-"
},
{
"path": "lua/snacks/picker/source/lazy.lua",
"chars": 1119,
"preview": "local M = {}\n\n---@type snacks.picker.finder\nfunction M.spec(opts, ctx)\n local spec = require(\"lazy.core.config\").spec\n "
},
{
"path": "lua/snacks/picker/source/lines.lua",
"chars": 723,
"preview": "local M = {}\n\n---@param opts snacks.picker.lines.Config\n---@type snacks.picker.finder\nfunction M.lines(opts, ctx)\n loca"
},
{
"path": "lua/snacks/picker/source/lsp/config.lua",
"chars": 11365,
"preview": "---@diagnostic disable: await-in-sync\nlocal M = {}\n\nlocal has_11 = vim.fn.has(\"nvim-0.11\") == 1\n\n---@class snacks.picker"
},
{
"path": "lua/snacks/picker/source/lsp/init.lua",
"chars": 17903,
"preview": "---@diagnostic disable: await-in-sync\nlocal Async = require(\"snacks.picker.util.async\")\n\n---@module 'uv'\n\nlocal M = {}\n\n"
},
{
"path": "lua/snacks/picker/source/meta.lua",
"chars": 1021,
"preview": "local M = {}\n\n---@param file string\n---@param t table<string,unknown>\nfunction M.table(file, t)\n file = Snacks.meta.fil"
},
{
"path": "lua/snacks/picker/source/proc.lua",
"chars": 5741,
"preview": "---@diagnostic disable: await-in-sync\nlocal Async = require(\"snacks.picker.util.async\")\n\nlocal M = {}\n\nlocal uv = vim.uv"
},
{
"path": "lua/snacks/picker/source/qf.lua",
"chars": 2787,
"preview": "local M = {}\n\n---Represents an item in a Neovim quickfix/loclist.\n---@class qf.item\n---@field bufnr? number The buffer n"
},
{
"path": "lua/snacks/picker/source/recent.lua",
"chars": 3626,
"preview": "local M = {}\n\nlocal uv = vim.uv or vim.loop\n\n---@param filter snacks.picker.Filter\n---@param extra? string[]\nlocal funct"
},
{
"path": "lua/snacks/picker/source/scratch.lua",
"chars": 1775,
"preview": "local M = {}\n\n---@class snacks.scratch.actions\n---@field [string] snacks.picker.Action.spec\nM.actions = {\n scratch_open"
},
{
"path": "lua/snacks/picker/source/snacks.lua",
"chars": 540,
"preview": "local M = {}\n\n---@param opts snacks.picker.notifications.Config\nfunction M.notifier(opts)\n local notifs = Snacks.notifi"
},
{
"path": "lua/snacks/picker/source/system.lua",
"chars": 1806,
"preview": "local M = {}\n\n---@param opts snacks.picker.proc.Config\n---@type snacks.picker.finder\nfunction M.cliphist(opts, ctx)\n re"
},
{
"path": "lua/snacks/picker/source/treesitter.lua",
"chars": 5076,
"preview": "local M = {}\n\n---@class snacks.picker.treesitter.Match\n---@field id string\n---@field name string\n---@field node TSNode\n-"
},
{
"path": "lua/snacks/picker/source/vim.lua",
"chars": 15733,
"preview": "local M = {}\n\n---@class snacks.picker.history.Config: snacks.picker.Config\n---@field name string\n\nfunction M.commands()\n"
},
{
"path": "lua/snacks/picker/transform.lua",
"chars": 428,
"preview": "---@class snacks.picker.transformers\n---@field [string] snacks.picker.transform\nlocal M = {}\n\nfunction M.unique_file(ite"
},
{
"path": "lua/snacks/picker/types.lua",
"chars": 5187,
"preview": "---@meta _\n\n---@class snacks.picker\n---@field autocmds fun(opts?: snacks.picker.Config|{}): snacks.Picker\n---@field buff"
},
{
"path": "lua/snacks/picker/util/async.lua",
"chars": 7685,
"preview": "---@class snacks.picker.async\nlocal M = {}\n\n---@type snacks.picker.Async[]\nM._active = {}\n---@type snacks.picker.Async[]"
},
{
"path": "lua/snacks/picker/util/db.lua",
"chars": 6866,
"preview": "local ffi = require(\"ffi\")\n\nffi.cdef([[\n typedef struct sqlite3 sqlite3;\n typedef struct sqlite3_stmt sqlite3_stmt;\n\n "
},
{
"path": "lua/snacks/picker/util/diff.lua",
"chars": 16600,
"preview": "local M = {}\n\n---@class snacks.diff.Config\n---@field max_hunk_lines? number only show last N lines of each hunk (used by"
},
{
"path": "lua/snacks/picker/util/highlight.lua",
"chars": 18848,
"preview": "---@class snacks.picker.highlight\nlocal M = {}\n\n---@class (private) vim.var_accessor\n---@field snacks_meta? table<number"
},
{
"path": "lua/snacks/picker/util/history.lua",
"chars": 1808,
"preview": "---@class snacks.picker.History\n---@field path string\n---@field kv snacks.picker.KeyValue\n---@field idx number\n---@field"
},
{
"path": "lua/snacks/picker/util/init.lua",
"chars": 19356,
"preview": "---@class snacks.picker.util\nlocal M = {}\n\nlocal uv = vim.uv or vim.loop\n\nlocal str_byteindex_new = pcall(vim.str_bytein"
},
{
"path": "lua/snacks/picker/util/kv.lua",
"chars": 2043,
"preview": "---@class snacks.picker.KeyValue\n---@field data table<string, number>\n---@field loaded_time number\n---@field path string"
},
{
"path": "lua/snacks/picker/util/markdown.lua",
"chars": 2333,
"preview": "local M = {}\n\nlocal ns = vim.api.nvim_create_namespace(\"snacks.picker.util.markdown\")\nlocal did_setup = false\n\n---@priva"
},
{
"path": "lua/snacks/picker/util/minheap.lua",
"chars": 3778,
"preview": "---@class snacks.picker.MinHeap\n---@field data any[] -- the heap array\n---@field cmp fun(a:any, b:any):boolean "
},
{
"path": "lua/snacks/picker/util/queue.lua",
"chars": 752,
"preview": "--- Efficient queue implementation.\n--- Prevents need to shift elements when popping.\n---@class snacks.picker.queue\n---@"
},
{
"path": "lua/snacks/picker/util/spinner.lua",
"chars": 3167,
"preview": "---@class snacks.util.spinner.Opts\n---@field extmark? fun(spinner:string): vim.api.keyset.set_extmark\n\n---@class snacks."
},
{
"path": "lua/snacks/profiler/core.lua",
"chars": 6484,
"preview": "---@class snacks.profiler.core\nlocal M = {}\n\nlocal hrtime = (vim.uv or vim.loop).hrtime\nlocal nvim_create_autocmd = vim."
}
]
// ... and 72 more files (download for full content)
About this extraction
This page contains the full source code of the folke/snacks.nvim GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 272 files (2.4 MB), approximately 643.3k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.