Real image icons inside Neovim, not font glyphs.
real-icons.nvim brings real file and folder icons from PNG and SVG themes to
explorers, pickers, statuslines, and tablines. It renders through the Kitty
Graphics Protocol in Ghostty and Kitty, works through configured tmux
passthrough, and safely falls back to glyphs in other terminals.
| Real icons | Your icon themes | 10 integrations |
|---|---|---|
| Render images with their original colors and shapes. | Use Material Icon Theme, local VS Code themes, or your own files. | Connect popular pickers, explorers, statuslines, and tablines. |
mini.icons or
nvim-web-devicons fallback.magick from ImageMagick for SVG themescurl and tar for installing Material Icon Themetermguicolors{
"Mirsmog/real-icons.nvim",
build = ":RealIcons install",
opts = {
integrations = {
neo_tree = true,
},
},
}
Replace neo_tree with any integration key from the table below, or enable
several.
To verify the renderer immediately:
:RealIcons demo
If Material Icon Theme is unavailable, the plugin uses its bundled fallback pack, so installation never leaves Neovim without icons.
:RealIcons
With no arguments, :RealIcons opens a small menu. The same actions are
available as subcommands for configuration and scripts:
| Command | Purpose |
|---|---|
:RealIcons demo |
Preview the renderer |
:RealIcons packs |
Discover, preview, and switch icon packs |
:RealIcons install |
Install Material Icon Theme |
:RealIcons health |
Run health checks |
:RealIcons help |
Open the help page |
:RealIcons clear-cache [pack] |
Repair a stale or damaged cache |
Tab completion is available for every action. The standard command
:checkhealth real-icons works as well.
All integrations are opt-in. Add the matching key under integrations:
| UI | Configuration key | Setup |
|---|---|---|
| neo-tree.nvim | neo_tree |
automatic |
| nvim-tree.lua | nvim_tree |
automatic |
| oil.nvim | oil |
automatic |
| mini.files | mini_files |
automatic |
| telescope.nvim | telescope |
automatic |
| fzf-lua | fzf_lua |
automatic |
| snacks.picker | snacks_picker |
automatic |
| bufferline.nvim | bufferline |
automatic |
| lualine.nvim | lualine |
automatic |
| telescope-file-browser.nvim | telescope_file_browser |
entry maker |
For example, an fzf-lua and Oil setup only needs:
require("real-icons").setup({
integrations = {
fzf_lua = true,
oil = true,
},
})
Integrations preserve sorting, filtering, git status, diagnostics, and other UI behavior.
require("telescope").setup({
extensions = {
file_browser = {
entry_maker = require("real-icons.integrations.telescope_file_browser").entry_maker,
},
},
})
require("telescope").load_extension("file_browser")
Caching, multi-selection, git columns, stat columns, and resize behavior continue to work with the custom entry maker.
More integration details are available in
doc/real-icons.txt and :help real-icons-integrations.
Material Icon Theme is the recommended pack and is installed by the lazy.nvim
build command shown above. The small builtin pack is always available.
Run this to browse every configured pack and compatible VS Code theme found on your machine:
:RealIcons packs
The picker scans the standard extension directories for VS Code, VSCodium, Cursor, and Windsurf, and previews each theme before switching.
require("real-icons").setup({
pack = "my_theme",
packs = {
my_theme = {
type = "vscode",
path = "/path/to/vscode-icon-theme",
theme = "theme-id",
},
},
})
You can also point at a specific manifest instead of a theme identifier.
Simple local packs, per-file overrides, and the pack loader API are documented
under :help real-icons-packs.
Most setups only need integration keys. The defaults reserve two terminal cells for one icon and automatically cache the correct size and color variant.
require("real-icons").setup({
rules = {
directories = {
{
glob = "**/packages/*/src/**",
icon = "folder-packages",
},
},
},
})
* stays inside one path segment and ** crosses path separators. Rules are
generic and can target any project layout.
The complete option reference, including size, color, pack, and override
settings, lives in doc/real-icons.txt. Inside Neovim,
run :help real-icons-setup.
| Environment | Result |
|---|---|
| Ghostty | real image icons |
| Kitty | real image icons |
| Ghostty or Kitty inside tmux | real image icons with passthrough enabled |
| WezTerm | safe glyph fallback |
| Other terminals and Neovide | glyph fallback when an icon provider is available |
set -g allow-passthrough on
WezTerm supports the base Kitty Graphics Protocol but not the Unicode
placeholders used to anchor images to Neovim cells. Until
wezterm/wezterm#986 lands,
backend = "auto" selects glyph fallback there.
Start with:
:RealIcons health
It checks Neovim, the terminal, termguicolors, ImageMagick, tmux passthrough,
the selected icon pack, and enabled integrations.
If icons do not appear:
:RealIcons demo to isolate the renderer from integrations.:RealIcons install if Material Icon Theme is missing.magick is executable for SVG themes.allow-passthrough is enabled.:RealIcons clear-cache only if generated files are damaged or stale.When reporting a problem, include the Neovim version, terminal name, plugin
version, and output from :checkhealth real-icons.
The placeholder moves with the text grid, so integrations use normal text positions instead of absolute pixel coordinates.
The help file covers the full configuration, Lua API, pack format, and adapter contracts:
:help real-icons
Run the local test suite with:
make test
real-icons.nvim is licensed under the MIT License. Installed icon
packs keep their upstream licenses.