feat: highlight groups for hidden files (#459)

* feat: hidden highlights

* feat: OilHidden for hidden highlights instead of Comment

* fix: add the new combinatoric highlight groups

* perf: get rid of a call to is_hidden_file

* fix: tweak the default highlight group links

* fix: update function call in unit tests

---------

Co-authored-by: Steven Arcangeli <stevearc@stevearc.com>
This commit is contained in:
Ezekiel Warren 2024-11-22 08:55:55 -08:00 committed by GitHub
parent 740b8fd425
commit 60e68967e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 92 additions and 14 deletions

View file

@ -607,30 +607,54 @@ yank_entry *actions.yank_entr
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
HIGHLIGHTS *oil-highlights* HIGHLIGHTS *oil-highlights*
OilHidden *hl-OilHidden*
Hidden entry in an oil buffer
OilDir *hl-OilDir* OilDir *hl-OilDir*
Directory names in an oil buffer Directory names in an oil buffer
OilDirHidden *hl-OilDirHidden*
Hidden directory names in an oil buffer
OilDirIcon *hl-OilDirIcon* OilDirIcon *hl-OilDirIcon*
Icon for directories Icon for directories
OilSocket *hl-OilSocket* OilSocket *hl-OilSocket*
Socket files in an oil buffer Socket files in an oil buffer
OilSocketHidden *hl-OilSocketHidden*
Hidden socket files in an oil buffer
OilLink *hl-OilLink* OilLink *hl-OilLink*
Soft links in an oil buffer Soft links in an oil buffer
OilOrphanLink *hl-OilOrphanLink* OilOrphanLink *hl-OilOrphanLink*
Orphaned soft links in an oil buffer Orphaned soft links in an oil buffer
OilLinkHidden *hl-OilLinkHidden*
Hidden soft links in an oil buffer
OilOrphanLinkHidden *hl-OilOrphanLinkHidden*
Hidden orphaned soft links in an oil buffer
OilLinkTarget *hl-OilLinkTarget* OilLinkTarget *hl-OilLinkTarget*
The target of a soft link The target of a soft link
OilOrphanLinkTarget *hl-OilOrphanLinkTarget* OilOrphanLinkTarget *hl-OilOrphanLinkTarget*
The target of an orphaned soft link The target of an orphaned soft link
OilLinkTargetHidden *hl-OilLinkTargetHidden*
The target of a hidden soft link
OilOrphanLinkTargetHidden *hl-OilOrphanLinkTargetHidden*
The target of an hidden orphaned soft link
OilFile *hl-OilFile* OilFile *hl-OilFile*
Normal files in an oil buffer Normal files in an oil buffer
OilFileHidden *hl-OilFileHidden*
Hidden normal files in an oil buffer
OilCreate *hl-OilCreate* OilCreate *hl-OilCreate*
Create action in the oil preview window Create action in the oil preview window

View file

@ -796,11 +796,21 @@ end
---@private ---@private
M._get_highlights = function() M._get_highlights = function()
return { return {
{
name = "OilHidden",
link = "Comment",
desc = "Hidden entry in an oil buffer",
},
{ {
name = "OilDir", name = "OilDir",
link = "Directory", link = "Directory",
desc = "Directory names in an oil buffer", desc = "Directory names in an oil buffer",
}, },
{
name = "OilDirHidden",
link = "OilHidden",
desc = "Hidden directory names in an oil buffer",
},
{ {
name = "OilDirIcon", name = "OilDirIcon",
link = "OilDir", link = "OilDir",
@ -811,6 +821,11 @@ M._get_highlights = function()
link = "Keyword", link = "Keyword",
desc = "Socket files in an oil buffer", desc = "Socket files in an oil buffer",
}, },
{
name = "OilSocketHidden",
link = "OilHidden",
desc = "Hidden socket files in an oil buffer",
},
{ {
name = "OilLink", name = "OilLink",
link = nil, link = nil,
@ -821,6 +836,16 @@ M._get_highlights = function()
link = nil, link = nil,
desc = "Orphaned soft links in an oil buffer", desc = "Orphaned soft links in an oil buffer",
}, },
{
name = "OilLinkHidden",
link = "OilHidden",
desc = "Hidden soft links in an oil buffer",
},
{
name = "OilOrphanLinkHidden",
link = "OilLinkHidden",
desc = "Hidden orphaned soft links in an oil buffer",
},
{ {
name = "OilLinkTarget", name = "OilLinkTarget",
link = "Comment", link = "Comment",
@ -831,11 +856,26 @@ M._get_highlights = function()
link = "DiagnosticError", link = "DiagnosticError",
desc = "The target of an orphaned soft link", desc = "The target of an orphaned soft link",
}, },
{
name = "OilLinkTargetHidden",
link = "OilHidden",
desc = "The target of a hidden soft link",
},
{
name = "OilOrphanLinkTargetHidden",
link = "OilOrphanLinkTarget",
desc = "The target of an hidden orphaned soft link",
},
{ {
name = "OilFile", name = "OilFile",
link = nil, link = nil,
desc = "Normal files in an oil buffer", desc = "Normal files in an oil buffer",
}, },
{
name = "OilFileHidden",
link = "OilHidden",
desc = "Hidden normal files in an oil buffer",
},
{ {
name = "OilCreate", name = "OilCreate",
link = "DiagnosticInfo", link = "DiagnosticInfo",

View file

@ -19,10 +19,16 @@ local last_cursor_entry = {}
---@param name string ---@param name string
---@param bufnr integer ---@param bufnr integer
---@return boolean ---@return boolean display
---@return boolean is_hidden Whether the file is classified as a hidden file
M.should_display = function(name, bufnr) M.should_display = function(name, bufnr)
return not config.view_options.is_always_hidden(name, bufnr) if config.view_options.is_always_hidden(name, bufnr) then
and (config.view_options.show_hidden or not config.view_options.is_hidden_file(name, bufnr)) return false, true
else
local is_hidden = config.view_options.is_hidden_file(name, bufnr)
local display = config.view_options.show_hidden or not is_hidden
return display, is_hidden
end
end end
---@param bufname string ---@param bufname string
@ -633,13 +639,15 @@ local function render_buffer(bufnr, opts)
end end
if M.should_display("..", bufnr) then if M.should_display("..", bufnr) then
local cols = M.format_entry_cols({ 0, "..", "directory" }, column_defs, col_width, adapter) local cols =
M.format_entry_cols({ 0, "..", "directory" }, column_defs, col_width, adapter, true)
table.insert(line_table, cols) table.insert(line_table, cols)
end end
for _, entry in ipairs(entry_list) do for _, entry in ipairs(entry_list) do
if M.should_display(entry[FIELD_NAME], bufnr) then local should_display, is_hidden = M.should_display(entry[FIELD_NAME], bufnr)
local cols = M.format_entry_cols(entry, column_defs, col_width, adapter) if should_display then
local cols = M.format_entry_cols(entry, column_defs, col_width, adapter, is_hidden)
table.insert(line_table, cols) table.insert(line_table, cols)
local name = entry[FIELD_NAME] local name = entry[FIELD_NAME]
@ -688,10 +696,15 @@ end
---@param column_defs table[] ---@param column_defs table[]
---@param col_width integer[] ---@param col_width integer[]
---@param adapter oil.Adapter ---@param adapter oil.Adapter
---@param is_hidden boolean
---@return oil.TextChunk[] ---@return oil.TextChunk[]
M.format_entry_cols = function(entry, column_defs, col_width, adapter) M.format_entry_cols = function(entry, column_defs, col_width, adapter, is_hidden)
local name = entry[FIELD_NAME] local name = entry[FIELD_NAME]
local meta = entry[FIELD_META] local meta = entry[FIELD_META]
local hl_suffix = ""
if is_hidden then
hl_suffix = "Hidden"
end
if meta and meta.display_name then if meta and meta.display_name then
name = meta.display_name name = meta.display_name
end end
@ -711,9 +724,9 @@ M.format_entry_cols = function(entry, column_defs, col_width, adapter)
-- Always add the entry name at the end -- Always add the entry name at the end
local entry_type = entry[FIELD_TYPE] local entry_type = entry[FIELD_TYPE]
if entry_type == "directory" then if entry_type == "directory" then
table.insert(cols, { name .. "/", "OilDir" }) table.insert(cols, { name .. "/", "OilDir" .. hl_suffix })
elseif entry_type == "socket" then elseif entry_type == "socket" then
table.insert(cols, { name, "OilSocket" }) table.insert(cols, { name, "OilSocket" .. hl_suffix })
elseif entry_type == "link" then elseif entry_type == "link" then
local link_text local link_text
if meta then if meta then
@ -722,7 +735,7 @@ M.format_entry_cols = function(entry, column_defs, col_width, adapter)
end end
if meta.link then if meta.link then
link_text = "->" .. " " .. meta.link link_text = "-> " .. meta.link
if meta.link_stat and meta.link_stat.type == "directory" then if meta.link_stat and meta.link_stat.type == "directory" then
link_text = util.addslash(link_text) link_text = util.addslash(link_text)
end end
@ -730,12 +743,13 @@ M.format_entry_cols = function(entry, column_defs, col_width, adapter)
end end
local is_orphan = not (meta and meta.link_stat) local is_orphan = not (meta and meta.link_stat)
table.insert(cols, { name, is_orphan and "OilOrphanLink" or "OilLink" }) table.insert(cols, { name, (is_orphan and "OilOrphanLink" or "OilLink") .. hl_suffix })
if link_text then if link_text then
table.insert(cols, { link_text, is_orphan and "OilOrphanLinkTarget" or "OilLinkTarget" }) local target_hl = (is_orphan and "OilOrphanLinkTarget" or "OilLinkTarget") .. hl_suffix
table.insert(cols, { link_text, target_hl })
end end
else else
table.insert(cols, { name, "OilFile" }) table.insert(cols, { name, "OilFile" .. hl_suffix })
end end
return cols return cols
end end

View file

@ -90,7 +90,7 @@ describe("parser", function()
local file = test_adapter.test_set("/foo/a.txt", "file") local file = test_adapter.test_set("/foo/a.txt", "file")
vim.cmd.edit({ args = { "oil-test:///foo/" } }) vim.cmd.edit({ args = { "oil-test:///foo/" } })
local bufnr = vim.api.nvim_get_current_buf() local bufnr = vim.api.nvim_get_current_buf()
local cols = view.format_entry_cols(file, {}, {}, test_adapter) local cols = view.format_entry_cols(file, {}, {}, test_adapter, false)
local lines = util.render_table({ cols }, {}) local lines = util.render_table({ cols }, {})
table.insert(lines, "") table.insert(lines, "")
table.insert(lines, " ") table.insert(lines, " ")