Mercurial > vim
view runtime/syntax/dircolors.vim @ 29265:9bc63b4f9c33 v8.2.5151
patch 8.2.5151: reading beyond the end of the line with lisp indenting
Commit: https://github.com/vim/vim/commit/8eba2bd291b347e3008aa9e565652d51ad638cfa
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jun 22 19:59:28 2022 +0100
patch 8.2.5151: reading beyond the end of the line with lisp indenting
Problem: Reading beyond the end of the line with lisp indenting.
Solution: Avoid going over the NUL at the end of the line.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 22 Jun 2022 21:00:03 +0200 |
parents | acd7eaa13d2b |
children |
line wrap: on
line source
" 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