neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

dircolors.vim (7136B)


      1 " Vim syntax file
      2 " Language:        dircolors(1) input file
      3 " Maintainer:      Jan Larres <jan@majutsushi.net>
      4 " Previous Maintainer: Nikolai Weibull <now@bitwi.se>
      5 " Latest Revision: 2018-02-19
      6 
      7 if exists("b:current_syntax")
      8    finish
      9 endif
     10 
     11 let s:cpo_save = &cpo
     12 set cpo&vim
     13 
     14 syntax keyword dircolorsTodo    FIXME TODO XXX NOTE contained
     15 
     16 syntax region  dircolorsComment start='#' end='$' contains=dircolorsTodo,@Spell
     17 
     18 syntax keyword dircolorsKeyword TERM LEFT LEFTCODE RIGHT RIGHTCODE END ENDCODE
     19 
     20 syntax keyword dircolorsKeyword NORMAL NORM FILE RESET DIR LNK LINK SYMLINK
     21                              \ MULTIHARDLINK FIFO SOCK DOOR BLK CHR ORPHAN
     22                              \ MISSING PIPE BLOCK CHR EXEC SETUID SETGID
     23                              \ CAPABILITY STICKY_OTHER_WRITABLE
     24                              \ OTHER_WRITABLE STICKY
     25 
     26 " Slackware only, ignored by GNU dircolors.
     27 syntax keyword dircolorsKeyword COLOR OPTIONS EIGHTBIT
     28 
     29 syntax match dircolorsExtension '^\s*\zs[.*]\S\+'
     30 
     31 syntax match dircolorsEscape '\\[abefnrtv?_\\^#]'
     32 syntax match dircolorsEscape '\\[0-9]\{3}'
     33 syntax match dircolorsEscape '\\x[0-9a-f]\{3}'
     34 
     35 if !(has('gui_running') || &termguicolors) && &t_Co == ''
     36    syntax match dircolorsNumber '\<\d\+\>'
     37    highlight default link dircolorsNumber Number
     38 endif
     39 
     40 highlight default link dircolorsTodo      Todo
     41 highlight default link dircolorsComment   Comment
     42 highlight default link dircolorsKeyword   Keyword
     43 highlight default link dircolorsExtension Identifier
     44 highlight default link dircolorsEscape    Special
     45 
     46 function! s:set_guicolors() abort
     47    let s:termguicolors = {}
     48 
     49    let s:termguicolors[0]  = "Black"
     50    let s:termguicolors[1]  = "DarkRed"
     51    let s:termguicolors[2]  = "DarkGreen"
     52    let s:termguicolors[3]  = "DarkYellow"
     53    let s:termguicolors[4]  = "DarkBlue"
     54    let s:termguicolors[5]  = "DarkMagenta"
     55    let s:termguicolors[6]  = "DarkCyan"
     56    let s:termguicolors[7]  = "Gray"
     57    let s:termguicolors[8]  = "DarkGray"
     58    let s:termguicolors[9]  = "Red"
     59    let s:termguicolors[10] = "Green"
     60    let s:termguicolors[11] = "Yellow"
     61    let s:termguicolors[12] = "Blue"
     62    let s:termguicolors[13] = "Magenta"
     63    let s:termguicolors[14] = "Cyan"
     64    let s:termguicolors[15] = "White"
     65 
     66    let xterm_palette = ["00", "5f", "87", "af", "d7", "ff"]
     67 
     68    let cur_col = 16
     69 
     70    for r in xterm_palette
     71        for g in xterm_palette
     72            for b in xterm_palette
     73                let s:termguicolors[cur_col] = '#' . r . g . b
     74                let cur_col += 1
     75            endfor
     76        endfor
     77    endfor
     78 
     79    for i in range(24)
     80        let g = i * 0xa + 8
     81        let s:termguicolors[i + 232] = '#' . g . g . g
     82    endfor
     83 endfunction
     84 
     85 function! s:get_hi_str(color, place) abort
     86    if a:color >= 0 && a:color <= 255
     87        if has('gui_running') || &termguicolors
     88            if ! exists("s:termguicolors")
     89              call s:set_guicolors()
     90            endif
     91            return ' gui' . a:place . '=' . s:termguicolors[a:color]
     92        elseif a:color <= 7 || &t_Co == 256 || &t_Co == 88
     93            return ' cterm' . a:place . '=' . a:color
     94        endif
     95    endif
     96    return ''
     97 endfunction
     98 
     99 function! s:get_256color(colors) abort
    100    if len(a:colors) >= 2 " May be fewer while editing
    101        let [_five, color] = remove(a:colors, 0, 1)
    102        if _five != '5' || color == ''
    103            return -1
    104        else
    105            return str2nr(color)
    106        endif
    107    else
    108        return -1
    109    endif
    110 endfunction
    111 
    112 function! s:preview_color(linenr) abort
    113    let line = getline(a:linenr)
    114    let defline = matchlist(line, '^\v([A-Z_]+|[*.]\S+)\s+([0-9;]+)')
    115    if empty(defline)
    116        return
    117    endif
    118 
    119    let colordef = defline[2]
    120 
    121    let colors = split(colordef, ';')
    122 
    123    let hi_str = ''
    124    let hi_attrs = []
    125    while len(colors) > 0
    126        let item = str2nr(remove(colors, 0))
    127        if item == 1
    128            call add(hi_attrs, 'bold')
    129        elseif item == 3
    130            call add(hi_attrs, 'italic')
    131        elseif item == 4
    132            call add(hi_attrs, 'underline')
    133        elseif item == 7
    134            call add(hi_attrs, 'inverse')
    135        elseif item >= 30 && item <= 37
    136            " ANSI SGR foreground color
    137            let hi_str .= s:get_hi_str(item - 30, 'fg')
    138        elseif item >= 40 && item <= 47
    139            " ANSI SGR background color
    140            let hi_str .= s:get_hi_str(item - 40, 'bg')
    141        elseif item >= 90 && item <= 97
    142            " ANSI SGR+8 foreground color (xterm 16-color support)
    143            let hi_str .= s:get_hi_str(item - 82, 'fg')
    144        elseif item >= 100 && item <= 107
    145            " ANSI SGR+8 background color (xterm 16-color support)
    146            let hi_str .= s:get_hi_str(item - 92, 'bg')
    147        elseif item == 38
    148            " Foreground for terminals with 88/256 color support
    149            let color = s:get_256color(colors)
    150            if color == -1
    151                break
    152            endif
    153            let hi_str .= s:get_hi_str(color, 'fg')
    154        elseif item == 48
    155            " Background for terminals with 88/256 color support
    156            let color = s:get_256color(colors)
    157            if color == -1
    158                break
    159            endif
    160            let hi_str .= s:get_hi_str(color, 'bg')
    161        endif
    162    endwhile
    163 
    164    if hi_str == '' && empty(hi_attrs)
    165        return
    166    endif
    167 
    168    " Check whether we have already defined this color
    169    redir => s:currentmatch
    170    silent! execute 'syntax list'
    171    redir END
    172 
    173    if s:currentmatch !~# '\/\\_s\\zs' . colordef . '\\ze\\_s\/'
    174        " Append the buffer number to avoid problems with other dircolors
    175        " buffers interfering
    176        let bufnr = bufnr('%')
    177        execute 'syntax match dircolorsColor' . b:dc_next_index . '_' . bufnr .
    178              \ ' "\_s\zs' . colordef . '\ze\_s"'
    179        let hi_attrs_str = ''
    180        if !empty(hi_attrs)
    181            if has('gui_running') || &termguicolors
    182                let hi_attrs_str = ' gui=' . join(hi_attrs, ',')
    183            else
    184                let hi_attrs_str = ' cterm=' . join(hi_attrs, ',')
    185            endif
    186        endif
    187        execute 'highlight default dircolorsColor' . b:dc_next_index . '_' .
    188              \ bufnr . hi_str . hi_attrs_str
    189        let b:dc_next_index += 1
    190    endif
    191 endfunction
    192 
    193 " Avoid accumulating too many definitions while editing
    194 function! s:reset_colors() abort
    195    if b:dc_next_index > 0
    196        let bufnr = bufnr('%')
    197        for i in range(b:dc_next_index)
    198            execute 'syntax clear dircolorsColor' . i . '_' . bufnr
    199            execute 'highlight clear dircolorsColor' . i . '_' . bufnr
    200        endfor
    201        let b:dc_next_index = 0
    202    endif
    203 
    204    for linenr in range(1, line('$'))
    205        call s:preview_color(linenr)
    206    endfor
    207 endfunction
    208 
    209 let b:dc_next_index = 0
    210 
    211 if has('gui_running') || &termguicolors
    212    call s:set_guicolors()
    213 endif
    214 
    215 if has('gui_running') || &termguicolors || &t_Co != ''
    216    call s:reset_colors()
    217 
    218    autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
    219    autocmd CursorHold,CursorHoldI   <buffer> call s:reset_colors()
    220 endif
    221 
    222 let b:current_syntax = "dircolors"
    223 
    224 let &cpo = s:cpo_save
    225 unlet s:cpo_save