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:
parent
740b8fd425
commit
60e68967e5
4 changed files with 92 additions and 14 deletions
24
doc/oil.txt
24
doc/oil.txt
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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, " ")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue