xref: /vim-8.2.3635/runtime/syntax/dircolors.vim (revision 22f1d0e3)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:        dircolors(1) input file
3baca7f70SBram Moolenaar" Maintainer:      Jan Larres <[email protected]>
4baca7f70SBram Moolenaar" Previous Maintainer: Nikolai Weibull <[email protected]>
5*22f1d0e3SBram Moolenaar" Latest Revision: 2018-02-19
6071d4279SBram Moolenaar
742eeac35SBram Moolenaarif exists("b:current_syntax")
8071d4279SBram Moolenaar    finish
9071d4279SBram Moolenaarendif
10071d4279SBram Moolenaar
1142eeac35SBram Moolenaarlet s:cpo_save = &cpo
1242eeac35SBram Moolenaarset cpo&vim
1342eeac35SBram Moolenaar
14baca7f70SBram Moolenaarsyntax keyword dircolorsTodo    FIXME TODO XXX NOTE contained
15071d4279SBram Moolenaar
16baca7f70SBram Moolenaarsyntax region  dircolorsComment start='#' end='$' contains=dircolorsTodo,@Spell
17071d4279SBram Moolenaar
18baca7f70SBram Moolenaarsyntax keyword dircolorsKeyword TERM LEFT LEFTCODE RIGHT RIGHTCODE END ENDCODE
19071d4279SBram Moolenaar
20baca7f70SBram Moolenaarsyntax keyword dircolorsKeyword NORMAL NORM FILE RESET DIR LNK LINK SYMLINK
21baca7f70SBram Moolenaar                              \ MULTIHARDLINK FIFO SOCK DOOR BLK CHR ORPHAN
22baca7f70SBram Moolenaar                              \ MISSING PIPE BLOCK CHR EXEC SETUID SETGID
23baca7f70SBram Moolenaar                              \ CAPABILITY STICKY_OTHER_WRITABLE
24baca7f70SBram Moolenaar                              \ OTHER_WRITABLE STICKY
2542eeac35SBram Moolenaar
26baca7f70SBram Moolenaar" Slackware only, ignored by GNU dircolors.
27baca7f70SBram Moolenaarsyntax keyword dircolorsKeyword COLOR OPTIONS EIGHTBIT
28baca7f70SBram Moolenaar
29baca7f70SBram Moolenaarsyntax match dircolorsExtension '^\s*\zs[.*]\S\+'
30baca7f70SBram Moolenaar
31baca7f70SBram Moolenaarsyntax match dircolorsEscape '\\[abefnrtv?_\\^#]'
32baca7f70SBram Moolenaarsyntax match dircolorsEscape '\\[0-9]\{3}'
33baca7f70SBram Moolenaarsyntax match dircolorsEscape '\\x[0-9a-f]\{3}'
34baca7f70SBram Moolenaar
35baca7f70SBram Moolenaarif !has('gui_running') && &t_Co == ''
36baca7f70SBram Moolenaar    syntax match dircolorsNumber '\<\d\+\>'
37baca7f70SBram Moolenaar    highlight default link dircolorsNumber Number
38071d4279SBram Moolenaarendif
39071d4279SBram Moolenaar
40baca7f70SBram Moolenaarhighlight default link dircolorsTodo      Todo
41baca7f70SBram Moolenaarhighlight default link dircolorsComment   Comment
42baca7f70SBram Moolenaarhighlight default link dircolorsKeyword   Keyword
43baca7f70SBram Moolenaarhighlight default link dircolorsExtension Identifier
44baca7f70SBram Moolenaarhighlight default link dircolorsEscape    Special
45b8017e7aSBram Moolenaar
46baca7f70SBram Moolenaarfunction! s:set_guicolors() abort
4761be73bbSBram Moolenaar    let s:termguicolors = {}
48071d4279SBram Moolenaar
4961be73bbSBram Moolenaar    let s:termguicolors[0]  = "Black"
5061be73bbSBram Moolenaar    let s:termguicolors[1]  = "DarkRed"
5161be73bbSBram Moolenaar    let s:termguicolors[2]  = "DarkGreen"
5261be73bbSBram Moolenaar    let s:termguicolors[3]  = "DarkYellow"
5361be73bbSBram Moolenaar    let s:termguicolors[4]  = "DarkBlue"
5461be73bbSBram Moolenaar    let s:termguicolors[5]  = "DarkMagenta"
5561be73bbSBram Moolenaar    let s:termguicolors[6]  = "DarkCyan"
5661be73bbSBram Moolenaar    let s:termguicolors[7]  = "Gray"
5761be73bbSBram Moolenaar    let s:termguicolors[8]  = "DarkGray"
5861be73bbSBram Moolenaar    let s:termguicolors[9]  = "Red"
5961be73bbSBram Moolenaar    let s:termguicolors[10] = "Green"
6061be73bbSBram Moolenaar    let s:termguicolors[11] = "Yellow"
6161be73bbSBram Moolenaar    let s:termguicolors[12] = "Blue"
6261be73bbSBram Moolenaar    let s:termguicolors[13] = "Magenta"
6361be73bbSBram Moolenaar    let s:termguicolors[14] = "Cyan"
6461be73bbSBram Moolenaar    let s:termguicolors[15] = "White"
65071d4279SBram Moolenaar
66baca7f70SBram Moolenaar    let xterm_palette = ["00", "5f", "87", "af", "d7", "ff"]
6742eeac35SBram Moolenaar
68baca7f70SBram Moolenaar    let cur_col = 16
69baca7f70SBram Moolenaar
70baca7f70SBram Moolenaar    for r in xterm_palette
71baca7f70SBram Moolenaar        for g in xterm_palette
72baca7f70SBram Moolenaar            for b in xterm_palette
7361be73bbSBram Moolenaar                let s:termguicolors[cur_col] = '#' . r . g . b
74baca7f70SBram Moolenaar                let cur_col += 1
75baca7f70SBram Moolenaar            endfor
76baca7f70SBram Moolenaar        endfor
77baca7f70SBram Moolenaar    endfor
78baca7f70SBram Moolenaar
79baca7f70SBram Moolenaar    for i in range(24)
80baca7f70SBram Moolenaar        let g = i * 0xa + 8
8161be73bbSBram Moolenaar        let s:termguicolors[i + 232] = '#' . g . g . g
82baca7f70SBram Moolenaar    endfor
83baca7f70SBram Moolenaarendfunction
84baca7f70SBram Moolenaar
85baca7f70SBram Moolenaarfunction! s:get_hi_str(color, place) abort
86baca7f70SBram Moolenaar    if a:color >= 0 && a:color <= 255
87baca7f70SBram Moolenaar        if has('gui_running')
8861be73bbSBram Moolenaar            return ' gui' . a:place . '=' . s:termguicolors[a:color]
89baca7f70SBram Moolenaar        elseif a:color <= 7 || &t_Co == 256 || &t_Co == 88
90baca7f70SBram Moolenaar            return ' cterm' . a:place . '=' . a:color
91baca7f70SBram Moolenaar        endif
92baca7f70SBram Moolenaar    endif
93baca7f70SBram Moolenaar    return ''
94baca7f70SBram Moolenaarendfunction
95baca7f70SBram Moolenaar
96baca7f70SBram Moolenaarfunction! s:get_256color(colors) abort
97baca7f70SBram Moolenaar    if len(a:colors) >= 2 " May be fewer while editing
98baca7f70SBram Moolenaar        let [_five, color] = remove(a:colors, 0, 1)
99baca7f70SBram Moolenaar        if _five != '5' || color == ''
100baca7f70SBram Moolenaar            return -1
101071d4279SBram Moolenaar        else
102baca7f70SBram Moolenaar            return str2nr(color)
103baca7f70SBram Moolenaar        endif
104baca7f70SBram Moolenaar    else
105baca7f70SBram Moolenaar        return -1
106baca7f70SBram Moolenaar    endif
107baca7f70SBram Moolenaarendfunction
108baca7f70SBram Moolenaar
109baca7f70SBram Moolenaarfunction! s:preview_color(linenr) abort
110baca7f70SBram Moolenaar    let line = getline(a:linenr)
111baca7f70SBram Moolenaar    let defline = matchlist(line, '^\v([A-Z_]+|[*.]\S+)\s+([0-9;]+)')
112baca7f70SBram Moolenaar    if empty(defline)
113baca7f70SBram Moolenaar        return
114071d4279SBram Moolenaar    endif
115071d4279SBram Moolenaar
116baca7f70SBram Moolenaar    let colordef = defline[2]
117071d4279SBram Moolenaar
118baca7f70SBram Moolenaar    let colors = split(colordef, ';')
119baca7f70SBram Moolenaar
120baca7f70SBram Moolenaar    let hi_str = ''
121baca7f70SBram Moolenaar    let hi_attrs = []
122baca7f70SBram Moolenaar    while len(colors) > 0
123baca7f70SBram Moolenaar        let item = str2nr(remove(colors, 0))
124baca7f70SBram Moolenaar        if item == 1
125baca7f70SBram Moolenaar            call add(hi_attrs, 'bold')
126baca7f70SBram Moolenaar        elseif item == 3
127baca7f70SBram Moolenaar            call add(hi_attrs, 'italic')
128baca7f70SBram Moolenaar        elseif item == 4
129baca7f70SBram Moolenaar            call add(hi_attrs, 'underline')
130baca7f70SBram Moolenaar        elseif item == 7
131baca7f70SBram Moolenaar            call add(hi_attrs, 'inverse')
132baca7f70SBram Moolenaar        elseif item >= 30 && item <= 37
133baca7f70SBram Moolenaar            " ANSI SGR foreground color
134baca7f70SBram Moolenaar            let hi_str .= s:get_hi_str(item - 30, 'fg')
135baca7f70SBram Moolenaar        elseif item >= 40 && item <= 47
136baca7f70SBram Moolenaar            " ANSI SGR background color
137baca7f70SBram Moolenaar            let hi_str .= s:get_hi_str(item - 40, 'bg')
138*22f1d0e3SBram Moolenaar        elseif item >= 90 && item <= 97
139*22f1d0e3SBram Moolenaar            " ANSI SGR+8 foreground color (xterm 16-color support)
140*22f1d0e3SBram Moolenaar            let hi_str .= s:get_hi_str(item - 82, 'fg')
141*22f1d0e3SBram Moolenaar        elseif item >= 100 && item <= 107
142*22f1d0e3SBram Moolenaar            " ANSI SGR+8 background color (xterm 16-color support)
143*22f1d0e3SBram Moolenaar            let hi_str .= s:get_hi_str(item - 92, 'bg')
144baca7f70SBram Moolenaar        elseif item == 38
145baca7f70SBram Moolenaar            " Foreground for terminals with 88/256 color support
146baca7f70SBram Moolenaar            let color = s:get_256color(colors)
147baca7f70SBram Moolenaar            if color == -1
148baca7f70SBram Moolenaar                break
149baca7f70SBram Moolenaar            endif
150baca7f70SBram Moolenaar            let hi_str .= s:get_hi_str(color, 'fg')
151baca7f70SBram Moolenaar        elseif item == 48
152baca7f70SBram Moolenaar            " Background for terminals with 88/256 color support
153baca7f70SBram Moolenaar            let color = s:get_256color(colors)
154baca7f70SBram Moolenaar            if color == -1
155baca7f70SBram Moolenaar                break
156baca7f70SBram Moolenaar            endif
157baca7f70SBram Moolenaar            let hi_str .= s:get_hi_str(color, 'bg')
158baca7f70SBram Moolenaar        endif
159baca7f70SBram Moolenaar    endwhile
160baca7f70SBram Moolenaar
161baca7f70SBram Moolenaar    if hi_str == '' && empty(hi_attrs)
162baca7f70SBram Moolenaar        return
163baca7f70SBram Moolenaar    endif
164baca7f70SBram Moolenaar
165baca7f70SBram Moolenaar    " Check whether we have already defined this color
166baca7f70SBram Moolenaar    redir => s:currentmatch
167baca7f70SBram Moolenaar    silent! execute 'syntax list'
168baca7f70SBram Moolenaar    redir END
169baca7f70SBram Moolenaar
170baca7f70SBram Moolenaar    if s:currentmatch !~# '\/\\_s\\zs' . colordef . '\\ze\\_s\/'
171baca7f70SBram Moolenaar        " Append the buffer number to avoid problems with other dircolors
172baca7f70SBram Moolenaar        " buffers interfering
173baca7f70SBram Moolenaar        let bufnr = bufnr('%')
174baca7f70SBram Moolenaar        execute 'syntax match dircolorsColor' . b:dc_next_index . '_' . bufnr .
175baca7f70SBram Moolenaar              \ ' "\_s\zs' . colordef . '\ze\_s"'
176baca7f70SBram Moolenaar        let hi_attrs_str = ''
177baca7f70SBram Moolenaar        if !empty(hi_attrs)
178baca7f70SBram Moolenaar            if has('gui_running')
179baca7f70SBram Moolenaar                let hi_attrs_str = ' gui=' . join(hi_attrs, ',')
18042eeac35SBram Moolenaar            else
181baca7f70SBram Moolenaar                let hi_attrs_str = ' cterm=' . join(hi_attrs, ',')
182baca7f70SBram Moolenaar            endif
183baca7f70SBram Moolenaar        endif
184baca7f70SBram Moolenaar        execute 'highlight default dircolorsColor' . b:dc_next_index . '_' .
185baca7f70SBram Moolenaar              \ bufnr . hi_str . hi_attrs_str
186baca7f70SBram Moolenaar        let b:dc_next_index += 1
187baca7f70SBram Moolenaar    endif
188baca7f70SBram Moolenaarendfunction
189baca7f70SBram Moolenaar
190baca7f70SBram Moolenaar" Avoid accumulating too many definitions while editing
191baca7f70SBram Moolenaarfunction! s:reset_colors() abort
192baca7f70SBram Moolenaar    if b:dc_next_index > 0
193baca7f70SBram Moolenaar        let bufnr = bufnr('%')
194baca7f70SBram Moolenaar        for i in range(b:dc_next_index)
195baca7f70SBram Moolenaar            execute 'syntax clear dircolorsColor' . i . '_' . bufnr
196baca7f70SBram Moolenaar            execute 'highlight clear dircolorsColor' . i . '_' . bufnr
197baca7f70SBram Moolenaar        endfor
198baca7f70SBram Moolenaar        let b:dc_next_index = 0
199baca7f70SBram Moolenaar    endif
200baca7f70SBram Moolenaar
201baca7f70SBram Moolenaar    for linenr in range(1, line('$'))
202baca7f70SBram Moolenaar        call s:preview_color(linenr)
203baca7f70SBram Moolenaar    endfor
204baca7f70SBram Moolenaarendfunction
205baca7f70SBram Moolenaar
206baca7f70SBram Moolenaarlet b:dc_next_index = 0
207baca7f70SBram Moolenaar
208baca7f70SBram Moolenaarif has('gui_running')
209baca7f70SBram Moolenaar    call s:set_guicolors()
210baca7f70SBram Moolenaarendif
211baca7f70SBram Moolenaar
212baca7f70SBram Moolenaarif has('gui_running') || &t_Co != ''
213baca7f70SBram Moolenaar    call s:reset_colors()
214baca7f70SBram Moolenaar
215baca7f70SBram Moolenaar    autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
216baca7f70SBram Moolenaar    autocmd CursorHold,CursorHoldI   <buffer> call s:reset_colors()
217071d4279SBram Moolenaarendif
218071d4279SBram Moolenaar
219071d4279SBram Moolenaarlet b:current_syntax = "dircolors"
220071d4279SBram Moolenaar
22142eeac35SBram Moolenaarlet &cpo = s:cpo_save
22242eeac35SBram Moolenaarunlet s:cpo_save
223