fun! HiList() redir => a | sil hi | redir end let a=substitute(a, '\n\s\+', ' ', 'g') let b=split(a,'\n') call map(b, 'split(v:val, ''\s\+'')[0]') if exists("g:items") unlet g:items endif let g:items=[] for val in b call add(g:items, Hi(val)) endfor endfun fun! Hi(...) let s:attr = {} let s:attr1 = {'bold' : 0, 'italic': 0, 'reverse': 0, 'inverse': 0, 'underline': 0, 'undercurl': 0 , 'standout':0} let s:query = ['fg', 'bg', 'sp', 'bold', 'italic', 'reverse', 'underline', 'undercurl', 'standout', 'font'] for key in s:query for mode in ['term', 'cterm', 'gui'] if !empty(synIDattr(synIDtrans(hlID(a:1)), key, mode)) if key =~ 'fg\|bg' || (key=='sp' && mode=='gui') let s:attr[mode . key]=synIDattr(synIDtrans(hlID(a:1)), key, mode) elseif key=='font' && mode=='gui' let s:attr[key]=synIDattr(synIDtrans(hlID(a:1)), key, mode) else let s:attr1[mode . key] = synIDattr(synIDtrans(hlID(a:1)), key, mode) endif endif endfor endfor if has("gui_running") let cmode='gui' else let cmode='cterm' endif for mode in ['term', 'cterm', 'gui'] if get(s:attr1, mode . 'italic') || \ get(s:attr1, mode . 'bold') || \ get(s:attr1, mode . 'reverse') || \ get(s:attr1, mode . 'underline') || \ get(s:attr1, mode . 'standout') || \ get(s:attr1, mode . 'undercurl') let s:attr[mode] = get(s:attr1, mode . 'italic', '') ? 'italic,' : '' let s:attr[mode] .= get(s:attr1, mode . 'bold', '') ? 'bold,' : '' let s:attr[mode] .= get(s:attr1, mode . 'reverse', '') ? 'reverse,' : '' let s:attr[mode] .= get(s:attr1, mode . 'underline', '') ? 'underline,' : '' let s:attr[mode] .= get(s:attr1, mode . 'standout', '') ? 'standout,' : '' let s:attr[mode] .= get(s:attr1, mode . 'undercurl', '') ? 'undercurl' : '' endif endfor let out='hi ' . a:1 for item in items(s:attr) "if item[1] >=0 let out .= printf(" %s=%s", item[0], item[1]) "endif endfor let out=substitute(out, ',\(\s\|$\)', ' ' , 'g') if len(split(out, '\s\+')) == 2 let out=substitute(out, '^hi', '& clear', '') endif " echo out return out endfun fun! SortLines() " %s/^hi //ge " %s/\s\+xxx//ge "sort let lines=getline(1,'$') let i=1 for line in lines let word=split(line, '\s\+') let sort=[ word[0] ] + sort(word[1:]) call setline(i, join(sort)) let i+=1 endfor endfun "com! -nargs=1 -complete=highlight HI :call Hi() "com! HIList :call HiList() "com! CleanUp :call SortLines()