pickme.nvim
December 24, 2025 ยท View on GitHub
pickme.nvim
A unified interface for multiple Neovim picker plugins (Telescope, FZF-Lua, and Snacks). Write your code once and let users choose their preferred picker backend!
โจ Features
- Auto-detects available picker providers based on your configuration
- Seamlessly switch between Telescope, FZF-Lua, and Snacks.picker
- 40+ common pickers that work across all providers
- Nice collection of exclusive pickers for each provider
- Custom picker API for creating your own powerful pickers
- Sensible default keybindings
โก Setup
๐ป Installation
Using lazy.nvim:
{
'2KAbhishek/pickme.nvim',
cmd = 'PickMe',
event = 'VeryLazy',
dependencies = {
-- Include at least one of these pickers:
'folke/snacks.nvim', -- For snacks.picker
-- 'nvim-telescope/telescope.nvim', -- For telescope
-- 'ibhagwan/fzf-lua', -- For fzf-lua
},
opts = {
picker_provider = 'snacks', -- Default provider
},
}
๐ Usage
Configuration
require('pickme').setup({
-- Choose your preferred picker provider
picker_provider = 'snacks', -- Options: 'snacks' (default), 'telescope', 'fzf_lua'
-- Auto-detect available picker providers (default: true)
-- If the specified picker_provider is not available, will try to use one from provider_priority list
detect_provider = true,
-- Add default keybindings (default: true)
-- See Keybindings section below for the full list of default keybindings
add_default_keybindings = true,
-- Command aliases for convenient shortcuts
-- Example: using ':PickMe grep' will call ':PickMe live_grep'
command_aliases = {
grep = 'live_grep',
-- Add your own aliases here
}
})
Available Pickers
Common Pickers
These pickers are available across all three supported providers (snacks, telescope, fzf_lua):
autocmds- List autocommandsbuffer_grep- Search within current bufferbuffers- Browse and select open bufferscolorschemes- Browse and apply colorschemescommand_history- View command historycommands- Browse available commandsdiagnostics- View workspace diagnosticsfiles- Find files in the current directorygit_branches- View and checkout git branchesgit_commits- Browse git commit historygit_files- Find files tracked by Gitgit_log_file- View git commits for the current buffergit_log_line- View git history for current linegit_stash- Browse git stash entriesgit_status- View files with git status changesgrep_string- Search for the word under cursorhelp- Search through help tagshighlights- Browse highlight groupsjumplist- Navigate through jump historykeymaps- Browse configured key mappingslive_grep- Search for a string in your project (grep)loclist- Browse location listlsp_declarations- Find declarations with LSPlsp_definitions- Go to definition of the symbol under cursorlsp_document_symbols- List symbols in current documentlsp_implementations- Find implementations of the interface under cursorlsp_references- Find references to the symbol under cursorlsp_type_definitions- Find type definitionslsp_workspace_symbols- Search for workspace symbolsman- Browse manual pagesmarks- View and jump to marksoldfiles- Browse recently opened filesoptions- Browse Neovim optionspickers- Browse available pickersquickfix- Browse quickfix listregisters- View contents of registersresume- Resume the last pickersearch_history- View search historyspell_suggest- Get spelling suggestions for word under cursortreesitter- Navigate treesitter symbols
Snacks Pickers
cliphist- Browse clipboard historygrep_buffers- Search across all open buffersicons- Browse and insert iconslazy- Search through lazy.nvim plugin specslsp_config- Browse LSP server configurationsprojects- Browse and switch between projects
Telescope Pickers
options- View Neovim optionsicons- Browse symbols (with devicons)tags- Work with ctags
FZF-Lua Pickers
breakpoints- View DAP debugger breakpointsgit_tags- Browse git tagsoptions- View Neovim optionsprofiles- Switch FZF profilestabs- Browse and switch between tabstags- Work with ctagstmux_cliphist- Browse tmux clipboard history
Custom Pickers
These are utility functions you can use to create your own pickers:
select_file- Custom file picker with provided itemscustom_picker- Fully customizable picker with custom items and handlers
Lua Usage
local pickme = require('pickme')
-- Basic usage
pickme.pick('files', { title = 'Find Files' })
pickme.pick('live_grep', { title = 'Search Text' })
-- Select file from a list of files
pickme.select_file({
items = { "path/to/file1.txt", "path/to/file2.lua", "path/to/file3.md" },
title = "Select a file to open"
})
-- Using custom picker
pickme.custom_picker({
title = 'My Custom Picker',
items = {'item1', 'item2', 'item3'},
entry_maker = function(item)
return { display = item, value = item }
end,
preview_generator = function(item)
return "Preview content for " .. item
end,
preview_ft = 'markdown',
-- Action to perform on selection / when <CR> is pressed
selection_handler = function(_, selection)
print("Selected: " .. selection.value)
end,
-- Optional custom actions mapped to keys
action_map = {
['<C-s>'] = function(_, selection)
vim.notify("Selection: " .. selection.value)
end
}
})
Example Usages:
- custom_picker in octohub.nvim/repos.lua
- select_file in tdo.nvim/init.lua
Keybindings
If add_default_keybindings = true in your setup, the following keybindings will be automatically configured:
| Keybinding | Command | Description |
|---|---|---|
<leader>, | buffers | Buffers |
<leader>/ | search_history | Search History |
<leader>: | command_history | Command History |
<leader><space> | files | Files |
<C-f> | files | Files |
<leader>fa | files | Find Files |
<leader>fb | buffers | Buffers |
<leader>fd | projects | Project Dirs |
<leader>ff | git_files | Find Git Files |
<leader>fg | live_grep | Grep |
<leader>fl | loclist | Location List |
<leader>fm | git_status | Modified Files |
<leader>fo | grep_buffers | Grep Open Buffers |
<leader>fp | resume | Previous Picker |
<leader>fq | quickfix | Quickfix List |
<leader>fr | oldfiles | Recent Files |
<leader>fs | buffer_grep | Buffer Lines |
<leader>ft | pickers | All Pickers |
<leader>fu | undo | Undo History |
<leader>fw | grep_string | Word Grep |
<leader>fz | zoxide | Zoxide |
<leader>gS | git_stash | Git Stash |
<leader>gc | git_commits | Git Commits |
<leader>gf | git_log_file | File Commits |
<leader>gl | git_log_line | Line Commits |
<leader>gs | git_branches | Git Branches |
<leader>ii | icons | Icons |
<leader>ir | registers | Registers |
<leader>is | spell_suggest | Spell Suggestions |
<leader>iv | cliphist | Clipboard |
<leader>lD | lsp_declarations | LSP Declarations |
<leader>lF | lsp_references | References |
<leader>lL | diagnostics | Diagnostics |
<leader>lS | lsp_workspace_symbols | Workspace Symbols |
<leader>ld | lsp_definitions | LSP Definitions |
<leader>li | lsp_implementations | LSP Implementations |
<leader>ll | diagnostics_buffer | Buffer Diagnostics |
<leader>ls | lsp_document_symbols | Document Symbols |
<leader>lt | lsp_type_definitions | Type Definitions |
<leader>oC | colorschemes | Colorschemes |
<leader>oa | autocmds | Autocmds |
<leader>oc | command_history | Command History |
<leader>od | help | Docs |
<leader>of | marks | Marks |
<leader>og | commands | Commands |
<leader>oh | highlights | Highlights |
<leader>oj | jumplist | Jump List |
<leader>ok | keymaps | Keymaps |
<leader>ol | lazy | Search for Plugin Spec |
<leader>om | man | Man Pages |
<leader>on | notifications | Notifications |
<leader>oo | options | Options |
<leader>os | search_history | Search History |
<leader>ot | treesitter | Treesitter Find |
<leader>ecc | Custom | Neovim Configs |
<leader>ecP | Custom | Plugin Files |
If you want to disable the default keybindings, set add_default_keybindings = false in your setup.
You can add your own keybindings by using the pickme.pick function or the PickMe command. For example:
local pickme = require('pickme')
vim.keymap.set('n', '<leader>ff', function() pickme.pick('git_files', { title = 'Git Files' }) end, { desc = 'Git Files' })
vim.keymap.set('n', '<leader>fg', function() pickme.pick('live_grep') end, { desc = 'Live Grep' })
vim.keymap.set('n', '<leader>fa', ':PickMe files<cr>', { desc = 'All Files' })
Help
Run :help pickme.txt for more details.
๐๏ธ What's Next
- You tell me!
โ Behind The Code
๐ Inspiration
I was tired of maintaining separate implementations for different picker plugins in my Neovim extensions. Now I can write the code once and let users pick their preferred UI!
๐ก Challenges/Learnings
- Finding information about different pickers supported by picker providers was time consuming.
- Got to create a unified interface for different pickers.
๐งฐ Tooling
- dots2k โ Dev Environment
- nvim2k โ Personalized Editor
- sway2k โ Desktop Environment
- qute2k โ Personalized Browser
๐ More Info
- nerdy.nvim โ Find nerd glyphs easily
- tdo.nvim โ Fast and simple notes in Neovim
- termim.nvim โ Neovim terminal improved
- octohub.nvim โ Github repos in Neovim
- exercism.nvim โ Exercism exercises in Neovim
โญ hit the star button if you found this useful โญ
Source | Blog | Twitter | LinkedIn | More Links | Other Projects