No description
Find a file
Barrett Ruth 04791cd41a
feat: initial nonicons.nvim rewrite
Problem: the original ya2s/nvim-nonicons fork diverged enough that
maintaining it as a fork was pointless. The set_icon() approach broke
with modern nvim-web-devicons, and the extensions directory coupled
integrations that belong in user config.

Solution: from-scratch rewrite with function wrapping + table mutation
override engine, vim.g.nonicons config pattern, vendored mapping with
integer codepoints, health check, vimdoc with recipes, and no built-in
plugin integrations.
2026-02-17 19:34:13 -05:00
doc feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
lua/nonicons feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
plugin feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
.editorconfig feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
.gitignore feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
.luarc.json feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
LICENSE feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
nonicons.nvim-scm-1.rockspec feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
README.md feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
selene.toml feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
stylua.toml feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00
vim.toml feat: initial nonicons.nvim rewrite 2026-02-17 19:34:13 -05:00

nonicons.nvim

Nonicons for Neovim

Replace nvim-web-devicons glyphs with icons from the nonicons font. Any plugin that uses nvim-web-devicons automatically displays nonicons glyphs.

Requirements

Installation

Install the nonicons font and configure your terminal to use it as a fallback:

ghostty

font-family = Nonicons
font-family = YourMainFont

kitty

symbol_map U+F101-U+F219 Nonicons

wezterm

config.font = wezterm.font_with_fallback({
  'YourMainFont',
  'Nonicons',
})

Install with your package manager of choice or via luarocks:

luarocks install nonicons.nvim

lazy.nvim

{
  'barrettruth/nonicons.nvim',
  dependencies = { 'nvim-tree/nvim-web-devicons' },
}

The plugin applies overrides automatically. No setup() call is needed.

Configuration

Configure via vim.g.nonicons before the plugin loads:

vim.g.nonicons = {
  override = true,  -- default; set false to disable devicons wrapping
}

Usage

local get = require('nonicons').get

get('lua')        -- returns the nonicons lua character
get('python')     -- returns the nonicons python character
get('git-branch') -- returns the nonicons git-branch character

The raw mapping table is available for advanced use:

local code = require('nonicons').mapping['lua']
local icon = vim.fn.nr2char(code)

Recipes

lualine — mode icons:

local get = require('nonicons').get

require('lualine').setup({
  sections = {
    lualine_a = {
      {
        'mode',
        fmt = function(mode)
          local map = {
            NORMAL = get('vim-normal-mode'),
            INSERT = get('vim-insert-mode'),
            VISUAL = get('vim-visual-mode'),
            REPLACE = get('vim-replace-mode'),
            COMMAND = get('vim-command-mode'),
          }
          return map[mode] or mode
        end,
      },
    },
  },
})

nvim-notify:

require('notify').setup({
  icons = {
    ERROR = require('nonicons').get('x-circle'),
    WARN = require('nonicons').get('alert'),
    INFO = require('nonicons').get('info'),
    DEBUG = require('nonicons').get('bug'),
    TRACE = require('nonicons').get('play'),
  },
})

mason.nvim:

require('mason').setup({
  ui = {
    icons = {
      package_installed = require('nonicons').get('check'),
      package_pending = require('nonicons').get('sync'),
      package_uninstalled = require('nonicons').get('x'),
    },
  },
})

oil.nvim, fzf-lua, telescope.nvim — no configuration needed. These plugins read from nvim-web-devicons which nonicons.nvim wraps automatically.

nvim-tree:

local get = require('nonicons').get

require('nvim-tree').setup({
  renderer = {
    icons = {
      glyphs = {
        default = get('file'),
        symlink = get('file-symlink-file'),
        folder = {
          default = get('file-directory-fill'),
          open = get('file-directory-open-fill'),
          symlink = get('file-submodule'),
          empty = get('file-directory-outline'),
          arrow_open = get('chevron-down'),
          arrow_closed = get('chevron-right'),
        },
      },
    },
  },
})

Documentation

:help nonicons.nvim

Acknowledgements