From 2ba4a51eb36febd864735b7b25ac2bd1d1f7cf08 Mon Sep 17 00:00:00 2001 From: Mike Roelens Date: Fri, 23 Feb 2024 11:19:07 -0500 Subject: [PATCH] feat: support multi-part extensions for file icons --- lua/fzf-lua/make_entry.lua | 31 ++++++++++++++++++++++++++----- lua/fzf-lua/providers/buffers.lua | 6 ++---- lua/fzf-lua/providers/nvim.lua | 3 +-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lua/fzf-lua/make_entry.lua b/lua/fzf-lua/make_entry.lua index c2447ab2..bec51d01 100644 --- a/lua/fzf-lua/make_entry.lua +++ b/lua/fzf-lua/make_entry.lua @@ -5,6 +5,24 @@ local utils = require "fzf-lua.utils" local libuv = require "fzf-lua.libuv" local config = nil +-- Supports multi-part extensions +-- e.g. +-- "file.js" -> "js" +-- "file.test.js" -> "test.js" +-- "file.spec.js" -> "spec.js" +local function get_extension_from_file_name(file_name) + local name, extension = file_name:match("(.+)%.(.+)$") + + if name and extension then + local preExtension = name:match(".+%.(.+)$") + if preExtension then + return (preExtension .. "." .. extension):lower() + else + return extension:lower() + end + end +end + -- attempt to load the current config -- should fail if we're running headless do @@ -206,17 +224,21 @@ if not config then config = _config end -M.get_devicon = function(file, ext) +-- by default the extension will be derived from `file`, but you can +-- override it by passing `extensionOverride` +M.get_devicon = function(file, extensionOverride) + local ext = extensionOverride or get_extension_from_file_name(file) + local icon, hl if path.ends_with_separator(file) then icon, hl = M.__DIR_ICON, M.__DIR_ICON_HL elseif M._devicons then - icon, hl = M._devicons.get_icon(file, ext:lower(), { default = true }) + icon, hl = M._devicons.get_icon(file, ext, { default = true }) elseif M._devicons_map then -- Lookup first by name, then by ext (devicons `strict=true`) -- "" is added by fzf-lua and is thus guaranteed local info = M._devicons_map[file:lower()] - or M._devicons_map[ext:lower()] + or M._devicons_map[ext] or M._devicons_map[""] icon, hl = info.icon, "DevIcon" .. info.name else @@ -521,8 +543,7 @@ M.file = function(x, opts) end if opts.file_icons then local filename = path.tail(origpath) - local ext = path.extension(filename) - icon, hl = M.get_devicon(filename, ext) + icon, hl = M.get_devicon(filename) if opts.color_icons then -- extra workaround for issue #119 (or similars) -- use default if we can't find the highlight ansi diff --git a/lua/fzf-lua/providers/buffers.lua b/lua/fzf-lua/providers/buffers.lua index 90c5013b..0ed3b8f7 100644 --- a/lua/fzf-lua/providers/buffers.lua +++ b/lua/fzf-lua/providers/buffers.lua @@ -147,8 +147,7 @@ local function gen_buffer_entry(opts, buf, max_bufnr, cwd) buficon, hl = make_entry.get_devicon(buf.info.name, "sh") else local filename = path.tail(buf.info.name) - local extension = path.extension(filename) - buficon, hl = make_entry.get_devicon(filename, extension) + buficon, hl = make_entry.get_devicon(filename) end if opts.color_icons then -- fallback to "grey" color (#817) @@ -260,8 +259,7 @@ M.buffer_lines = function(opts) bufname = path.basename(filepath) if opts.file_icons then local filename = path.tail(bufname) - local extension = path.extension(filename) - buficon, hl = make_entry.get_devicon(filename, extension) + buficon, hl = make_entry.get_devicon(filename) if opts.color_icons then buficon = utils.ansi_codes[hl](buficon) end diff --git a/lua/fzf-lua/providers/nvim.lua b/lua/fzf-lua/providers/nvim.lua index 5e951ba9..73b45837 100644 --- a/lua/fzf-lua/providers/nvim.lua +++ b/lua/fzf-lua/providers/nvim.lua @@ -164,8 +164,7 @@ M.tagstack = function(opts) local buficon, hl if opts.file_icons then local filename = path.tail(bufname) - local extension = path.extension(filename) - buficon, hl = make_entry.get_devicon(filename, extension) + buficon, hl = make_entry.get_devicon(filename) if opts.color_icons then buficon = utils.ansi_codes[hl](buficon) end