https://github.com/willyelm/pulse.nvim
A single command palette with prefix based pickers for Neovim
https://github.com/willyelm/pulse.nvim
command-palette neovim plugin programming zenmode
Last synced: about 2 hours ago
JSON representation
A single command palette with prefix based pickers for Neovim
- Host: GitHub
- URL: https://github.com/willyelm/pulse.nvim
- Owner: willyelm
- License: mit
- Created: 2026-02-19T16:59:55.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-07-03T21:32:16.000Z (1 day ago)
- Last Synced: 2026-07-03T23:23:36.528Z (1 day ago)
- Topics: command-palette, neovim, plugin, programming, zenmode
- Language: Lua
- Homepage:
- Size: 15.9 MB
- Stars: 32
- Watchers: 0
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
- awesome-neovim-sorted - willyelm/pulse.nvim
- awesome-neovim - willyelm/pulse.nvim - A single entrypoint for commands. Use prefixes to quickly access diagnostics, Git and more via pickers. (Fuzzy Finder / Markdown and LaTeX)
README

# Pulse.nvim
One entry point. Total focus.

## What is Pulse
A fast command palette for Neovim. Pulse uses a prefix approach to move quickly
between navigator modes:
| Prefix | Mode |
| ----------- | ----------------------------- |
| (no prefix) | files |
| `:` | commands |
| `~` | git |
| `!` | diagnostics |
| `@` | symbols (current buffer) |
| `#` | workspace symbols |
| `$` | live grep |
| `?` | fuzzy search (current buffer) |
| `>` | code actions (current buffer) |
For more on the design motivation, see:
- [Engineering with machines](https://willmedina.com/blog/engineering-with-machines)
- [A Single Command Palette for Neovim](https://willmedina.com/blog/pulse-neovim)
## Requirements
- Neovim `>= 0.10`
- `ripgrep` (`rg`)
- `git` (for git panels and previews)
- `nvim-tree/nvim-web-devicons` (optional, recommended)
## Install (vim pack)
```lua
vim.pack.add("https://github.com/willyelm/pulse.nvim")
require("pulse").setup({})
```
## Install (lazy.nvim)
```lua
{
"willyelm/pulse.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {},
}
```
## Setup
```lua
require("pulse").setup({
cmdline = true, -- Enable experimental ':' cmdline replacement
position = "top",
width = 0.70,
height = 0.90,
border = "rounded",
workspace_label = false, -- Show workspace dir in main input
})
```
## Navigators
Navigators are the different modes you can enter in Pulse. Each navigator has
its own data source, display, and actions.
You can configure which navigators to load and their config options.
**Default navigators** (all loaded if not specified):
- `files` - Project files and opened buffers
- `commands` - Vim commands
- `git` - Git status and project and file history
- `diagnostics` - LSP diagnostics
- `code_actions` - Code actions (current buffer)
- `symbols` - Symbols (current buffer)
- `workspace_symbols` - Workspace symbols
- `live_grep` - Search with ripgrep
- `fuzzy_search` - Fuzzy search (current buffer)
To load a specific set only:
```lua
require("pulse").setup({
navigators = { "files", "commands", "git" },
})
```
Each navigator can receive its own config directly through `navigators`:
```lua
require("pulse").setup({
navigators = {
files = {
icons = false,
filters = { "^%.git$", "%.DS_Store$" },
git = {
enable = true,
ignore = false,
},
},
},
})
```
Current `files` options:
- `icons`
- `icon_color`
- `filters`
- `git.enable`
- `git.ignore`
- `open_on_directory`
- `tree_view` (default `true`; set `false` for a flat, Telescope-style file list with no folder browsing)
## Files Navigator
Pulse files navigator shows project files and opened buffers. It can be used as
a file explorer and replace netrw.
### Setup as Default Tree
To open Pulse files instead of netrw for directory buffers like `nvim .`, set
the netrw globals before setup and enable `open_on_directory` on the files
navigator:
```lua
-- Set in your vim config
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
-- Plugin
require("pulse").setup({
navigators = {
files = {
open_on_directory = true,
},
},
})
```
With `lazy.nvim`:
```lua
-- Set in your vim config
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
-- Lazy plugin config
{
"willyelm/pulse.nvim",
lazy = false,
dependencies = {
"nvim-tree/nvim-web-devicons",
},
opts = {
cmdline = true,
position = "top",
height = 0.9,
width = 0.7,
workspace_label = false,
navigators = {
files = {
open_on_directory = true,
},
},
},
}
```
## Open Pulse
- `:Pulse`
- `:Pulse files`
- `:Pulse commands`
- `:Pulse git`
- `:Pulse diagnostics`
- `:Pulse code_actions`
- `:Pulse symbols`
- `:Pulse workspace_symbols`
- `:Pulse live_grep`
- `:Pulse fuzzy_search`
## Input + Navigation
- `/`: next item (from input)
- `/`: previous item (from input)
- `/`:
- from input: switch panels when the cursor is at the end of the input
- from list: switch panels directly
- `Esc`: close navigator
- ``:
- files:
- folder: enter folder scope
- file: preview in source window and enter buffer scope
- symbols/workspace symbols: jump to location (navigator stays open)
- live grep/fuzzy search: open/jump to location (navigator stays open)
- diagnostics: jump to location (navigator stays open)
- commands: replace input with selected command
- git: preview/jump depending on the current git panel item
- ``: submit/open and close navigator
- selection wraps from last->first and first->last
When a scope token is present:
- first backspace removes the current panel prefix
- next backspace removes the scope token
In `commands` mode:
- No implicit first-item execution.
- `` executes the selected command only after explicit navigation.
- Otherwise `` executes the typed command.
## Optional Keymaps
```lua
vim.keymap.set("n", "p", "Pulse", { desc = "Pulse" })
vim.keymap.set("n", "pg", "Pulse git", { desc = "Pulse Git" })
vim.keymap.set("n", "pb", "Pulse buffers", { desc = "Pulse Buffers" })
vim.keymap.set("n", "pd", "Pulse diagnostics", { desc = "Pulse Diagnostics" })
vim.keymap.set("n", "pc", "Pulse code_actions", { desc = "Pulse Code Actions" })
vim.keymap.set("n", "ps", "Pulse symbols", { desc = "Pulse Symbols" })
vim.keymap.set("n", "pw", "Pulse workspace_symbols", { desc = "Pulse Workspace Symbols" })
vim.keymap.set("n", "pl", "Pulse live_grep", { desc = "Pulse Live Grep" })
vim.keymap.set("n", "pf", "Pulse fuzzy_search", { desc = "Pulse Fuzzy Search" })
```
## Theming
Pulse mostly uses native Neovim highlight groups for color:
- `DiffAdd`
- `DiffDelete`
- `DiffChange`
- `Directory`
- `LineNr`
- `Title`
Pulse-specific groups are only used where it needs custom UI treatment:
- `PulseDiffAdd`
- `PulseDiffDelete`
- `PulseDiffNAdd` - Secondary background for added lines in diff
- `PulseDiffNDelete` - Secondary background for deleted lines in diff
Example:
```lua
vim.api.nvim_set_hl(0, "PulseDiffAdd", { link = "DiffAdd" })
vim.api.nvim_set_hl(0, "PulseDiffDelete", { link = "DiffDelete" })
```
## Contributing
[See CONTRIBUTING.md](./CONTRIBUTING.md)
## Changelog
[See CHANGELOG.md](./CHANGELOG.md)