snacks.nvim/doc/snacks-picker.txt
Folke Lemaitre a4fe279bf4
docs: docgen
2025-02-20 17:11:40 +01:00

3336 lines
101 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

*snacks-picker* snacks_picker
==============================================================================
Table of Contents *snacks-picker-table-of-contents*
1. Features |snacks-picker-features|
2. Usage |snacks-picker-usage|
3. Setup |snacks-picker-setup|
4. Config |snacks-picker-config|
5. Examples |snacks-picker-examples|
- flash |snacks-picker-examples-flash|
- general |snacks-picker-examples-general|
- todo_comments |snacks-picker-examples-todo_comments|
- trouble |snacks-picker-examples-trouble|
6. Types |snacks-picker-types|
7. Module |snacks-picker-module|
- Snacks.picker() |snacks-picker-module-snacks.picker()|
- Snacks.picker.get() |snacks-picker-module-snacks.picker.get()|
- Snacks.picker.pick() |snacks-picker-module-snacks.picker.pick()|
- Snacks.picker.select() |snacks-picker-module-snacks.picker.select()|
8. Sources |snacks-picker-sources|
- autocmds |snacks-picker-sources-autocmds|
- buffers |snacks-picker-sources-buffers|
- cliphist |snacks-picker-sources-cliphist|
- colorschemes |snacks-picker-sources-colorschemes|
- command_history |snacks-picker-sources-command_history|
- commands |snacks-picker-sources-commands|
- diagnostics |snacks-picker-sources-diagnostics|
- diagnostics_buffer |snacks-picker-sources-diagnostics_buffer|
- explorer |snacks-picker-sources-explorer|
- files |snacks-picker-sources-files|
- git_branches |snacks-picker-sources-git_branches|
- git_diff |snacks-picker-sources-git_diff|
- git_files |snacks-picker-sources-git_files|
- git_grep |snacks-picker-sources-git_grep|
- git_log |snacks-picker-sources-git_log|
- git_log_file |snacks-picker-sources-git_log_file|
- git_log_line |snacks-picker-sources-git_log_line|
- git_stash |snacks-picker-sources-git_stash|
- git_status |snacks-picker-sources-git_status|
- grep |snacks-picker-sources-grep|
- grep_buffers |snacks-picker-sources-grep_buffers|
- grep_word |snacks-picker-sources-grep_word|
- help |snacks-picker-sources-help|
- highlights |snacks-picker-sources-highlights|
- icons |snacks-picker-sources-icons|
- jumps |snacks-picker-sources-jumps|
- keymaps |snacks-picker-sources-keymaps|
- lazy |snacks-picker-sources-lazy|
- lines |snacks-picker-sources-lines|
- loclist |snacks-picker-sources-loclist|
- lsp_config |snacks-picker-sources-lsp_config|
- lsp_declarations |snacks-picker-sources-lsp_declarations|
- lsp_definitions |snacks-picker-sources-lsp_definitions|
- lsp_implementations |snacks-picker-sources-lsp_implementations|
- lsp_references |snacks-picker-sources-lsp_references|
- lsp_symbols |snacks-picker-sources-lsp_symbols|
- lsp_type_definitions |snacks-picker-sources-lsp_type_definitions|
- lsp_workspace_symbols |snacks-picker-sources-lsp_workspace_symbols|
- man |snacks-picker-sources-man|
- marks |snacks-picker-sources-marks|
- notifications |snacks-picker-sources-notifications|
- picker_actions |snacks-picker-sources-picker_actions|
- picker_format |snacks-picker-sources-picker_format|
- picker_layouts |snacks-picker-sources-picker_layouts|
- picker_preview |snacks-picker-sources-picker_preview|
- pickers |snacks-picker-sources-pickers|
- projects |snacks-picker-sources-projects|
- qflist |snacks-picker-sources-qflist|
- recent |snacks-picker-sources-recent|
- registers |snacks-picker-sources-registers|
- resume |snacks-picker-sources-resume|
- search_history |snacks-picker-sources-search_history|
- select |snacks-picker-sources-select|
- smart |snacks-picker-sources-smart|
- spelling |snacks-picker-sources-spelling|
- treesitter |snacks-picker-sources-treesitter|
- undo |snacks-picker-sources-undo|
- zoxide |snacks-picker-sources-zoxide|
9. Layouts |snacks-picker-layouts|
- bottom |snacks-picker-layouts-bottom|
- default |snacks-picker-layouts-default|
- dropdown |snacks-picker-layouts-dropdown|
- ivy |snacks-picker-layouts-ivy|
- ivy_split |snacks-picker-layouts-ivy_split|
- left |snacks-picker-layouts-left|
- right |snacks-picker-layouts-right|
- select |snacks-picker-layouts-select|
- sidebar |snacks-picker-layouts-sidebar|
- telescope |snacks-picker-layouts-telescope|
- top |snacks-picker-layouts-top|
- vertical |snacks-picker-layouts-vertical|
- vscode |snacks-picker-layouts-vscode|
10. snacks.picker.actions |snacks-picker-snacks.picker.actions|
- Snacks.picker.actions.bufdelete()|snacks-picker-snacks.picker.actions-snacks.picker.actions.bufdelete()|
- Snacks.picker.actions.cancel()|snacks-picker-snacks.picker.actions-snacks.picker.actions.cancel()|
- Snacks.picker.actions.cd()|snacks-picker-snacks.picker.actions-snacks.picker.actions.cd()|
- Snacks.picker.actions.close()|snacks-picker-snacks.picker.actions-snacks.picker.actions.close()|
- Snacks.picker.actions.cmd()|snacks-picker-snacks.picker.actions-snacks.picker.actions.cmd()|
- Snacks.picker.actions.cycle_win()|snacks-picker-snacks.picker.actions-snacks.picker.actions.cycle_win()|
- Snacks.picker.actions.focus_input()|snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_input()|
- Snacks.picker.actions.focus_list()|snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_list()|
- Snacks.picker.actions.focus_preview()|snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_preview()|
- Snacks.picker.actions.git_branch_add()|snacks-picker-snacks.picker.actions-snacks.picker.actions.git_branch_add()|
- Snacks.picker.actions.git_branch_del()|snacks-picker-snacks.picker.actions-snacks.picker.actions.git_branch_del()|
- Snacks.picker.actions.git_checkout()|snacks-picker-snacks.picker.actions-snacks.picker.actions.git_checkout()|
- Snacks.picker.actions.git_stage()|snacks-picker-snacks.picker.actions-snacks.picker.actions.git_stage()|
- Snacks.picker.actions.git_stash_apply()|snacks-picker-snacks.picker.actions-snacks.picker.actions.git_stash_apply()|
- Snacks.picker.actions.help()|snacks-picker-snacks.picker.actions-snacks.picker.actions.help()|
- Snacks.picker.actions.history_back()|snacks-picker-snacks.picker.actions-snacks.picker.actions.history_back()|
- Snacks.picker.actions.history_forward()|snacks-picker-snacks.picker.actions-snacks.picker.actions.history_forward()|
- Snacks.picker.actions.inspect()|snacks-picker-snacks.picker.actions-snacks.picker.actions.inspect()|
- Snacks.picker.actions.item_action()|snacks-picker-snacks.picker.actions-snacks.picker.actions.item_action()|
- Snacks.picker.actions.jump()|snacks-picker-snacks.picker.actions-snacks.picker.actions.jump()|
- Snacks.picker.actions.layout()|snacks-picker-snacks.picker.actions-snacks.picker.actions.layout()|
- Snacks.picker.actions.lcd()|snacks-picker-snacks.picker.actions-snacks.picker.actions.lcd()|
- Snacks.picker.actions.list_bottom()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_bottom()|
- Snacks.picker.actions.list_down()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_down()|
- Snacks.picker.actions.list_scroll_bottom()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_bottom()|
- Snacks.picker.actions.list_scroll_center()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_center()|
- Snacks.picker.actions.list_scroll_down()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_down()|
- Snacks.picker.actions.list_scroll_top()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_top()|
- Snacks.picker.actions.list_scroll_up()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_up()|
- Snacks.picker.actions.list_top()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_top()|
- Snacks.picker.actions.list_up()|snacks-picker-snacks.picker.actions-snacks.picker.actions.list_up()|
- Snacks.picker.actions.load_session()|snacks-picker-snacks.picker.actions-snacks.picker.actions.load_session()|
- Snacks.picker.actions.loclist()|snacks-picker-snacks.picker.actions-snacks.picker.actions.loclist()|
- Snacks.picker.actions.pick_win()|snacks-picker-snacks.picker.actions-snacks.picker.actions.pick_win()|
- Snacks.picker.actions.picker()|snacks-picker-snacks.picker.actions-snacks.picker.actions.picker()|
- Snacks.picker.actions.picker_grep()|snacks-picker-snacks.picker.actions-snacks.picker.actions.picker_grep()|
- Snacks.picker.actions.preview_scroll_down()|snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_down()|
- Snacks.picker.actions.preview_scroll_left()|snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_left()|
- Snacks.picker.actions.preview_scroll_right()|snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_right()|
- Snacks.picker.actions.preview_scroll_up()|snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_up()|
- Snacks.picker.actions.put()|snacks-picker-snacks.picker.actions-snacks.picker.actions.put()|
- Snacks.picker.actions.qflist()|snacks-picker-snacks.picker.actions-snacks.picker.actions.qflist()|
- Snacks.picker.actions.qflist_all()|snacks-picker-snacks.picker.actions-snacks.picker.actions.qflist_all()|
- Snacks.picker.actions.search()|snacks-picker-snacks.picker.actions-snacks.picker.actions.search()|
- Snacks.picker.actions.select_all()|snacks-picker-snacks.picker.actions-snacks.picker.actions.select_all()|
- Snacks.picker.actions.select_and_next()|snacks-picker-snacks.picker.actions-snacks.picker.actions.select_and_next()|
- Snacks.picker.actions.select_and_prev()|snacks-picker-snacks.picker.actions-snacks.picker.actions.select_and_prev()|
- Snacks.picker.actions.tcd()|snacks-picker-snacks.picker.actions-snacks.picker.actions.tcd()|
- Snacks.picker.actions.terminal()|snacks-picker-snacks.picker.actions-snacks.picker.actions.terminal()|
- Snacks.picker.actions.toggle_focus()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_focus()|
- Snacks.picker.actions.toggle_help_input()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_help_input()|
- Snacks.picker.actions.toggle_help_list()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_help_list()|
- Snacks.picker.actions.toggle_input()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_input()|
- Snacks.picker.actions.toggle_live()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_live()|
- Snacks.picker.actions.toggle_maximize()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_maximize()|
- Snacks.picker.actions.toggle_preview()|snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_preview()|
- Snacks.picker.actions.yank()|snacks-picker-snacks.picker.actions-snacks.picker.actions.yank()|
11. snacks.picker.core.picker |snacks-picker-snacks.picker.core.picker|
- Snacks.picker.picker.get()|snacks-picker-snacks.picker.core.picker-snacks.picker.picker.get()|
- picker:action() |snacks-picker-snacks.picker.core.picker-picker:action()|
- picker:close() |snacks-picker-snacks.picker.core.picker-picker:close()|
- picker:count() |snacks-picker-snacks.picker.core.picker-picker:count()|
- picker:current()|snacks-picker-snacks.picker.core.picker-picker:current()|
- picker:current_win()|snacks-picker-snacks.picker.core.picker-picker:current_win()|
- picker:cwd() |snacks-picker-snacks.picker.core.picker-picker:cwd()|
- picker:dir() |snacks-picker-snacks.picker.core.picker-picker:dir()|
- picker:empty() |snacks-picker-snacks.picker.core.picker-picker:empty()|
- picker:filter() |snacks-picker-snacks.picker.core.picker-picker:filter()|
- picker:find() |snacks-picker-snacks.picker.core.picker-picker:find()|
- picker:focus() |snacks-picker-snacks.picker.core.picker-picker:focus()|
- picker:hist() |snacks-picker-snacks.picker.core.picker-picker:hist()|
- picker:is_active()|snacks-picker-snacks.picker.core.picker-picker:is_active()|
- picker:is_focused()|snacks-picker-snacks.picker.core.picker-picker:is_focused()|
- picker:items() |snacks-picker-snacks.picker.core.picker-picker:items()|
- picker:iter() |snacks-picker-snacks.picker.core.picker-picker:iter()|
- picker:norm() |snacks-picker-snacks.picker.core.picker-picker:norm()|
- picker:on_current_tab()|snacks-picker-snacks.picker.core.picker-picker:on_current_tab()|
- picker:ref() |snacks-picker-snacks.picker.core.picker-picker:ref()|
- picker:resolve()|snacks-picker-snacks.picker.core.picker-picker:resolve()|
- picker:selected()|snacks-picker-snacks.picker.core.picker-picker:selected()|
- picker:set_cwd()|snacks-picker-snacks.picker.core.picker-picker:set_cwd()|
- picker:set_layout()|snacks-picker-snacks.picker.core.picker-picker:set_layout()|
- picker:show_preview()|snacks-picker-snacks.picker.core.picker-picker:show_preview()|
- picker:toggle() |snacks-picker-snacks.picker.core.picker-picker:toggle()|
- picker:word() |snacks-picker-snacks.picker.core.picker-picker:word()|
12. Links |snacks-picker-links|
Snacks now comes with a modern fuzzy-finder to navigate the Neovim universe.
==============================================================================
1. Features *snacks-picker-features*
- over 40 built-in sources <https://github.com/folke/snacks.nvim/blob/main/docs/picker.md#-sources>
- Fast and powerful fuzzy matching engine that supports the fzf <https://junegunn.github.io/fzf/search-syntax/> search syntax
- additionally supports field searches like `file:lua$ 'function`
- `files` and `grep` additionally support adding optiont like `foo -- -e=lua`
- uses **treesitter** highlighting where it makes sense
- Sane default settings so you can start using it right away
- Finders and matchers run asynchronously for maximum performance
- Different layouts <https://github.com/folke/snacks.nvim/blob/main/docs/picker.md#%EF%B8%8F-layouts> to suit your needs, or create your own.
Uses Snacks.layout <https://github.com/folke/snacks.nvim/blob/main/docs/layout.md>
under the hood.
- Simple API to create your own pickers
- Better `vim.ui.select`
Some acknowledgements:
- fzf-lua <https://github.com/ibhagwan/fzf-lua>
- telescope.nvim <https://github.com/nvim-telescope/telescope.nvim>
- mini.pick <https://github.com/echasnovski/mini.pick>
==============================================================================
2. Usage *snacks-picker-usage*
The best way to get started is to copy some of the example configs
<https://github.com/folke/snacks.nvim/blob/main/docs/picker.md#-examples>
below.
>lua
-- Show all pickers
Snacks.picker()
-- run files picker (all three are equivalent)
Snacks.picker.files(opts)
Snacks.picker.pick("files", opts)
Snacks.picker.pick({source = "files", ...})
<
==============================================================================
3. Setup *snacks-picker-setup*
>lua
-- lazy.nvim
{
"folke/snacks.nvim",
---@type snacks.Config
opts = {
picker = {
-- your picker configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
}
}
}
<
==============================================================================
4. Config *snacks-picker-config*
>lua
---@class snacks.picker.Config
---@field multi? (string|snacks.picker.Config)[]
---@field source? string source name and config to use
---@field pattern? string|fun(picker:snacks.Picker):string pattern used to filter items by the matcher
---@field search? string|fun(picker:snacks.Picker):string search string used by finders
---@field cwd? string current working directory
---@field live? boolean when true, typing will trigger live searches
---@field limit? number when set, the finder will stop after finding this number of items. useful for live searches
---@field ui_select? boolean set `vim.ui.select` to a snacks picker
--- Source definition
---@field items? snacks.picker.finder.Item[] items to show instead of using a finder
---@field format? string|snacks.picker.format|string format function or preset
---@field finder? string|snacks.picker.finder|snacks.picker.finder.multi finder function or preset
---@field preview? snacks.picker.preview|string preview function or preset
---@field matcher? snacks.picker.matcher.Config|{} matcher config
---@field sort? snacks.picker.sort|snacks.picker.sort.Config sort function or config
---@field transform? string|snacks.picker.transform transform/filter function
--- UI
---@field win? snacks.picker.win.Config
---@field layout? snacks.picker.layout.Config|string|{}|fun(source:string):(snacks.picker.layout.Config|string)
---@field icons? snacks.picker.icons
---@field prompt? string prompt text / icon
---@field title? string defaults to a capitalized source name
---@field auto_close? boolean automatically close the picker when focusing another window (defaults to true)
---@field show_empty? boolean show the picker even when there are no items
---@field focus? "input"|"list" where to focus when the picker is opened (defaults to "input")
---@field enter? boolean enter the picker when opening it
---@field toggles? table<string, string|false|snacks.picker.toggle>
--- Preset options
---@field previewers? snacks.picker.previewers.Config|{}
---@field formatters? snacks.picker.formatters.Config|{}
---@field sources? snacks.picker.sources.Config|{}|table<string, snacks.picker.Config|{}>
---@field layouts? table<string, snacks.picker.layout.Config>
--- Actions
---@field actions? table<string, snacks.picker.Action.spec> actions used by keymaps
---@field confirm? snacks.picker.Action.spec shortcut for confirm action
---@field auto_confirm? boolean automatically confirm if there is only one item
---@field main? snacks.picker.main.Config main editor window config
---@field on_change? fun(picker:snacks.Picker, item?:snacks.picker.Item) called when the cursor changes
---@field on_show? fun(picker:snacks.Picker) called when the picker is shown
---@field on_close? fun(picker:snacks.Picker) called when the picker is closed
---@field jump? snacks.picker.jump.Config|{}
--- Other
---@field config? fun(opts:snacks.picker.Config):snacks.picker.Config? custom config function
---@field db? snacks.picker.db.Config|{}
---@field debug? snacks.picker.debug|{}
{
prompt = " ",
sources = {},
focus = "input",
layout = {
cycle = true,
--- Use the default layout or vertical if the window is too narrow
preset = function()
return vim.o.columns >= 120 and "default" or "vertical"
end,
},
---@class snacks.picker.matcher.Config
matcher = {
fuzzy = true, -- use fuzzy matching
smartcase = true, -- use smartcase
ignorecase = true, -- use ignorecase
sort_empty = false, -- sort results when the search string is empty
filename_bonus = true, -- give bonus for matching file names (last part of the path)
file_pos = true, -- support patterns like `file:line:col` and `file:line`
-- the bonusses below, possibly require string concatenation and path normalization,
-- so this can have a performance impact for large lists and increase memory usage
cwd_bonus = false, -- give bonus for matching files in the cwd
frecency = false, -- frecency bonus
history_bonus = false, -- give more weight to chronological order
},
sort = {
-- default sort is by score, text length and index
fields = { "score:desc", "#text", "idx" },
},
ui_select = true, -- replace `vim.ui.select` with the snacks picker
---@class snacks.picker.formatters.Config
formatters = {
text = {
ft = nil, ---@type string? filetype for highlighting
},
file = {
filename_first = false, -- display filename before the file path
truncate = 40, -- truncate the file path to (roughly) this length
filename_only = false, -- only show the filename
icon_width = 2, -- width of the icon (in characters)
git_status_hl = true, -- use the git status highlight group for the filename
},
selected = {
show_always = false, -- only show the selected column when there are multiple selections
unselected = true, -- use the unselected icon for unselected items
},
severity = {
icons = true, -- show severity icons
level = false, -- show severity level
---@type "left"|"right"
pos = "left", -- position of the diagnostics
},
},
---@class snacks.picker.previewers.Config
previewers = {
diff = {
builtin = true, -- use Neovim for previewing diffs (true) or use an external tool (false)
cmd = { "delta" }, -- example to show a diff with delta
},
git = {
builtin = true, -- use Neovim for previewing git output (true) or use git (false)
args = {}, -- additional arguments passed to the git command. Useful to set pager options usin `-c ...`
},
file = {
max_size = 1024 * 1024, -- 1MB
max_line_length = 500, -- max line length
ft = nil, ---@type string? filetype for highlighting. Use `nil` for auto detect
},
man_pager = nil, ---@type string? MANPAGER env to use for `man` preview
},
---@class snacks.picker.jump.Config
jump = {
jumplist = true, -- save the current position in the jumplist
tagstack = false, -- save the current position in the tagstack
reuse_win = false, -- reuse an existing window if the buffer is already open
close = true, -- close the picker when jumping/editing to a location (defaults to true)
match = false, -- jump to the first match position. (useful for `lines`)
},
toggles = {
follow = "f",
hidden = "h",
ignored = "i",
modified = "m",
regex = { icon = "R", value = false },
},
win = {
-- input window
input = {
keys = {
-- to close the picker on ESC instead of going to normal mode,
-- add the following keymap to your config
-- ["<Esc>"] = { "close", mode = { "n", "i" } },
["/"] = "toggle_focus",
["<C-Down>"] = { "history_forward", mode = { "i", "n" } },
["<C-Up>"] = { "history_back", mode = { "i", "n" } },
["<C-c>"] = { "cancel", mode = "i" },
["<C-w>"] = { "<c-s-w>", mode = { "i" }, expr = true, desc = "delete word" },
["<CR>"] = { "confirm", mode = { "n", "i" } },
["<Down>"] = { "list_down", mode = { "i", "n" } },
["<Esc>"] = "cancel",
["<S-CR>"] = { { "pick_win", "jump" }, mode = { "n", "i" } },
["<S-Tab>"] = { "select_and_prev", mode = { "i", "n" } },
["<Tab>"] = { "select_and_next", mode = { "i", "n" } },
["<Up>"] = { "list_up", mode = { "i", "n" } },
["<a-d>"] = { "inspect", mode = { "n", "i" } },
["<a-f>"] = { "toggle_follow", mode = { "i", "n" } },
["<a-h>"] = { "toggle_hidden", mode = { "i", "n" } },
["<a-i>"] = { "toggle_ignored", mode = { "i", "n" } },
["<a-m>"] = { "toggle_maximize", mode = { "i", "n" } },
["<a-p>"] = { "toggle_preview", mode = { "i", "n" } },
["<a-w>"] = { "cycle_win", mode = { "i", "n" } },
["<c-a>"] = { "select_all", mode = { "n", "i" } },
["<c-b>"] = { "preview_scroll_up", mode = { "i", "n" } },
["<c-d>"] = { "list_scroll_down", mode = { "i", "n" } },
["<c-f>"] = { "preview_scroll_down", mode = { "i", "n" } },
["<c-g>"] = { "toggle_live", mode = { "i", "n" } },
["<c-j>"] = { "list_down", mode = { "i", "n" } },
["<c-k>"] = { "list_up", mode = { "i", "n" } },
["<c-n>"] = { "list_down", mode = { "i", "n" } },
["<c-p>"] = { "list_up", mode = { "i", "n" } },
["<c-q>"] = { "qflist", mode = { "i", "n" } },
["<c-s>"] = { "edit_split", mode = { "i", "n" } },
["<c-t>"] = { "tab", mode = { "n", "i" } },
["<c-u>"] = { "list_scroll_up", mode = { "i", "n" } },
["<c-v>"] = { "edit_vsplit", mode = { "i", "n" } },
["<c-w>H"] = "layout_left",
["<c-w>J"] = "layout_bottom",
["<c-w>K"] = "layout_top",
["<c-w>L"] = "layout_right",
["?"] = "toggle_help_input",
["G"] = "list_bottom",
["gg"] = "list_top",
["j"] = "list_down",
["k"] = "list_up",
["q"] = "close",
},
b = {
minipairs_disable = true,
},
},
-- result list window
list = {
keys = {
["/"] = "toggle_focus",
["<2-LeftMouse>"] = "confirm",
["<CR>"] = "confirm",
["<Down>"] = "list_down",
["<Esc>"] = "cancel",
["<S-CR>"] = { { "pick_win", "jump" } },
["<S-Tab>"] = { "select_and_prev", mode = { "n", "x" } },
["<Tab>"] = { "select_and_next", mode = { "n", "x" } },
["<Up>"] = "list_up",
["<a-d>"] = "inspect",
["<a-f>"] = "toggle_follow",
["<a-h>"] = "toggle_hidden",
["<a-i>"] = "toggle_ignored",
["<a-m>"] = "toggle_maximize",
["<a-p>"] = "toggle_preview",
["<a-w>"] = "cycle_win",
["<c-a>"] = "select_all",
["<c-b>"] = "preview_scroll_up",
["<c-d>"] = "list_scroll_down",
["<c-f>"] = "preview_scroll_down",
["<c-j>"] = "list_down",
["<c-k>"] = "list_up",
["<c-n>"] = "list_down",
["<c-p>"] = "list_up",
["<c-q>"] = "qflist",
["<c-s>"] = "edit_split",
["<c-t>"] = "tab",
["<c-u>"] = "list_scroll_up",
["<c-v>"] = "edit_vsplit",
["<c-w>H"] = "layout_left",
["<c-w>J"] = "layout_bottom",
["<c-w>K"] = "layout_top",
["<c-w>L"] = "layout_right",
["?"] = "toggle_help_list",
["G"] = "list_bottom",
["gg"] = "list_top",
["i"] = "focus_input",
["j"] = "list_down",
["k"] = "list_up",
["q"] = "close",
["zb"] = "list_scroll_bottom",
["zt"] = "list_scroll_top",
["zz"] = "list_scroll_center",
},
wo = {
conceallevel = 2,
concealcursor = "nvc",
},
},
-- preview window
preview = {
keys = {
["<Esc>"] = "cancel",
["q"] = "close",
["i"] = "focus_input",
["<ScrollWheelDown>"] = "list_scroll_wheel_down",
["<ScrollWheelUp>"] = "list_scroll_wheel_up",
["<a-w>"] = "cycle_win",
},
},
},
---@class snacks.picker.icons
icons = {
files = {
enabled = true, -- show file icons
dir = "󰉋 ",
dir_open = "󰝰 ",
file = "󰈔 "
},
keymaps = {
nowait = "󰓅 "
},
tree = {
vertical = "│ ",
middle = "├╴",
last = "└╴",
},
undo = {
saved = " ",
},
ui = {
live = "󰐰 ",
hidden = "h",
ignored = "i",
follow = "f",
selected = "● ",
unselected = "○ ",
-- selected = " ",
},
git = {
enabled = true, -- show git icons
commit = "󰜘 ", -- used by git log
staged = "●", -- staged changes. always overrides the type icons
added = "",
deleted = "",
ignored = " ",
modified = "○",
renamed = "",
unmerged = " ",
untracked = "?",
},
diagnostics = {
Error = " ",
Warn = " ",
Hint = " ",
Info = " ",
},
lsp = {
unavailable = "",
enabled = " ",
disabled = " ",
attached = "󰖩 "
},
kinds = {
Array = " ",
Boolean = "󰨙 ",
Class = " ",
Color = " ",
Control = " ",
Collapsed = " ",
Constant = "󰏿 ",
Constructor = " ",
Copilot = " ",
Enum = " ",
EnumMember = " ",
Event = " ",
Field = " ",
File = " ",
Folder = " ",
Function = "󰊕 ",
Interface = " ",
Key = " ",
Keyword = " ",
Method = "󰊕 ",
Module = " ",
Namespace = "󰦮 ",
Null = " ",
Number = "󰎠 ",
Object = " ",
Operator = " ",
Package = " ",
Property = " ",
Reference = " ",
Snippet = "󱄽 ",
String = " ",
Struct = "󰆼 ",
Text = " ",
TypeParameter = " ",
Unit = " ",
Unknown = " ",
Value = " ",
Variable = "󰀫 ",
},
},
---@class snacks.picker.db.Config
db = {
-- path to the sqlite3 library
-- If not set, it will try to load the library by name.
-- On Windows it will download the library from the internet.
sqlite3_path = nil, ---@type string?
},
---@class snacks.picker.debug
debug = {
scores = false, -- show scores in the list
leaks = false, -- show when pickers don't get garbage collected
explorer = false, -- show explorer debug info
files = false, -- show file debug info
grep = false, -- show file debug info
proc = false, -- show proc debug info
extmarks = false, -- show extmarks errors
},
}
<
==============================================================================
5. Examples *snacks-picker-examples*
FLASH *snacks-picker-examples-flash*
>lua
{
"folke/flash.nvim",
optional = true,
specs = {
{
"folke/snacks.nvim",
opts = {
picker = {
win = {
input = {
keys = {
["<a-s>"] = { "flash", mode = { "n", "i" } },
["s"] = { "flash" },
},
},
},
actions = {
flash = function(picker)
require("flash").jump({
pattern = "^",
label = { after = { 0, 0 } },
search = {
mode = "search",
exclude = {
function(win)
return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "snacks_picker_list"
end,
},
},
action = function(match)
local idx = picker.list:row2idx(match.pos[1])
picker.list:_move(idx, true, true)
end,
})
end,
},
},
},
},
},
}
<
GENERAL *snacks-picker-examples-general*
>lua
{
"folke/snacks.nvim",
opts = {
picker = {},
explorer = {},
},
keys = {
-- Top Pickers & Explorer
{ "<leader><space>", function() Snacks.picker.smart() end, desc = "Smart Find Files" },
{ "<leader>,", function() Snacks.picker.buffers() end, desc = "Buffers" },
{ "<leader>/", function() Snacks.picker.grep() end, desc = "Grep" },
{ "<leader>:", function() Snacks.picker.command_history() end, desc = "Command History" },
{ "<leader>n", function() Snacks.picker.notifications() end, desc = "Notification History" },
{ "<leader>e", function() Snacks.explorer() end, desc = "File Explorer" },
-- find
{ "<leader>fb", function() Snacks.picker.buffers() end, desc = "Buffers" },
{ "<leader>fc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, desc = "Find Config File" },
{ "<leader>ff", function() Snacks.picker.files() end, desc = "Find Files" },
{ "<leader>fg", function() Snacks.picker.git_files() end, desc = "Find Git Files" },
{ "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" },
{ "<leader>fr", function() Snacks.picker.recent() end, desc = "Recent" },
-- git
{ "<leader>gb", function() Snacks.picker.git_branches() end, desc = "Git Branches" },
{ "<leader>gl", function() Snacks.picker.git_log() end, desc = "Git Log" },
{ "<leader>gL", function() Snacks.picker.git_log_line() end, desc = "Git Log Line" },
{ "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git Status" },
{ "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" },
{ "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (Hunks)" },
{ "<leader>gf", function() Snacks.picker.git_log_file() end, desc = "Git Log File" },
-- Grep
{ "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" },
{ "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" },
{ "<leader>sg", function() Snacks.picker.grep() end, desc = "Grep" },
{ "<leader>sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" } },
-- search
{ '<leader>s"', function() Snacks.picker.registers() end, desc = "Registers" },
{ '<leader>s/', function() Snacks.picker.search_history() end, desc = "Search History" },
{ "<leader>sa", function() Snacks.picker.autocmds() end, desc = "Autocmds" },
{ "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" },
{ "<leader>sc", function() Snacks.picker.command_history() end, desc = "Command History" },
{ "<leader>sC", function() Snacks.picker.commands() end, desc = "Commands" },
{ "<leader>sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" },
{ "<leader>sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics" },
{ "<leader>sh", function() Snacks.picker.help() end, desc = "Help Pages" },
{ "<leader>sH", function() Snacks.picker.highlights() end, desc = "Highlights" },
{ "<leader>si", function() Snacks.picker.icons() end, desc = "Icons" },
{ "<leader>sj", function() Snacks.picker.jumps() end, desc = "Jumps" },
{ "<leader>sk", function() Snacks.picker.keymaps() end, desc = "Keymaps" },
{ "<leader>sl", function() Snacks.picker.loclist() end, desc = "Location List" },
{ "<leader>sm", function() Snacks.picker.marks() end, desc = "Marks" },
{ "<leader>sM", function() Snacks.picker.man() end, desc = "Man Pages" },
{ "<leader>sp", function() Snacks.picker.lazy() end, desc = "Search for Plugin Spec" },
{ "<leader>sq", function() Snacks.picker.qflist() end, desc = "Quickfix List" },
{ "<leader>sR", function() Snacks.picker.resume() end, desc = "Resume" },
{ "<leader>su", function() Snacks.picker.undo() end, desc = "Undo History" },
{ "<leader>uC", function() Snacks.picker.colorschemes() end, desc = "Colorschemes" },
-- LSP
{ "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition" },
{ "gD", function() Snacks.picker.lsp_declarations() end, desc = "Goto Declaration" },
{ "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" },
{ "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" },
{ "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" },
{ "<leader>ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols" },
{ "<leader>sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols" },
},
}
<
TODO_COMMENTS *snacks-picker-examples-todo_comments*
>lua
{
"folke/todo-comments.nvim",
optional = true,
keys = {
{ "<leader>st", function() Snacks.picker.todo_comments() end, desc = "Todo" },
{ "<leader>sT", function () Snacks.picker.todo_comments({ keywords = { "TODO", "FIX", "FIXME" } }) end, desc = "Todo/Fix/Fixme" },
},
}
<
TROUBLE *snacks-picker-examples-trouble*
>lua
{
"folke/trouble.nvim",
optional = true,
specs = {
"folke/snacks.nvim",
opts = function(_, opts)
return vim.tbl_deep_extend("force", opts or {}, {
picker = {
actions = require("trouble.sources.snacks").actions,
win = {
input = {
keys = {
["<c-t>"] = {
"trouble_open",
mode = { "n", "i" },
},
},
},
},
},
})
end,
},
}
<
==============================================================================
6. Types *snacks-picker-types*
>lua
---@class snacks.picker.jump.Action: snacks.picker.Action
---@field cmd? snacks.picker.EditCmd
<
>lua
---@class snacks.picker.layout.Action: snacks.picker.Action
---@field layout? snacks.picker.layout.Config|string
<
>lua
---@class snacks.picker.yank.Action: snacks.picker.Action
---@field reg? string
---@field field? string
---@field notify? boolean
<
>lua
---@alias snacks.picker.Extmark vim.api.keyset.set_extmark|{col:number, row?:number, field?:string}
---@alias snacks.picker.Text {[1]:string, [2]:string?, virtual?:boolean, field?:string}
---@alias snacks.picker.Highlight snacks.picker.Text|snacks.picker.Extmark
---@alias snacks.picker.format fun(item:snacks.picker.Item, picker:snacks.Picker):snacks.picker.Highlight[]
---@alias snacks.picker.preview fun(ctx: snacks.picker.preview.ctx):boolean?
---@alias snacks.picker.sort fun(a:snacks.picker.Item, b:snacks.picker.Item):boolean
---@alias snacks.picker.transform fun(item:snacks.picker.finder.Item, ctx:snacks.picker.finder.ctx):(boolean|snacks.picker.finder.Item|nil)
---@alias snacks.picker.Pos {[1]:number, [2]:number}
---@alias snacks.picker.toggle {icon?:string, enabled?:boolean, value?:boolean}
<
Generic filter used by finders to pre-filter items
>lua
---@class snacks.picker.filter.Config
---@field cwd? boolean|string only show files for the given cwd
---@field buf? boolean|number only show items for the current or given buffer
---@field paths? table<string, boolean> only show items that include or exclude the given paths
---@field filter? fun(item:snacks.picker.finder.Item, filter:snacks.picker.Filter):boolean? custom filter function
---@field transform? fun(picker:snacks.Picker, filter:snacks.picker.Filter):boolean? filter transform. Return `true` to force refresh
<
This is only used when using `opts.preview = "preview"`. Its a previewer
that shows a preview based on the item data.
>lua
---@class snacks.picker.Item.preview
---@field text string text to show in the preview buffer
---@field ft? string optional filetype used tohighlight the preview buffer
---@field extmarks? snacks.picker.Extmark[] additional extmarks
---@field loc? boolean set to false to disable showing the item location in the preview
<
>lua
---@class snacks.picker.Item
---@field [string] any
---@field idx number
---@field score number
---@field frecency? number
---@field score_add? number
---@field score_mul? number
---@field source_id? number
---@field file? string
---@field text string
---@field pos? snacks.picker.Pos
---@field loc? snacks.picker.lsp.Loc
---@field end_pos? snacks.picker.Pos
---@field highlights? snacks.picker.Highlight[][]
---@field preview? snacks.picker.Item.preview
---@field resolve? fun(item:snacks.picker.Item)
<
>lua
---@class snacks.picker.finder.Item: snacks.picker.Item
---@field idx? number
---@field score? number
<
>lua
---@class snacks.picker.layout.Config
---@field layout snacks.layout.Box
---@field reverse? boolean when true, the list will be reversed (bottom-up)
---@field fullscreen? boolean open in fullscreen
---@field cycle? boolean cycle through the list
---@field preview? "main" show preview window in the picker or the main window
---@field preset? string|fun(source:string):string
---@field hidden? ("input"|"preview"|"list")[] don't show the given windows when opening the picker. (only "input" and "preview" make sense)
---@field auto_hide? ("input"|"preview"|"list")[] hide the given windows when not focused (only "input" makes real sense)
<
>lua
---@class snacks.picker.win.Config
---@field input? snacks.win.Config|{} input window config
---@field list? snacks.win.Config|{} result list window config
---@field preview? snacks.win.Config|{} preview window config
<
>lua
---@alias snacks.Picker.ref (fun():snacks.Picker?)|{value?: snacks.Picker}
<
>lua
---@class snacks.picker.Last
---@field cursor number
---@field topline number
---@field opts? snacks.picker.Config
---@field selected snacks.picker.Item[]
---@field filter snacks.picker.Filter
<
>lua
---@alias snacks.picker.history.Record {pattern: string, search: string, live?: boolean}
<
==============================================================================
7. Module *snacks-picker-module*
>lua
---@class snacks.picker
---@field actions snacks.picker.actions
---@field config snacks.picker.config
---@field format snacks.picker.formatters
---@field preview snacks.picker.previewers
---@field sort snacks.picker.sorters
---@field util snacks.picker.util
---@field current? snacks.Picker
---@field highlight snacks.picker.highlight
---@field resume fun(opts?: snacks.picker.Config):snacks.Picker
---@field sources snacks.picker.sources.Config
Snacks.picker = {}
<
`Snacks.picker()` *Snacks.picker()*
>lua
---@type fun(source: string, opts: snacks.picker.Config): snacks.Picker
Snacks.picker()
<
>lua
---@type fun(opts: snacks.picker.Config): snacks.Picker
Snacks.picker()
<
`Snacks.picker.get()` *Snacks.picker.get()*
Get active pickers, optionally filtered by source, or the current tab
>lua
---@param opts? {source?: string, tab?: boolean} tab defaults to true
Snacks.picker.get(opts)
<
`Snacks.picker.pick()` *Snacks.picker.pick()*
Create a new picker
>lua
---@param source? string
---@param opts? snacks.picker.Config
---@overload fun(opts: snacks.picker.Config): snacks.Picker
Snacks.picker.pick(source, opts)
<
`Snacks.picker.select()` *Snacks.picker.select()*
Implementation for `vim.ui.select`
>lua
---@type snacks.picker.ui_select
Snacks.picker.select(...)
<
==============================================================================
8. Sources *snacks-picker-sources*
AUTOCMDS *snacks-picker-sources-autocmds*
>vim
:lua Snacks.picker.autocmds(opts?)
<
>lua
{
finder = "vim_autocmds",
format = "autocmd",
preview = "preview",
}
<
BUFFERS *snacks-picker-sources-buffers*
>vim
:lua Snacks.picker.buffers(opts?)
<
>lua
---@class snacks.picker.buffers.Config: snacks.picker.Config
---@field hidden? boolean show hidden buffers (unlisted)
---@field unloaded? boolean show loaded buffers
---@field current? boolean show current buffer
---@field nofile? boolean show `buftype=nofile` buffers
---@field modified? boolean show only modified buffers
---@field sort_lastused? boolean sort by last used
---@field filter? snacks.picker.filter.Config
{
finder = "buffers",
format = "buffer",
hidden = false,
unloaded = true,
current = true,
sort_lastused = true,
win = {
input = {
keys = {
["<c-x>"] = { "bufdelete", mode = { "n", "i" } },
},
},
list = { keys = { ["dd"] = "bufdelete" } },
},
}
<
CLIPHIST *snacks-picker-sources-cliphist*
>vim
:lua Snacks.picker.cliphist(opts?)
<
>lua
{
finder = "system_cliphist",
format = "text",
preview = "preview",
confirm = { "copy", "close" },
}
<
COLORSCHEMES *snacks-picker-sources-colorschemes*
>vim
:lua Snacks.picker.colorschemes(opts?)
<
Neovim colorschemes with live preview
>lua
{
finder = "vim_colorschemes",
format = "text",
preview = "colorscheme",
preset = "vertical",
confirm = function(picker, item)
picker:close()
if item then
picker.preview.state.colorscheme = nil
vim.schedule(function()
vim.cmd("colorscheme " .. item.text)
end)
end
end,
}
<
COMMAND_HISTORY *snacks-picker-sources-command_history*
>vim
:lua Snacks.picker.command_history(opts?)
<
Neovim command history
>lua
---@type snacks.picker.history.Config
{
finder = "vim_history",
name = "cmd",
format = "text",
preview = "none",
layout = {
preset = "vscode",
},
confirm = "cmd",
formatters = { text = { ft = "vim" } },
}
<
COMMANDS *snacks-picker-sources-commands*
>vim
:lua Snacks.picker.commands(opts?)
<
Neovim commands
>lua
{
finder = "vim_commands",
format = "command",
preview = "preview",
confirm = "cmd",
}
<
DIAGNOSTICS *snacks-picker-sources-diagnostics*
>vim
:lua Snacks.picker.diagnostics(opts?)
<
>lua
---@class snacks.picker.diagnostics.Config: snacks.picker.Config
---@field filter? snacks.picker.filter.Config
---@field severity? vim.diagnostic.SeverityFilter
{
finder = "diagnostics",
format = "diagnostic",
sort = {
fields = {
"is_current",
"is_cwd",
"severity",
"file",
"lnum",
},
},
matcher = { sort_empty = true },
-- only show diagnostics from the cwd by default
filter = { cwd = true },
}
<
DIAGNOSTICS_BUFFER *snacks-picker-sources-diagnostics_buffer*
>vim
:lua Snacks.picker.diagnostics_buffer(opts?)
<
>lua
---@type snacks.picker.diagnostics.Config
{
finder = "diagnostics",
format = "diagnostic",
sort = {
fields = { "severity", "file", "lnum" },
},
matcher = { sort_empty = true },
filter = { buf = true },
}
<
EXPLORER *snacks-picker-sources-explorer*
>vim
:lua Snacks.picker.explorer(opts?)
<
>lua
---@class snacks.picker.explorer.Config: snacks.picker.files.Config|{}
---@field follow_file? boolean follow the file from the current buffer
---@field tree? boolean show the file tree (default: true)
---@field git_status? boolean show git status (default: true)
---@field git_status_open? boolean show recursive git status for open directories
---@field git_untracked? boolean needed to show untracked git status
---@field diagnostics? boolean show diagnostics
---@field diagnostics_open? boolean show recursive diagnostics for open directories
---@field watch? boolean watch for file changes
---@field exclude? string[] exclude glob patterns
---@field include? string[] include glob patterns. These take precedence over `exclude`, `ignored` and `hidden`
{
finder = "explorer",
sort = { fields = { "sort" } },
supports_live = true,
tree = true,
watch = true,
diagnostics = true,
diagnostics_open = false,
git_status = true,
git_status_open = false,
git_untracked = true,
follow_file = true,
focus = "list",
auto_close = false,
jump = { close = false },
layout = { preset = "sidebar", preview = false },
-- to show the explorer to the right, add the below to
-- your config under `opts.picker.sources.explorer`
-- layout = { layout = { position = "right" } },
formatters = {
file = { filename_only = true },
severity = { pos = "right" },
},
matcher = { sort_empty = false, fuzzy = false },
config = function(opts)
return require("snacks.picker.source.explorer").setup(opts)
end,
win = {
list = {
keys = {
["<BS>"] = "explorer_up",
["l"] = "confirm",
["h"] = "explorer_close", -- close directory
["a"] = "explorer_add",
["d"] = "explorer_del",
["r"] = "explorer_rename",
["c"] = "explorer_copy",
["m"] = "explorer_move",
["o"] = "explorer_open", -- open with system application
["P"] = "toggle_preview",
["y"] = { "explorer_yank", mode = { "n", "x" } },
["p"] = "explorer_paste",
["u"] = "explorer_update",
["<c-c>"] = "tcd",
["<leader>/"] = "picker_grep",
["<c-t>"] = "terminal",
["."] = "explorer_focus",
["I"] = "toggle_ignored",
["H"] = "toggle_hidden",
["Z"] = "explorer_close_all",
["]g"] = "explorer_git_next",
["[g"] = "explorer_git_prev",
["]d"] = "explorer_diagnostic_next",
["[d"] = "explorer_diagnostic_prev",
["]w"] = "explorer_warn_next",
["[w"] = "explorer_warn_prev",
["]e"] = "explorer_error_next",
["[e"] = "explorer_error_prev",
},
},
},
}
<
FILES *snacks-picker-sources-files*
>vim
:lua Snacks.picker.files(opts?)
<
>lua
---@class snacks.picker.files.Config: snacks.picker.proc.Config
---@field cmd? "fd"| "rg"| "find" command to use. Leave empty to auto-detect
---@field hidden? boolean show hidden files
---@field ignored? boolean show ignored files
---@field dirs? string[] directories to search
---@field follow? boolean follow symlinks
---@field exclude? string[] exclude patterns
---@field args? string[] additional arguments
---@field ft? string|string[] file extension(s)
---@field rtp? boolean search in runtimepath
{
finder = "files",
format = "file",
show_empty = true,
hidden = false,
ignored = false,
follow = false,
supports_live = true,
}
<
GIT_BRANCHES *snacks-picker-sources-git_branches*
>vim
:lua Snacks.picker.git_branches(opts?)
<
>lua
---@type snacks.picker.git.Config
{
finder = "git_branches",
format = "git_branch",
preview = "git_log",
confirm = "git_checkout",
win = {
input = {
keys = {
["<c-a>"] = { "git_branch_add", mode = { "n", "i" } },
["<c-x>"] = { "git_branch_del", mode = { "n", "i" } },
},
},
},
---@param picker snacks.Picker
on_show = function(picker)
for i, item in ipairs(picker:items()) do
if item.current then
picker.list:view(i)
Snacks.picker.actions.list_scroll_center(picker)
break
end
end
end,
}
<
GIT_DIFF *snacks-picker-sources-git_diff*
>vim
:lua Snacks.picker.git_diff(opts?)
<
>lua
---@type snacks.picker.git.Config
{
finder = "git_diff",
format = "file",
preview = "diff",
}
<
GIT_FILES *snacks-picker-sources-git_files*
>vim
:lua Snacks.picker.git_files(opts?)
<
Find git files
>lua
---@class snacks.picker.git.files.Config: snacks.picker.git.Config
---@field untracked? boolean show untracked files
---@field submodules? boolean show submodule files
{
finder = "git_files",
show_empty = true,
format = "file",
untracked = false,
submodules = false,
}
<
GIT_GREP *snacks-picker-sources-git_grep*
>vim
:lua Snacks.picker.git_grep(opts?)
<
Grep in git files
>lua
---@class snacks.picker.git.grep.Config: snacks.picker.git.Config
---@field untracked? boolean search in untracked files
---@field submodules? boolean search in submodule files
---@field need_search? boolean require a search pattern
{
finder = "git_grep",
format = "file",
untracked = false,
need_search = true,
submodules = false,
show_empty = true,
supports_live = true,
live = true,
}
<
GIT_LOG *snacks-picker-sources-git_log*
>vim
:lua Snacks.picker.git_log(opts?)
<
Git log
>lua
---@class snacks.picker.git.log.Config: snacks.picker.git.Config
---@field follow? boolean track file history across renames
---@field current_file? boolean show current file log
---@field current_line? boolean show current line log
---@field author? string filter commits by author
{
finder = "git_log",
format = "git_log",
preview = "git_show",
confirm = "git_checkout",
sort = { fields = { "score:desc", "idx" } },
}
<
GIT_LOG_FILE *snacks-picker-sources-git_log_file*
>vim
:lua Snacks.picker.git_log_file(opts?)
<
>lua
---@type snacks.picker.git.log.Config
{
finder = "git_log",
format = "git_log",
preview = "git_show",
current_file = true,
follow = true,
confirm = "git_checkout",
sort = { fields = { "score:desc", "idx" } },
}
<
GIT_LOG_LINE *snacks-picker-sources-git_log_line*
>vim
:lua Snacks.picker.git_log_line(opts?)
<
>lua
---@type snacks.picker.git.log.Config
{
finder = "git_log",
format = "git_log",
preview = "git_show",
current_line = true,
follow = true,
confirm = "git_checkout",
sort = { fields = { "score:desc", "idx" } },
}
<
GIT_STASH *snacks-picker-sources-git_stash*
>vim
:lua Snacks.picker.git_stash(opts?)
<
>lua
{
finder = "git_stash",
format = "git_stash",
preview = "git_stash",
confirm = "git_stash_apply",
}
<
GIT_STATUS *snacks-picker-sources-git_status*
>vim
:lua Snacks.picker.git_status(opts?)
<
>lua
---@class snacks.picker.git.status.Config: snacks.picker.git.Config
---@field ignored? boolean show ignored files
{
finder = "git_status",
format = "git_status",
preview = "git_status",
win = {
input = {
keys = {
["<Tab>"] = { "git_stage", mode = { "n", "i" } },
},
},
},
}
<
GREP *snacks-picker-sources-grep*
>vim
:lua Snacks.picker.grep(opts?)
<
>lua
---@class snacks.picker.grep.Config: snacks.picker.proc.Config
---@field cmd? string
---@field hidden? boolean show hidden files
---@field ignored? boolean show ignored files
---@field dirs? string[] directories to search
---@field follow? boolean follow symlinks
---@field glob? string|string[] glob file pattern(s)
---@field ft? string|string[] ripgrep file type(s). See `rg --type-list`
---@field regex? boolean use regex search pattern (defaults to `true`)
---@field buffers? boolean search in open buffers
---@field need_search? boolean require a search pattern
---@field exclude? string[] exclude patterns
---@field args? string[] additional arguments
---@field rtp? boolean search in runtimepath
{
finder = "grep",
regex = true,
format = "file",
show_empty = true,
live = true, -- live grep by default
supports_live = true,
}
<
GREP_BUFFERS *snacks-picker-sources-grep_buffers*
>vim
:lua Snacks.picker.grep_buffers(opts?)
<
>lua
---@type snacks.picker.grep.Config|{}
{
finder = "grep",
format = "file",
live = true,
buffers = true,
need_search = false,
supports_live = true,
}
<
GREP_WORD *snacks-picker-sources-grep_word*
>vim
:lua Snacks.picker.grep_word(opts?)
<
>lua
---@type snacks.picker.grep.Config|{}
{
finder = "grep",
format = "file",
search = function(picker)
return picker:word()
end,
live = false,
supports_live = true,
}
<
HELP *snacks-picker-sources-help*
>vim
:lua Snacks.picker.help(opts?)
<
Neovim help tags
>lua
---@class snacks.picker.help.Config: snacks.picker.Config
---@field lang? string[] defaults to `vim.opt.helplang`
{
finder = "help",
format = "text",
previewers = {
file = { ft = "help" },
},
win = { preview = { minimal = true } },
confirm = "help",
}
<
HIGHLIGHTS *snacks-picker-sources-highlights*
>vim
:lua Snacks.picker.highlights(opts?)
<
>lua
{
finder = "vim_highlights",
format = "hl",
preview = "preview",
confirm = "close",
}
<
ICONS *snacks-picker-sources-icons*
>vim
:lua Snacks.picker.icons(opts?)
<
>lua
---@class snacks.picker.icons.Config: snacks.picker.Config
---@field icon_sources? string[]
{
icon_sources = { "nerd_fonts", "emoji" },
finder = "icons",
format = "icon",
layout = { preset = "vscode" },
confirm = "put",
}
<
JUMPS *snacks-picker-sources-jumps*
>vim
:lua Snacks.picker.jumps(opts?)
<
>lua
{
finder = "vim_jumps",
format = "file",
}
<
KEYMAPS *snacks-picker-sources-keymaps*
>vim
:lua Snacks.picker.keymaps(opts?)
<
>lua
---@class snacks.picker.keymaps.Config: snacks.picker.Config
---@field global? boolean show global keymaps
---@field local? boolean show buffer keymaps
---@field plugs? boolean show plugin keymaps
---@field modes? string[]
{
finder = "vim_keymaps",
format = "keymap",
preview = "preview",
global = true,
plugs = false,
["local"] = true,
modes = { "n", "v", "x", "s", "o", "i", "c", "t" },
---@param picker snacks.Picker
confirm = function(picker, item)
picker:norm(function()
if item then
picker:close()
vim.api.nvim_input(item.item.lhs)
end
end)
end,
actions = {
toggle_global = function(picker)
picker.opts.global = not picker.opts.global
picker:find()
end,
toggle_buffer = function(picker)
picker.opts["local"] = not picker.opts["local"]
picker:find()
end,
},
win = {
input = {
keys = {
["<a-g>"] = { "toggle_global", mode = { "n", "i" }, desc = "Toggle Global Keymaps" },
["<a-b>"] = { "toggle_buffer", mode = { "n", "i" }, desc = "Toggle Buffer Keymaps" },
},
},
},
}
<
LAZY *snacks-picker-sources-lazy*
>vim
:lua Snacks.picker.lazy(opts?)
<
Search for a lazy.nvim plugin spec
>lua
{
finder = "lazy_spec",
pattern = "'",
}
<
LINES *snacks-picker-sources-lines*
>vim
:lua Snacks.picker.lines(opts?)
<
Search lines in the current buffer
>lua
---@class snacks.picker.lines.Config: snacks.picker.Config
---@field buf? number
{
finder = "lines",
format = "lines",
layout = {
preview = "main",
preset = "ivy",
},
jump = { match = true },
-- allow any window to be used as the main window
main = { current = true },
---@param picker snacks.Picker
on_show = function(picker)
local cursor = vim.api.nvim_win_get_cursor(picker.main)
local info = vim.api.nvim_win_call(picker.main, vim.fn.winsaveview)
picker.list:view(cursor[1], info.topline)
picker:show_preview()
end,
sort = { fields = { "score:desc", "idx" } },
}
<
LOCLIST *snacks-picker-sources-loclist*
>vim
:lua Snacks.picker.loclist(opts?)
<
Loclist
>lua
---@type snacks.picker.qf.Config
{
finder = "qf",
format = "file",
qf_win = 0,
}
<
LSP_CONFIG *snacks-picker-sources-lsp_config*
>vim
:lua Snacks.picker.lsp_config(opts?)
<
>lua
---@class snacks.picker.lsp.config.Config: snacks.picker.Config
---@field installed? boolean only show installed servers
---@field configured? boolean only show configured servers (setup with lspconfig)
---@field attached? boolean|number only show attached servers. When `number`, show only servers attached to that buffer (can be 0)
{
finder = "lsp.config#find",
format = "lsp.config#format",
preview = "lsp.config#preview",
confirm = "close",
sort = { fields = { "score:desc", "attached_buf", "attached", "enabled", "installed", "name" } },
matcher = { sort_empty = true },
}
<
LSP_DECLARATIONS *snacks-picker-sources-lsp_declarations*
>vim
:lua Snacks.picker.lsp_declarations(opts?)
<
LSP declarations
>lua
---@type snacks.picker.lsp.Config
{
finder = "lsp_declarations",
format = "file",
include_current = false,
auto_confirm = true,
jump = { tagstack = true, reuse_win = true },
}
<
LSP_DEFINITIONS *snacks-picker-sources-lsp_definitions*
>vim
:lua Snacks.picker.lsp_definitions(opts?)
<
LSP definitions
>lua
---@type snacks.picker.lsp.Config
{
finder = "lsp_definitions",
format = "file",
include_current = false,
auto_confirm = true,
jump = { tagstack = true, reuse_win = true },
}
<
LSP_IMPLEMENTATIONS *snacks-picker-sources-lsp_implementations*
>vim
:lua Snacks.picker.lsp_implementations(opts?)
<
LSP implementations
>lua
---@type snacks.picker.lsp.Config
{
finder = "lsp_implementations",
format = "file",
include_current = false,
auto_confirm = true,
jump = { tagstack = true, reuse_win = true },
}
<
LSP_REFERENCES *snacks-picker-sources-lsp_references*
>vim
:lua Snacks.picker.lsp_references(opts?)
<
LSP references
>lua
---@class snacks.picker.lsp.references.Config: snacks.picker.lsp.Config
---@field include_declaration? boolean default true
{
finder = "lsp_references",
format = "file",
include_declaration = true,
include_current = false,
auto_confirm = true,
jump = { tagstack = true, reuse_win = true },
}
<
LSP_SYMBOLS *snacks-picker-sources-lsp_symbols*
>vim
:lua Snacks.picker.lsp_symbols(opts?)
<
LSP document symbols
>lua
---@class snacks.picker.lsp.symbols.Config: snacks.picker.Config
---@field tree? boolean show symbol tree
---@field filter table<string, string[]|boolean>? symbol kind filter
---@field workspace? boolean show workspace symbols
{
finder = "lsp_symbols",
format = "lsp_symbol",
tree = true,
filter = {
default = {
"Class",
"Constructor",
"Enum",
"Field",
"Function",
"Interface",
"Method",
"Module",
"Namespace",
"Package",
"Property",
"Struct",
"Trait",
},
-- set to `true` to include all symbols
markdown = true,
help = true,
-- you can specify a different filter for each filetype
lua = {
"Class",
"Constructor",
"Enum",
"Field",
"Function",
"Interface",
"Method",
"Module",
"Namespace",
-- "Package", -- remove package since luals uses it for control flow structures
"Property",
"Struct",
"Trait",
},
},
}
<
LSP_TYPE_DEFINITIONS *snacks-picker-sources-lsp_type_definitions*
>vim
:lua Snacks.picker.lsp_type_definitions(opts?)
<
LSP type definitions
>lua
---@type snacks.picker.lsp.Config
{
finder = "lsp_type_definitions",
format = "file",
include_current = false,
auto_confirm = true,
jump = { tagstack = true, reuse_win = true },
}
<
LSP_WORKSPACE_SYMBOLS *snacks-picker-sources-lsp_workspace_symbols*
>vim
:lua Snacks.picker.lsp_workspace_symbols(opts?)
<
>lua
---@type snacks.picker.lsp.symbols.Config
vim.tbl_extend("force", {}, M.lsp_symbols, {
workspace = true,
tree = false,
supports_live = true,
live = true, -- live by default
})
<
MAN *snacks-picker-sources-man*
>vim
:lua Snacks.picker.man(opts?)
<
>lua
{
finder = "system_man",
format = "man",
preview = "man",
confirm = function(picker, item)
picker:close()
if item then
vim.schedule(function()
vim.cmd("Man " .. item.ref)
end)
end
end,
}
<
MARKS *snacks-picker-sources-marks*
>vim
:lua Snacks.picker.marks(opts?)
<
>lua
---@class snacks.picker.marks.Config: snacks.picker.Config
---@field global? boolean show global marks
---@field local? boolean show buffer marks
{
finder = "vim_marks",
format = "file",
global = true,
["local"] = true,
}
<
NOTIFICATIONS *snacks-picker-sources-notifications*
>vim
:lua Snacks.picker.notifications(opts?)
<
>lua
---@class snacks.picker.notifications.Config: snacks.picker.Config
---@field filter? snacks.notifier.level|fun(notif: snacks.notifier.Notif): boolean
{
finder = "snacks_notifier",
format = "notification",
preview = "preview",
formatters = { severity = { level = true } },
confirm = "close",
}
<
PICKER_ACTIONS *snacks-picker-sources-picker_actions*
>vim
:lua Snacks.picker.picker_actions(opts?)
<
>lua
{
finder = "meta_actions",
format = "text",
}
<
PICKER_FORMAT *snacks-picker-sources-picker_format*
>vim
:lua Snacks.picker.picker_format(opts?)
<
>lua
{
finder = "meta_format",
format = "text",
}
<
PICKER_LAYOUTS *snacks-picker-sources-picker_layouts*
>vim
:lua Snacks.picker.picker_layouts(opts?)
<
>lua
{
finder = "meta_layouts",
format = "text",
on_change = function(picker, item)
vim.schedule(function()
picker:set_layout(item.text)
end)
end,
}
<
PICKER_PREVIEW *snacks-picker-sources-picker_preview*
>vim
:lua Snacks.picker.picker_preview(opts?)
<
>lua
{
finder = "meta_preview",
format = "text",
}
<
PICKERS *snacks-picker-sources-pickers*
>vim
:lua Snacks.picker.pickers(opts?)
<
List all available sources
>lua
{
finder = "meta_pickers",
format = "text",
confirm = function(picker, item)
picker:close()
if item then
vim.schedule(function()
Snacks.picker(item.text)
end)
end
end,
}
<
PROJECTS *snacks-picker-sources-projects*
>vim
:lua Snacks.picker.projects(opts?)
<
Open recent projects
>lua
---@class snacks.picker.projects.Config: snacks.picker.Config
---@field filter? snacks.picker.filter.Config
---@field dev? string|string[] top-level directories containing multiple projects (sub-folders that contains a root pattern)
---@field projects? string[] list of project directories
---@field patterns? string[] patterns to detect project root directories
---@field recent? boolean include project directories of recent files
{
finder = "recent_projects",
format = "file",
dev = { "~/dev", "~/projects" },
confirm = "load_session",
patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "package.json", "Makefile" },
recent = true,
matcher = {
frecency = true, -- use frecency boosting
sort_empty = true, -- sort even when the filter is empty
cwd_bonus = false,
},
sort = { fields = { "score:desc", "idx" } },
win = {
preview = { minimal = true },
input = {
keys = {
-- every action will always first change the cwd of the current tabpage to the project
["<c-e>"] = { { "tcd", "picker_explorer" }, mode = { "n", "i" } },
["<c-f>"] = { { "tcd", "picker_files" }, mode = { "n", "i" } },
["<c-g>"] = { { "tcd", "picker_grep" }, mode = { "n", "i" } },
["<c-r>"] = { { "tcd", "picker_recent" }, mode = { "n", "i" } },
["<c-w>"] = { { "tcd" }, mode = { "n", "i" } },
["<c-t>"] = {
function(picker)
vim.cmd("tabnew")
Snacks.notify("New tab opened")
picker:close()
Snacks.picker.projects()
end,
mode = { "n", "i" },
},
},
},
},
}
<
QFLIST *snacks-picker-sources-qflist*
>vim
:lua Snacks.picker.qflist(opts?)
<
Quickfix list
>lua
---@type snacks.picker.qf.Config
{
finder = "qf",
format = "file",
}
<
RECENT *snacks-picker-sources-recent*
>vim
:lua Snacks.picker.recent(opts?)
<
Find recent files
>lua
---@class snacks.picker.recent.Config: snacks.picker.Config
---@field filter? snacks.picker.filter.Config
{
finder = "recent_files",
format = "file",
filter = {
paths = {
[vim.fn.stdpath("data")] = false,
[vim.fn.stdpath("cache")] = false,
[vim.fn.stdpath("state")] = false,
},
},
}
<
REGISTERS *snacks-picker-sources-registers*
>vim
:lua Snacks.picker.registers(opts?)
<
Neovim registers
>lua
{
finder = "vim_registers",
format = "register",
preview = "preview",
confirm = { "copy", "close" },
}
<
RESUME *snacks-picker-sources-resume*
>vim
:lua Snacks.picker.resume(opts?)
<
Special picker that resumes the last picker
>lua
{}
<
SEARCH_HISTORY *snacks-picker-sources-search_history*
>vim
:lua Snacks.picker.search_history(opts?)
<
Neovim search history
>lua
---@type snacks.picker.history.Config
{
finder = "vim_history",
name = "search",
format = "text",
preview = "none",
layout = { preset = "vscode" },
confirm = "search",
formatters = { text = { ft = "regex" } },
}
<
SELECT *snacks-picker-sources-select*
>vim
:lua Snacks.picker.select(opts?)
<
Config used by `vim.ui.select`. Not meant to be used directly.
>lua
{
items = {}, -- these are set dynamically
main = { current = true },
layout = { preset = "select" },
}
<
SMART *snacks-picker-sources-smart*
>vim
:lua Snacks.picker.smart(opts?)
<
>lua
---@class snacks.picker.smart.Config: snacks.picker.Config
---@field finders? string[] list of finders to use
---@field filter? snacks.picker.filter.Config
{
multi = { "buffers", "recent", "files" },
format = "file", -- use `file` format for all sources
matcher = {
cwd_bonus = true, -- boost cwd matches
frecency = true, -- use frecency boosting
sort_empty = true, -- sort even when the filter is empty
},
transform = "unique_file",
}
<
SPELLING *snacks-picker-sources-spelling*
>vim
:lua Snacks.picker.spelling(opts?)
<
>lua
{
finder = "vim_spelling",
format = "text",
layout = { preset = "vscode" },
confirm = "item_action",
}
<
TREESITTER *snacks-picker-sources-treesitter*
>vim
:lua Snacks.picker.treesitter(opts?)
<
>lua
---@class snacks.picker.treesitter.Config: snacks.picker.Config
---@field filter table<string, string[]|boolean>? symbol kind filter
---@field tree? boolean show symbol tree
{
finder = "treesitter_symbols",
format = "lsp_symbol",
tree = true,
filter = {
default = {
"Class",
"Enum",
"Field",
"Function",
"Method",
"Module",
"Namespace",
"Struct",
"Trait",
},
-- set to `true` to include all symbols
markdown = true,
help = true,
},
}
<
UNDO *snacks-picker-sources-undo*
>vim
:lua Snacks.picker.undo(opts?)
<
>lua
---@class snacks.picker.undo.Config: snacks.picker.Config
---@field diff? vim.diff.Opts
{
finder = "vim_undo",
format = "undo",
preview = "diff",
confirm = "item_action",
win = {
preview = { wo = { number = false, relativenumber = false, signcolumn = "no" } },
input = {
keys = {
["<c-y>"] = { "yank_add", mode = { "n", "i" } },
["<c-s-y>"] = { "yank_del", mode = { "n", "i" } },
},
},
},
actions = {
yank_add = { action = "yank", field = "added_lines" },
yank_del = { action = "yank", field = "removed_lines" },
},
icons = { tree = { last = "┌╴" } }, -- the tree is upside down
diff = {
ctxlen = 4,
ignore_cr_at_eol = true,
ignore_whitespace_change_at_eol = true,
indent_heuristic = true,
},
}
<
ZOXIDE *snacks-picker-sources-zoxide*
>vim
:lua Snacks.picker.zoxide(opts?)
<
Open a project from zoxide
>lua
{
finder = "files_zoxide",
format = "file",
confirm = "load_session",
win = {
preview = {
minimal = true,
},
},
}
<
==============================================================================
9. Layouts *snacks-picker-layouts*
BOTTOM *snacks-picker-layouts-bottom*
>lua
{ preset = "ivy", layout = { position = "bottom" } }
<
DEFAULT *snacks-picker-layouts-default*
>lua
{
layout = {
box = "horizontal",
width = 0.8,
min_width = 120,
height = 0.8,
{
box = "vertical",
border = "rounded",
title = "{title} {live} {flags}",
{ win = "input", height = 1, border = "bottom" },
{ win = "list", border = "none" },
},
{ win = "preview", title = "{preview}", border = "rounded", width = 0.5 },
},
}
<
DROPDOWN *snacks-picker-layouts-dropdown*
>lua
{
layout = {
backdrop = false,
row = 1,
width = 0.4,
min_width = 80,
height = 0.8,
border = "none",
box = "vertical",
{ win = "preview", title = "{preview}", height = 0.4, border = "rounded" },
{
box = "vertical",
border = "rounded",
title = "{title} {live} {flags}",
title_pos = "center",
{ win = "input", height = 1, border = "bottom" },
{ win = "list", border = "none" },
},
},
}
<
IVY *snacks-picker-layouts-ivy*
>lua
{
layout = {
box = "vertical",
backdrop = false,
row = -1,
width = 0,
height = 0.4,
border = "top",
title = " {title} {live} {flags}",
title_pos = "left",
{ win = "input", height = 1, border = "bottom" },
{
box = "horizontal",
{ win = "list", border = "none" },
{ win = "preview", title = "{preview}", width = 0.6, border = "left" },
},
},
}
<
IVY_SPLIT *snacks-picker-layouts-ivy_split*
>lua
{
preview = "main",
layout = {
box = "vertical",
backdrop = false,
width = 0,
height = 0.4,
position = "bottom",
border = "top",
title = " {title} {live} {flags}",
title_pos = "left",
{ win = "input", height = 1, border = "bottom" },
{
box = "horizontal",
{ win = "list", border = "none" },
{ win = "preview", title = "{preview}", width = 0.6, border = "left" },
},
},
}
<
LEFT *snacks-picker-layouts-left*
>lua
M.sidebar
<
RIGHT *snacks-picker-layouts-right*
>lua
{ preset = "sidebar", layout = { position = "right" } }
<
SELECT *snacks-picker-layouts-select*
>lua
{
preview = false,
layout = {
backdrop = false,
width = 0.5,
min_width = 80,
height = 0.4,
min_height = 3,
box = "vertical",
border = "rounded",
title = "{title}",
title_pos = "center",
{ win = "input", height = 1, border = "bottom" },
{ win = "list", border = "none" },
{ win = "preview", title = "{preview}", height = 0.4, border = "top" },
},
}
<
SIDEBAR *snacks-picker-layouts-sidebar*
>lua
{
preview = "main",
layout = {
backdrop = false,
width = 40,
min_width = 40,
height = 0,
position = "left",
border = "none",
box = "vertical",
{
win = "input",
height = 1,
border = "rounded",
title = "{title} {live} {flags}",
title_pos = "center",
},
{ win = "list", border = "none" },
{ win = "preview", title = "{preview}", height = 0.4, border = "top" },
},
}
<
TELESCOPE *snacks-picker-layouts-telescope*
>lua
{
reverse = true,
layout = {
box = "horizontal",
backdrop = false,
width = 0.8,
height = 0.9,
border = "none",
{
box = "vertical",
{ win = "list", title = " Results ", title_pos = "center", border = "rounded" },
{ win = "input", height = 1, border = "rounded", title = "{title} {live} {flags}", title_pos = "center" },
},
{
win = "preview",
title = "{preview:Preview}",
width = 0.45,
border = "rounded",
title_pos = "center",
},
},
}
<
TOP *snacks-picker-layouts-top*
>lua
{ preset = "ivy", layout = { position = "top" } }
<
VERTICAL *snacks-picker-layouts-vertical*
>lua
{
layout = {
backdrop = false,
width = 0.5,
min_width = 80,
height = 0.8,
min_height = 30,
box = "vertical",
border = "rounded",
title = "{title} {live} {flags}",
title_pos = "center",
{ win = "input", height = 1, border = "bottom" },
{ win = "list", border = "none" },
{ win = "preview", title = "{preview}", height = 0.4, border = "top" },
},
}
<
VSCODE *snacks-picker-layouts-vscode*
>lua
{
preview = false,
layout = {
backdrop = false,
row = 1,
width = 0.4,
min_width = 80,
height = 0.4,
border = "none",
box = "vertical",
{ win = "input", height = 1, border = "rounded", title = "{title} {live} {flags}", title_pos = "center" },
{ win = "list", border = "hpad" },
{ win = "preview", title = "{preview}", border = "rounded" },
},
}
<
==============================================================================
10. snacks.picker.actions *snacks-picker-snacks.picker.actions*
>lua
---@class snacks.picker.actions
---@field [string] snacks.picker.Action.spec
local M = {}
<
SNACKS.PICKER.ACTIONS.BUFDELETE()*snacks-picker-snacks.picker.actions-snacks.picker.actions.bufdelete()*
>lua
Snacks.picker.actions.bufdelete(picker)
<
SNACKS.PICKER.ACTIONS.CANCEL()*snacks-picker-snacks.picker.actions-snacks.picker.actions.cancel()*
>lua
Snacks.picker.actions.cancel(picker)
<
SNACKS.PICKER.ACTIONS.CD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.cd()*
>lua
Snacks.picker.actions.cd(_, item)
<
SNACKS.PICKER.ACTIONS.CLOSE()*snacks-picker-snacks.picker.actions-snacks.picker.actions.close()*
>lua
Snacks.picker.actions.close(picker)
<
SNACKS.PICKER.ACTIONS.CMD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.cmd()*
>lua
Snacks.picker.actions.cmd(picker, item)
<
SNACKS.PICKER.ACTIONS.CYCLE_WIN()*snacks-picker-snacks.picker.actions-snacks.picker.actions.cycle_win()*
>lua
Snacks.picker.actions.cycle_win(picker)
<
SNACKS.PICKER.ACTIONS.FOCUS_INPUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_input()*
>lua
Snacks.picker.actions.focus_input(picker)
<
SNACKS.PICKER.ACTIONS.FOCUS_LIST()*snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_list()*
>lua
Snacks.picker.actions.focus_list(picker)
<
SNACKS.PICKER.ACTIONS.FOCUS_PREVIEW()*snacks-picker-snacks.picker.actions-snacks.picker.actions.focus_preview()*
>lua
Snacks.picker.actions.focus_preview(picker)
<
SNACKS.PICKER.ACTIONS.GIT_BRANCH_ADD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.git_branch_add()*
>lua
Snacks.picker.actions.git_branch_add(picker)
<
SNACKS.PICKER.ACTIONS.GIT_BRANCH_DEL()*snacks-picker-snacks.picker.actions-snacks.picker.actions.git_branch_del()*
>lua
Snacks.picker.actions.git_branch_del(picker, item)
<
SNACKS.PICKER.ACTIONS.GIT_CHECKOUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.git_checkout()*
>lua
Snacks.picker.actions.git_checkout(picker, item)
<
SNACKS.PICKER.ACTIONS.GIT_STAGE()*snacks-picker-snacks.picker.actions-snacks.picker.actions.git_stage()*
>lua
Snacks.picker.actions.git_stage(picker)
<
SNACKS.PICKER.ACTIONS.GIT_STASH_APPLY()*snacks-picker-snacks.picker.actions-snacks.picker.actions.git_stash_apply()*
>lua
Snacks.picker.actions.git_stash_apply(_, item)
<
SNACKS.PICKER.ACTIONS.HELP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.help()*
>lua
Snacks.picker.actions.help(picker, item, action)
<
SNACKS.PICKER.ACTIONS.HISTORY_BACK()*snacks-picker-snacks.picker.actions-snacks.picker.actions.history_back()*
>lua
Snacks.picker.actions.history_back(picker)
<
SNACKS.PICKER.ACTIONS.HISTORY_FORWARD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.history_forward()*
>lua
Snacks.picker.actions.history_forward(picker)
<
SNACKS.PICKER.ACTIONS.INSPECT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.inspect()*
>lua
Snacks.picker.actions.inspect(picker, item)
<
SNACKS.PICKER.ACTIONS.ITEM_ACTION()*snacks-picker-snacks.picker.actions-snacks.picker.actions.item_action()*
>lua
Snacks.picker.actions.item_action(picker, item, action)
<
SNACKS.PICKER.ACTIONS.JUMP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.jump()*
>lua
Snacks.picker.actions.jump(picker, _, action)
<
SNACKS.PICKER.ACTIONS.LAYOUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.layout()*
>lua
Snacks.picker.actions.layout(picker, _, action)
<
SNACKS.PICKER.ACTIONS.LCD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.lcd()*
>lua
Snacks.picker.actions.lcd(_, item)
<
SNACKS.PICKER.ACTIONS.LIST_BOTTOM()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_bottom()*
>lua
Snacks.picker.actions.list_bottom(picker)
<
SNACKS.PICKER.ACTIONS.LIST_DOWN()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_down()*
>lua
Snacks.picker.actions.list_down(picker)
<
SNACKS.PICKER.ACTIONS.LIST_SCROLL_BOTTOM()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_bottom()*
>lua
Snacks.picker.actions.list_scroll_bottom(picker)
<
SNACKS.PICKER.ACTIONS.LIST_SCROLL_CENTER()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_center()*
>lua
Snacks.picker.actions.list_scroll_center(picker)
<
SNACKS.PICKER.ACTIONS.LIST_SCROLL_DOWN()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_down()*
>lua
Snacks.picker.actions.list_scroll_down(picker)
<
SNACKS.PICKER.ACTIONS.LIST_SCROLL_TOP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_top()*
>lua
Snacks.picker.actions.list_scroll_top(picker)
<
SNACKS.PICKER.ACTIONS.LIST_SCROLL_UP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_scroll_up()*
>lua
Snacks.picker.actions.list_scroll_up(picker)
<
SNACKS.PICKER.ACTIONS.LIST_TOP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_top()*
>lua
Snacks.picker.actions.list_top(picker)
<
SNACKS.PICKER.ACTIONS.LIST_UP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.list_up()*
>lua
Snacks.picker.actions.list_up(picker)
<
SNACKS.PICKER.ACTIONS.LOAD_SESSION()*snacks-picker-snacks.picker.actions-snacks.picker.actions.load_session()*
Tries to load the session, if it fails, it will open the picker.
>lua
Snacks.picker.actions.load_session(picker, item)
<
SNACKS.PICKER.ACTIONS.LOCLIST()*snacks-picker-snacks.picker.actions-snacks.picker.actions.loclist()*
Send selected or all items to the location list.
>lua
Snacks.picker.actions.loclist(picker)
<
SNACKS.PICKER.ACTIONS.PICK_WIN()*snacks-picker-snacks.picker.actions-snacks.picker.actions.pick_win()*
>lua
Snacks.picker.actions.pick_win(picker, item, action)
<
SNACKS.PICKER.ACTIONS.PICKER()*snacks-picker-snacks.picker.actions-snacks.picker.actions.picker()*
>lua
Snacks.picker.actions.picker(picker, item, action)
<
SNACKS.PICKER.ACTIONS.PICKER_GREP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.picker_grep()*
>lua
Snacks.picker.actions.picker_grep(_, item)
<
SNACKS.PICKER.ACTIONS.PREVIEW_SCROLL_DOWN()*snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_down()*
>lua
Snacks.picker.actions.preview_scroll_down(picker)
<
SNACKS.PICKER.ACTIONS.PREVIEW_SCROLL_LEFT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_left()*
>lua
Snacks.picker.actions.preview_scroll_left(picker)
<
SNACKS.PICKER.ACTIONS.PREVIEW_SCROLL_RIGHT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_right()*
>lua
Snacks.picker.actions.preview_scroll_right(picker)
<
SNACKS.PICKER.ACTIONS.PREVIEW_SCROLL_UP()*snacks-picker-snacks.picker.actions-snacks.picker.actions.preview_scroll_up()*
>lua
Snacks.picker.actions.preview_scroll_up(picker)
<
SNACKS.PICKER.ACTIONS.PUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.put()*
>lua
Snacks.picker.actions.put(picker, item, action)
<
SNACKS.PICKER.ACTIONS.QFLIST()*snacks-picker-snacks.picker.actions-snacks.picker.actions.qflist()*
Send selected or all items to the quickfix list.
>lua
Snacks.picker.actions.qflist(picker)
<
SNACKS.PICKER.ACTIONS.QFLIST_ALL()*snacks-picker-snacks.picker.actions-snacks.picker.actions.qflist_all()*
Send all items to the quickfix list.
>lua
Snacks.picker.actions.qflist_all(picker)
<
SNACKS.PICKER.ACTIONS.SEARCH()*snacks-picker-snacks.picker.actions-snacks.picker.actions.search()*
>lua
Snacks.picker.actions.search(picker, item)
<
SNACKS.PICKER.ACTIONS.SELECT_ALL()*snacks-picker-snacks.picker.actions-snacks.picker.actions.select_all()*
Selects all items in the list. Or clears the selection if all items are
selected.
>lua
Snacks.picker.actions.select_all(picker)
<
SNACKS.PICKER.ACTIONS.SELECT_AND_NEXT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.select_and_next()*
Toggles the selection of the current item, and moves the cursor to the next
item.
>lua
Snacks.picker.actions.select_and_next(picker)
<
SNACKS.PICKER.ACTIONS.SELECT_AND_PREV()*snacks-picker-snacks.picker.actions-snacks.picker.actions.select_and_prev()*
Toggles the selection of the current item, and moves the cursor to the prev
item.
>lua
Snacks.picker.actions.select_and_prev(picker)
<
SNACKS.PICKER.ACTIONS.TCD()*snacks-picker-snacks.picker.actions-snacks.picker.actions.tcd()*
>lua
Snacks.picker.actions.tcd(_, item)
<
SNACKS.PICKER.ACTIONS.TERMINAL()*snacks-picker-snacks.picker.actions-snacks.picker.actions.terminal()*
>lua
Snacks.picker.actions.terminal(_, item)
<
SNACKS.PICKER.ACTIONS.TOGGLE_FOCUS()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_focus()*
>lua
Snacks.picker.actions.toggle_focus(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_HELP_INPUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_help_input()*
>lua
Snacks.picker.actions.toggle_help_input(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_HELP_LIST()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_help_list()*
>lua
Snacks.picker.actions.toggle_help_list(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_INPUT()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_input()*
>lua
Snacks.picker.actions.toggle_input(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_LIVE()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_live()*
>lua
Snacks.picker.actions.toggle_live(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_MAXIMIZE()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_maximize()*
>lua
Snacks.picker.actions.toggle_maximize(picker)
<
SNACKS.PICKER.ACTIONS.TOGGLE_PREVIEW()*snacks-picker-snacks.picker.actions-snacks.picker.actions.toggle_preview()*
>lua
Snacks.picker.actions.toggle_preview(picker)
<
SNACKS.PICKER.ACTIONS.YANK()*snacks-picker-snacks.picker.actions-snacks.picker.actions.yank()*
>lua
Snacks.picker.actions.yank(picker, item, action)
<
==============================================================================
11. snacks.picker.core.picker *snacks-picker-snacks.picker.core.picker*
>lua
---@class snacks.Picker
---@field id number
---@field opts snacks.picker.Config
---@field init_opts? snacks.picker.Config
---@field finder snacks.picker.Finder
---@field format snacks.picker.format
---@field input snacks.picker.input
---@field layout snacks.layout
---@field resolved_layout snacks.picker.layout.Config
---@field list snacks.picker.list
---@field matcher snacks.picker.Matcher
---@field main number
---@field _main snacks.picker.Main
---@field preview snacks.picker.Preview
---@field shown? boolean
---@field sort snacks.picker.sort
---@field updater uv.uv_timer_t
---@field start_time number
---@field title string
---@field closed? boolean
---@field history snacks.picker.History
---@field visual? snacks.picker.Visual
local M = {}
<
SNACKS.PICKER.PICKER.GET()*snacks-picker-snacks.picker.core.picker-snacks.picker.picker.get()*
>lua
---@param opts? {source?: string, tab?: boolean}
Snacks.picker.picker.get(opts)
<
PICKER:ACTION() *snacks-picker-snacks.picker.core.picker-picker:action()*
Execute the given action(s)
>lua
---@param actions string|string[]
picker:action(actions)
<
PICKER:CLOSE() *snacks-picker-snacks.picker.core.picker-picker:close()*
Close the picker
>lua
picker:close()
<
PICKER:COUNT() *snacks-picker-snacks.picker.core.picker-picker:count()*
Total number of items in the picker
>lua
picker:count()
<
PICKER:CURRENT() *snacks-picker-snacks.picker.core.picker-picker:current()*
Get the current item at the cursor
>lua
---@param opts? {resolve?: boolean} default is `true`
picker:current(opts)
<
PICKER:CURRENT_WIN()*snacks-picker-snacks.picker.core.picker-picker:current_win()*
>lua
---@return string? name, snacks.win? win
picker:current_win()
<
PICKER:CWD() *snacks-picker-snacks.picker.core.picker-picker:cwd()*
>lua
picker:cwd()
<
PICKER:DIR() *snacks-picker-snacks.picker.core.picker-picker:dir()*
Returns the directory of the current item or the cwd. When the item is a
directory, return item path, otherwise return the directory of the item.
>lua
picker:dir()
<
PICKER:EMPTY() *snacks-picker-snacks.picker.core.picker-picker:empty()*
Check if the picker is empty
>lua
picker:empty()
<
PICKER:FILTER() *snacks-picker-snacks.picker.core.picker-picker:filter()*
Get the active filter
>lua
picker:filter()
<
PICKER:FIND() *snacks-picker-snacks.picker.core.picker-picker:find()*
Check if the finder and/or matcher need to run, based on the current pattern
and search string.
>lua
---@param opts? { on_done?: fun(), refresh?: boolean }
picker:find(opts)
<
PICKER:FOCUS() *snacks-picker-snacks.picker.core.picker-picker:focus()*
Focuses the given or configured window. Falls back to the first available
window if the window is hidden.
>lua
---@param win? "input"|"list"|"preview"
---@param opts? {show?: boolean} when enable is true, the window will be shown if hidden
picker:focus(win, opts)
<
PICKER:HIST() *snacks-picker-snacks.picker.core.picker-picker:hist()*
Move the history cursor
>lua
---@param forward? boolean
picker:hist(forward)
<
PICKER:IS_ACTIVE()*snacks-picker-snacks.picker.core.picker-picker:is_active()*
Check if the finder or matcher is running
>lua
picker:is_active()
<
PICKER:IS_FOCUSED()*snacks-picker-snacks.picker.core.picker-picker:is_focused()*
>lua
picker:is_focused()
<
PICKER:ITEMS() *snacks-picker-snacks.picker.core.picker-picker:items()*
Get all filtered items in the picker.
>lua
picker:items()
<
PICKER:ITER() *snacks-picker-snacks.picker.core.picker-picker:iter()*
Returns an iterator over the filtered items in the picker. Items will be in
sorted order.
>lua
---@return fun():(snacks.picker.Item?, number?)
picker:iter()
<
PICKER:NORM() *snacks-picker-snacks.picker.core.picker-picker:norm()*
Execute the callback in normal mode. When still in insert mode, stop insert
mode first, and then`vim.schedule` the callback.
>lua
---@param cb fun()
picker:norm(cb)
<
PICKER:ON_CURRENT_TAB()*snacks-picker-snacks.picker.core.picker-picker:on_current_tab()*
>lua
picker:on_current_tab()
<
PICKER:REF() *snacks-picker-snacks.picker.core.picker-picker:ref()*
>lua
---@return snacks.Picker.ref
picker:ref()
<
PICKER:RESOLVE() *snacks-picker-snacks.picker.core.picker-picker:resolve()*
>lua
---@param item snacks.picker.Item?
picker:resolve(item)
<
PICKER:SELECTED() *snacks-picker-snacks.picker.core.picker-picker:selected()*
Get the selected items. If `fallback=true` and there is no selection, return
the current item.
>lua
---@param opts? {fallback?: boolean} default is `false`
---@return snacks.picker.Item[]
picker:selected(opts)
<
PICKER:SET_CWD() *snacks-picker-snacks.picker.core.picker-picker:set_cwd()*
>lua
picker:set_cwd(cwd)
<
PICKER:SET_LAYOUT()*snacks-picker-snacks.picker.core.picker-picker:set_layout()*
Set the picker layout. Can be either the name of a preset layout or a custom
layout configuration.
>lua
---@param layout? string|snacks.picker.layout.Config
picker:set_layout(layout)
<
PICKER:SHOW_PREVIEW()*snacks-picker-snacks.picker.core.picker-picker:show_preview()*
Show the preview. Show instantly when no item is yet in the preview, otherwise
throttle the preview.
>lua
picker:show_preview()
<
PICKER:TOGGLE() *snacks-picker-snacks.picker.core.picker-picker:toggle()*
Toggle the given window and optionally focus
>lua
---@param win "input"|"list"|"preview"
---@param opts? {enable?: boolean, focus?: boolean|string}
picker:toggle(win, opts)
<
PICKER:WORD() *snacks-picker-snacks.picker.core.picker-picker:word()*
Get the word under the cursor or the current visual selection
>lua
picker:word()
<
==============================================================================
12. Links *snacks-picker-links*
1. *image*: https://github.com/user-attachments/assets/b454fc3c-6613-4aa4-9296-f57a8b02bf6d
2. *image*: https://github.com/user-attachments/assets/3203aec4-7d75-4bca-b3d5-18d931277e4e
3. *image*: https://github.com/user-attachments/assets/e09d25f8-8559-441c-a0f7-576d2aa57097
4. *image*: https://github.com/user-attachments/assets/291dcf63-0c1d-4e9a-97cb-dd5503660e6f
5. *image*: https://github.com/user-attachments/assets/1aba5737-a650-4a00-94f8-033b7d8d21ba
6. *image*: https://github.com/user-attachments/assets/976e0ed8-eb80-43e1-93ac-4683136c0a3c
Generated by panvimdoc <https://github.com/kdheepak/panvimdoc>
vim:tw=78:ts=8:noet:ft=help:norl: