From 07ae3a8dc3a31c2eed3dc9b46ac2feffce10b499 Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Sun, 22 Feb 2026 20:58:22 -0500 Subject: [PATCH] feat(icons): add nonicons.nvim icon provider support (#30) * feat(icons): add nonicons.nvim icon provider support Problem: oil.nvim only recognizes mini.icons and nvim-web-devicons as icon providers. nonicons.nvim works when paired with devicons (via its apply() monkey-patch), but has no standalone support. Solution: add a nonicons.nvim fallback in get_icon_provider(), placed after devicons so the patched devicons path is preferred when both are installed. The standalone path handles directories via nonicons.get('file-directory'), files via filetype/extension lookup with a generic file icon fallback. * fix(doc): improve readme phrasing --- README.md | 8 ++++---- lua/oil/util.lua | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1973a0e..5cdda64 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,10 @@ https://user-images.githubusercontent.com/506791/209727111-6b4a11f4-634a-4efa-94 ## Requirements - Neovim 0.10+ -- Optional: - [mini.icons](https://github.com/nvim-mini/mini.nvim/blob/main/readmes/mini-icons.md) - or [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) for - file icons +- (Optionally) any of the following icon providers: + - [mini.icons](https://github.com/nvim-mini/mini.nvim/blob/main/readmes/mini-icons.md) + - [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) + - [nonicons.nvim](https://github.com/barrettruth/nonicons.nvim) ## Installation diff --git a/lua/oil/util.lua b/lua/oil/util.lua index d9bca22..cd94729 100644 --- a/lua/oil/util.lua +++ b/lua/oil/util.lua @@ -945,7 +945,32 @@ M.get_icon_provider = function() end end - -- fallback to `nvim-web-devicons` + local has_nonicons, nonicons = pcall(require, 'nonicons') + if has_nonicons and type(nonicons.get) == 'function' then + return function(type, name, conf, ft) + if type == 'directory' then + local icon = nonicons.get('file-directory') + return icon or (conf and conf.directory or ''), 'OilDirIcon' + else + if ft then + local ft_icon = nonicons.get(ft) + if ft_icon then + return ft_icon, 'OilFileIcon' + end + end + local ext = name:match('%.([^%.]+)$') + if ext then + local ext_icon = nonicons.get(ext) + if ext_icon then + return ext_icon, 'OilFileIcon' + end + end + local icon = nonicons.get('file') + return icon or (conf and conf.default_file or ''), 'OilFileIcon' + end + end + end + local has_devicons, devicons = pcall(require, 'nvim-web-devicons') if has_devicons then return function(type, name, conf, ft)