Skip to content

Commit ca931b8

Browse files
committed
feat(icons): Add support for highlight groups in icons in Vim
1 parent 0e820f1 commit ca931b8

File tree

4 files changed

+38
-13
lines changed

4 files changed

+38
-13
lines changed

.editorconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[*]
2+
indent_style = space
3+
indent_size = 2
4+
tab_width = 2

.gitignore

Lines changed: 0 additions & 1 deletion
This file was deleted.

autoload/dirvish.vim

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -446,29 +446,36 @@ func! s:apply_icons() abort
446446
for f in getline(1, '$')
447447
let i += 1
448448
for id in sort(keys(s:cb_map))
449-
let l:icon = s:cb_map[id](f)
450-
if type(l:icon) == v:t_string
451-
if -1 != match(l:icon, '\S')
449+
let icon = s:cb_map[id](f)
450+
if type(icon) == type('')
451+
if -1 != match(icon, '\S')
452+
unlet icon
452453
break
453454
endif
454455
endif
455456
endfor
456457
if exists('l:icon')
457458
if s:virttext_feat ==# 'extmark'
458-
let l:virt_text = type(l:icon) == v:t_dict ? [[l:icon.icon, l:icon.hl]] : [[l:icon, 'DirvishColumnHead']]
459+
let l:virt_text = type(icon) == type({}) ? [[icon.icon, icon.hl]] : [[icon, 'DirvishColumnHead']]
459460
call nvim_buf_set_extmark(0, s:ns_id, i-1, 0, #{virt_text: l:virt_text, virt_text_pos: 'inline'})
460461
elseif s:virttext_feat ==# 'textprop'
461-
if type(l:icon) == v:t_string
462-
call prop_add(i, 1, #{type: s:prop_type, text: l:icon})
462+
if type(icon) == type('')
463+
call prop_add(i, 1, #{type: s:prop_type, text: icon})
464+
else
465+
let l:prop_type = prop_type_get('dirvish.'.icon.hl, {})
466+
if l:prop_type == {}
467+
call prop_type_add('dirvish.'.icon.hl, #{highlight: icon.hl})
468+
endif
469+
call prop_add(i, 1, #{type: 'dirvish.'.icon.hl, text: icon.icon})
463470
endif
464471
else
465472
let isdir = (f[-1:] == s:sep)
466473
let f = substitute(s:f(f), escape(s:sep,'\').'$', '', 'g') " Full path, trim slash.
467474
let tail_esc = escape(fnamemodify(f,':t').(isdir?(s:sep):''), '[,*.^$~\')
468-
exe 'syntax match DirvishColumnHead =\%'.i.'l^.\{-}\ze'.tail_esc.'$= conceal cchar='.l:icon
475+
exe 'syntax match DirvishColumnHead =\%'.i.'l^.\{-}\ze'.tail_esc.'$= conceal cchar='.icon
469476
endif
477+
unlet icon
470478
endif
471-
unlet l:icon
472479
endfor
473480
endf
474481

doc/dirvish.txt

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,27 @@ dirvish#add_icon_fn(fn)
114114
a given path, wins. Best practice: if you don't have anything meaningful
115115
to show for a given path, return empty string (or whitespace).
116116

117-
{fn} is any |Funcref| that takes a path (string) and returns a string
118-
(the "icon"). Example: >vim
117+
{fn} is any |Funcref| that takes a path (string) and returns an `icon-item` as
118+
a |string| or a |dict| with the following keys:
119+
- "icon" (|string|): the string representing the icon.
120+
- "hl" (|string|): the highlight group to use for the icon.
121+
122+
Note: If your Vim isn't Vim 9.1+ with |+textprop| or Nvim 0.8+, `icon-item`
123+
can only be a character.
124+
125+
Example that returns a string: >vim
119126
call dirvish#add_icon_fn({p -> p[-1:]=='/'?'📂':'📄'})
120127
<
121-
Note: multi-character icons are only supported on Nvim 0.8+ or Vim 9.1+
122-
with |+textprop|.
128+
Example that uses |mini.icons| <https://github.com/echasnovski/mini.icons>
129+
0.15.0 as icon provider >lua
130+
--- NOTE: mini.icons must be loaded before vim-dirvish
131+
vim.fn['dirvish#add_icon_fn'](function(p)
132+
local get = require('mini.icons').get
133+
local icon, hl = get(p:sub(-1) == '/' and 'directory' or 'file', p)
134+
icon = icon .. ' '
135+
return { icon = icon, hl = hl }
136+
end)
137+
<
123138

124139
*dirvish#remove_icon_fn()*
125140
dirvish#remove_icon_fn(fn_id)

0 commit comments

Comments
 (0)