From 5a9d88d892867606278418f1d34cd32d3eec9e91 Mon Sep 17 00:00:00 2001 From: Micah Halter Date: Fri, 5 Jul 2024 09:44:02 -0400 Subject: [PATCH] feat: add support for `mini.icons` --- README.md | 7 +++++-- lua/oil/columns.lua | 17 +++++------------ lua/oil/util.lua | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7fdb06ac..4e6a4b47 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,9 @@ https://user-images.githubusercontent.com/506791/209727111-6b4a11f4-634a-4efa-94 ## Requirements - Neovim 0.8+ -- (optional) [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) for file icons +- Icon provider plugin (optional) + - [mini.icons](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-icons.md) for file and folder icons + - [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) for file icons ## Installation @@ -34,7 +36,8 @@ oil.nvim supports all the usual plugin managers 'stevearc/oil.nvim', opts = {}, -- Optional dependencies - dependencies = { "nvim-tree/nvim-web-devicons" }, + dependencies = { "echasnovski/mini.icons" }, + -- dependencies = { "nvim-tree/nvim-web-devicons" }, -- use if prefer nvim-web-devicons } ``` diff --git a/lua/oil/columns.lua b/lua/oil/columns.lua index 453b4e76..31d451ff 100644 --- a/lua/oil/columns.lua +++ b/lua/oil/columns.lua @@ -1,7 +1,6 @@ local config = require("oil.config") local constants = require("oil.constants") local util = require("oil.util") -local has_devicons, devicons = pcall(require, "nvim-web-devicons") local M = {} local FIELD_NAME = constants.FIELD_NAME @@ -202,7 +201,8 @@ M.perform_change_action = function(adapter, action, callback) column.perform_action(action, callback) end -if has_devicons then +local icon_provider = util.get_icon_proivder() +if icon_provider then M.register("icon", { render = function(entry, conf) local field_type = entry[FIELD_TYPE] @@ -216,17 +216,10 @@ if has_devicons then field_type = meta.link_stat.type end end - local icon, hl - if field_type == "directory" then - icon = conf and conf.directory or "" - hl = "OilDirIcon" - else - if meta and meta.display_name then - name = meta.display_name - end - icon, hl = devicons.get_icon(name) - icon = icon or (conf and conf.default_file or "") + if meta and meta.display_name then + name = meta.display_name end + local icon, hl = icon_provider(field_type, name, conf) if not conf or conf.add_padding ~= false then icon = icon .. " " end diff --git a/lua/oil/util.lua b/lua/oil/util.lua index a1a95ab5..210a8988 100644 --- a/lua/oil/util.lua +++ b/lua/oil/util.lua @@ -8,6 +8,8 @@ local FIELD_NAME = constants.FIELD_NAME local FIELD_TYPE = constants.FIELD_TYPE local FIELD_META = constants.FIELD_META +---@alias oil.IconProvider fun(type: string, name: string, conf: table?): (icon: string, hl: string) + ---@param url string ---@return nil|string ---@return nil|string @@ -858,4 +860,30 @@ M.get_edit_path = function(bufnr, entry, callback) end end +--- Check for an icon provider and return a common icon provider API +---@return (oil.IconProvider)? +M.get_icon_proivder = function() + -- prefer mini.icons + local has_mini_icons, mini_icons = pcall(require, "mini.icons") + if has_mini_icons then + return function(type, name) + return mini_icons.get(type == "directory" and "directory" or "file", name) + end + end + + -- fallback to `nvim-web-devicons` + local has_devicons, devicons = pcall(require, "nvim-web-devicons") + if has_devicons then + return function(type, name, conf) + if type == "directory" then + return conf and conf.directory or "", "OilDirIcon" + else + local icon, hl = devicons.get_icon(name) + icon = icon or (conf and conf.default_file or "") + return icon, hl + end + end + end +end + return M