summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/dircolors.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/dircolors.vim')
-rw-r--r--runtime/syntax/dircolors.vim222
1 files changed, 222 insertions, 0 deletions
diff --git a/runtime/syntax/dircolors.vim b/runtime/syntax/dircolors.vim
new file mode 100644
index 0000000..24bc31f
--- /dev/null
+++ b/runtime/syntax/dircolors.vim
@@ -0,0 +1,222 @@
+" Vim syntax file
+" Language: dircolors(1) input file
+" Maintainer: Jan Larres <jan@majutsushi.net>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-02-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax keyword dircolorsTodo FIXME TODO XXX NOTE contained
+
+syntax region dircolorsComment start='#' end='$' contains=dircolorsTodo,@Spell
+
+syntax keyword dircolorsKeyword TERM LEFT LEFTCODE RIGHT RIGHTCODE END ENDCODE
+
+syntax keyword dircolorsKeyword NORMAL NORM FILE RESET DIR LNK LINK SYMLINK
+ \ MULTIHARDLINK FIFO SOCK DOOR BLK CHR ORPHAN
+ \ MISSING PIPE BLOCK CHR EXEC SETUID SETGID
+ \ CAPABILITY STICKY_OTHER_WRITABLE
+ \ OTHER_WRITABLE STICKY
+
+" Slackware only, ignored by GNU dircolors.
+syntax keyword dircolorsKeyword COLOR OPTIONS EIGHTBIT
+
+syntax match dircolorsExtension '^\s*\zs[.*]\S\+'
+
+syntax match dircolorsEscape '\\[abefnrtv?_\\^#]'
+syntax match dircolorsEscape '\\[0-9]\{3}'
+syntax match dircolorsEscape '\\x[0-9a-f]\{3}'
+
+if !has('gui_running') && &t_Co == ''
+ syntax match dircolorsNumber '\<\d\+\>'
+ highlight default link dircolorsNumber Number
+endif
+
+highlight default link dircolorsTodo Todo
+highlight default link dircolorsComment Comment
+highlight default link dircolorsKeyword Keyword
+highlight default link dircolorsExtension Identifier
+highlight default link dircolorsEscape Special
+
+function! s:set_guicolors() abort
+ let s:termguicolors = {}
+
+ let s:termguicolors[0] = "Black"
+ let s:termguicolors[1] = "DarkRed"
+ let s:termguicolors[2] = "DarkGreen"
+ let s:termguicolors[3] = "DarkYellow"
+ let s:termguicolors[4] = "DarkBlue"
+ let s:termguicolors[5] = "DarkMagenta"
+ let s:termguicolors[6] = "DarkCyan"
+ let s:termguicolors[7] = "Gray"
+ let s:termguicolors[8] = "DarkGray"
+ let s:termguicolors[9] = "Red"
+ let s:termguicolors[10] = "Green"
+ let s:termguicolors[11] = "Yellow"
+ let s:termguicolors[12] = "Blue"
+ let s:termguicolors[13] = "Magenta"
+ let s:termguicolors[14] = "Cyan"
+ let s:termguicolors[15] = "White"
+
+ let xterm_palette = ["00", "5f", "87", "af", "d7", "ff"]
+
+ let cur_col = 16
+
+ for r in xterm_palette
+ for g in xterm_palette
+ for b in xterm_palette
+ let s:termguicolors[cur_col] = '#' . r . g . b
+ let cur_col += 1
+ endfor
+ endfor
+ endfor
+
+ for i in range(24)
+ let g = i * 0xa + 8
+ let s:termguicolors[i + 232] = '#' . g . g . g
+ endfor
+endfunction
+
+function! s:get_hi_str(color, place) abort
+ if a:color >= 0 && a:color <= 255
+ if has('gui_running')
+ return ' gui' . a:place . '=' . s:termguicolors[a:color]
+ elseif a:color <= 7 || &t_Co == 256 || &t_Co == 88
+ return ' cterm' . a:place . '=' . a:color
+ endif
+ endif
+ return ''
+endfunction
+
+function! s:get_256color(colors) abort
+ if len(a:colors) >= 2 " May be fewer while editing
+ let [_five, color] = remove(a:colors, 0, 1)
+ if _five != '5' || color == ''
+ return -1
+ else
+ return str2nr(color)
+ endif
+ else
+ return -1
+ endif
+endfunction
+
+function! s:preview_color(linenr) abort
+ let line = getline(a:linenr)
+ let defline = matchlist(line, '^\v([A-Z_]+|[*.]\S+)\s+([0-9;]+)')
+ if empty(defline)
+ return
+ endif
+
+ let colordef = defline[2]
+
+ let colors = split(colordef, ';')
+
+ let hi_str = ''
+ let hi_attrs = []
+ while len(colors) > 0
+ let item = str2nr(remove(colors, 0))
+ if item == 1
+ call add(hi_attrs, 'bold')
+ elseif item == 3
+ call add(hi_attrs, 'italic')
+ elseif item == 4
+ call add(hi_attrs, 'underline')
+ elseif item == 7
+ call add(hi_attrs, 'inverse')
+ elseif item >= 30 && item <= 37
+ " ANSI SGR foreground color
+ let hi_str .= s:get_hi_str(item - 30, 'fg')
+ elseif item >= 40 && item <= 47
+ " ANSI SGR background color
+ let hi_str .= s:get_hi_str(item - 40, 'bg')
+ elseif item >= 90 && item <= 97
+ " ANSI SGR+8 foreground color (xterm 16-color support)
+ let hi_str .= s:get_hi_str(item - 82, 'fg')
+ elseif item >= 100 && item <= 107
+ " ANSI SGR+8 background color (xterm 16-color support)
+ let hi_str .= s:get_hi_str(item - 92, 'bg')
+ elseif item == 38
+ " Foreground for terminals with 88/256 color support
+ let color = s:get_256color(colors)
+ if color == -1
+ break
+ endif
+ let hi_str .= s:get_hi_str(color, 'fg')
+ elseif item == 48
+ " Background for terminals with 88/256 color support
+ let color = s:get_256color(colors)
+ if color == -1
+ break
+ endif
+ let hi_str .= s:get_hi_str(color, 'bg')
+ endif
+ endwhile
+
+ if hi_str == '' && empty(hi_attrs)
+ return
+ endif
+
+ " Check whether we have already defined this color
+ redir => s:currentmatch
+ silent! execute 'syntax list'
+ redir END
+
+ if s:currentmatch !~# '\/\\_s\\zs' . colordef . '\\ze\\_s\/'
+ " Append the buffer number to avoid problems with other dircolors
+ " buffers interfering
+ let bufnr = bufnr('%')
+ execute 'syntax match dircolorsColor' . b:dc_next_index . '_' . bufnr .
+ \ ' "\_s\zs' . colordef . '\ze\_s"'
+ let hi_attrs_str = ''
+ if !empty(hi_attrs)
+ if has('gui_running')
+ let hi_attrs_str = ' gui=' . join(hi_attrs, ',')
+ else
+ let hi_attrs_str = ' cterm=' . join(hi_attrs, ',')
+ endif
+ endif
+ execute 'highlight default dircolorsColor' . b:dc_next_index . '_' .
+ \ bufnr . hi_str . hi_attrs_str
+ let b:dc_next_index += 1
+ endif
+endfunction
+
+" Avoid accumulating too many definitions while editing
+function! s:reset_colors() abort
+ if b:dc_next_index > 0
+ let bufnr = bufnr('%')
+ for i in range(b:dc_next_index)
+ execute 'syntax clear dircolorsColor' . i . '_' . bufnr
+ execute 'highlight clear dircolorsColor' . i . '_' . bufnr
+ endfor
+ let b:dc_next_index = 0
+ endif
+
+ for linenr in range(1, line('$'))
+ call s:preview_color(linenr)
+ endfor
+endfunction
+
+let b:dc_next_index = 0
+
+if has('gui_running')
+ call s:set_guicolors()
+endif
+
+if has('gui_running') || &t_Co != ''
+ call s:reset_colors()
+
+ autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
+ autocmd CursorHold,CursorHoldI <buffer> call s:reset_colors()
+endif
+
+let b:current_syntax = "dircolors"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save