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*
OilHidden *hl-OilHidden*
Hidden entry in an oil buffer
OilDir *hl-OilDir*
Directory names in an oil buffer
OilDirHidden *hl-OilDirHidden*
Hidden directory names in an oil buffer
OilDirIcon *hl-OilDirIcon*
Icon for directories
OilSocket *hl-OilSocket*
Socket files in an oil buffer
OilSocketHidden *hl-OilSocketHidden*
Hidden socket files in an oil buffer
OilLink *hl-OilLink*
Soft links in an oil buffer
OilOrphanLink *hl-OilOrphanLink*
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*
The target of a soft link
OilOrphanLinkTarget *hl-OilOrphanLinkTarget*
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*
Normal files in an oil buffer
OilFileHidden *hl-OilFileHidden*
Hidden normal files in an oil buffer
OilCreate *hl-OilCreate*
Create action in the oil preview window

View file

@ -796,11 +796,21 @@ end
---@private
M._get_highlights = function()
return {
{
name = "OilHidden",
link = "Comment",
desc = "Hidden entry in an oil buffer",
},
{
name = "OilDir",
link = "Directory",
desc = "Directory names in an oil buffer",
},
{
name = "OilDirHidden",
link = "OilHidden",
desc = "Hidden directory names in an oil buffer",
},
{
name = "OilDirIcon",
link = "OilDir",
@ -811,6 +821,11 @@ M._get_highlights = function()
link = "Keyword",
desc = "Socket files in an oil buffer",
},
{
name = "OilSocketHidden",
link = "OilHidden",
desc = "Hidden socket files in an oil buffer",
},
{
name = "OilLink",
link = nil,
@ -821,6 +836,16 @@ M._get_highlights = function()
link = nil,
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",
link = "Comment",
@ -831,11 +856,26 @@ M._get_highlights = function()
link = "DiagnosticError",
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",
link = nil,
desc = "Normal files in an oil buffer",
},
{
name = "OilFileHidden",
link = "OilHidden",
desc = "Hidden normal files in an oil buffer",
},
{
name = "OilCreate",
link = "DiagnosticInfo",

View file

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

View file

@ -90,7 +90,7 @@ describe("parser", function()
local file = test_adapter.test_set("/foo/a.txt", "file")
vim.cmd.edit({ args = { "oil-test:///foo/" } })
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 }, {})
table.insert(lines, "")
table.insert(lines, " ")