diff --git a/doc/oil.txt b/doc/oil.txt index 62e547e..87d4bbb 100644 --- a/doc/oil.txt +++ b/doc/oil.txt @@ -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 diff --git a/lua/oil/init.lua b/lua/oil/init.lua index e8b8275..72d5538 100644 --- a/lua/oil/init.lua +++ b/lua/oil/init.lua @@ -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", diff --git a/lua/oil/view.lua b/lua/oil/view.lua index 6a5939d..74ab145 100644 --- a/lua/oil/view.lua +++ b/lua/oil/view.lua @@ -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 diff --git a/tests/parser_spec.lua b/tests/parser_spec.lua index 527e821..9884ca1 100644 --- a/tests/parser_spec.lua +++ b/tests/parser_spec.lua @@ -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, " ")