diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 17:30:48 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 17:30:48 +0200 | 
| commit | 7d1b7e6f7123cd8b14f02221c7ec37d17d5d527e (patch) | |
| tree | 9f0a5631c0dcaa8225f44004281f11265f694f14 /syntax | |
| parent | 5e3a8b92cf0fe8c46cccba1072d52ee486306dfd (diff) | |
| download | vim-polyglot-7d1b7e6f7123cd8b14f02221c7ec37d17d5d527e.tar.gz vim-polyglot-7d1b7e6f7123cd8b14f02221c7ec37d17d5d527e.zip | |
Add csv syntax support
Diffstat (limited to '')
| -rw-r--r-- | syntax/csv.vim | 188 | 
1 files changed, 188 insertions, 0 deletions
| diff --git a/syntax/csv.vim b/syntax/csv.vim new file mode 100644 index 00000000..41a194d1 --- /dev/null +++ b/syntax/csv.vim @@ -0,0 +1,188 @@ +" A simple syntax highlighting, simply alternate colors between two +" adjacent columns +" Init {{{2 +let s:cpo_save = &cpo +set cpo&vim + +scriptencoding utf8 +if version < 600 +    syn clear +elseif exists("b:current_syntax") +    finish +endif + +" Helper functions "{{{2 +fu! <sid>Warning(msg) "{{{3 +    " Don't redraw, so we are not overwriting messages from the ftplugin +    " script +    "redraw! +    echohl WarningMsg +    echomsg "CSV Syntax:" . a:msg +    echohl Normal +endfu + +fu! <sid>Esc(val, char) "{{2 +    return '\V'.escape(a:val, '\\'.a:char).'\m' +endfu + +fu! <sid>CheckSaneSearchPattern() "{{{3 +    let s:del_def = ',' +    let s:col_def = '\%([^' . s:del_def . ']*' . s:del_def . '\|$\)' +    let s:col_def_end = '\%([^' . s:del_def . ']*' . s:del_def . '\)' + +    " First:  +    " Check for filetype plugin. This syntax script relies on the filetype +    " plugin, else, it won't work properly. +    redir => s:a |sil filetype | redir end +    let s:a=split(s:a, "\n")[0] +    if match(s:a, '\cplugin:off') > 0 +	call <sid>Warning("No filetype support, only simple highlighting using" +		    \ . s:del_def . " as delimiter! See :h csv-installation") +    endif + +    " Check Comment setting +    if !exists("g:csv_comment") +        let b:csv_cmt = split(&cms, '%s') +    else +        let b:csv_cmt = split(g:csv_comment, '%s') +    endif + + +    " Second: Check for sane defaults for the column pattern +    " Not necessary to check for fixed width columns +    if exists("b:csv_fixed_width_cols") +	return +    endif + + +    " Try a simple highlighting, if the defaults from the ftplugin +    " don't exist +    let s:col  = exists("b:col") && !empty(b:col) ? b:col +		\ : s:col_def +    let s:col_end  = exists("b:col_end") && !empty(b:col_end) ? b:col_end +		\ : s:col_def_end +    let s:del  = exists("b:delimiter") && !empty(b:delimiter) ? b:delimiter +		\ : s:del_def +    let s:cmts = exists("b:csv_cmt") ? b:csv_cmt[0] : split(&cms, '&s')[0] +    let s:cmte = exists("b:csv_cmt") && len(b:csv_cmt) == 2 ? b:csv_cmt[1] +		\ : '' + +    if line('$') > 1 && (!exists("b:col") || empty(b:col)) +    " check for invalid pattern, ftplugin hasn't been loaded yet +	call <sid>Warning("Invalid column pattern, using default pattern " . s:col_def) +    endif +endfu + +" Syntax rules {{{2 +fu! <sid>DoHighlight() "{{{3 +    if has("conceal") && !exists("g:csv_no_conceal") && +		\ !exists("b:csv_fixed_width_cols") +	" old val +	    "\ '\%(.\)\@=/ms=e,me=e contained conceal cchar=' . +	    " Has a problem with the last line! +	exe "syn match CSVDelimiter /" . s:col_end .  +	    \ '/ms=e,me=e contained conceal cchar=' . +	    \ (&enc == "utf-8" ? "│" : '|') +	"exe "syn match CSVDelimiterEOL /" . s:del .  +	"    \ '\?$/ contained conceal cchar=' . +	"    \ (&enc == "utf-8" ? "│" : '|') +	hi def link CSVDelimiter Conceal +    elseif !exists("b:csv_fixed_width_cols") +	" The \%(.\)\@<= makes sure, the last char won't be concealed, +	" if it isn't a delimiter +	"exe "syn match CSVDelimiter /" . s:col . '\%(.\)\@<=/ms=e,me=e contained' +	exe "syn match CSVDelimiter /" . s:col_end . '/ms=e,me=e contained' +	"exe "syn match CSVDelimiterEOL /" . s:del . '\?$/ contained' +	if has("conceal") +	    hi def link CSVDelimiter Conceal +	else +	    hi def link CSVDelimiter Ignore +	endif +    endif " There is no delimiter for csv fixed width columns + + +    if !exists("b:csv_fixed_width_cols") +	exe 'syn match CSVColumnEven nextgroup=CSVColumnOdd /' +		    \ . s:col . '/ contains=CSVDelimiter' +	exe 'syn match CSVColumnOdd nextgroup=CSVColumnEven /' +		    \ . s:col . '/ contains=CSVDelimiter' + +	exe 'syn match CSVColumnHeaderEven nextgroup=CSVColumnHeaderOdd /\%1l' +		    \. s:col . '/ contains=CSVDelimiter' +	exe 'syn match CSVColumnHeaderOdd nextgroup=CSVColumnHeaderEven /\%1l' +		    \. s:col . '/ contains=CSVDelimiter' +    else +	for i in range(len(b:csv_fixed_width_cols)) +	    let pat = '/\%' . b:csv_fixed_width_cols[i] . 'c.*' . +			\ ((i == len(b:csv_fixed_width_cols)-1) ? '/' :  +			\ '\%' . b:csv_fixed_width_cols[i+1] . 'c/') + +	    let group  = "CSVColumn" . (i%2 ? "Odd"  : "Even" ) +	    let ngroup = "CSVColumn" . (i%2 ? "Even" : "Odd"  ) +	    exe "syn match " group pat " nextgroup=" . ngroup +	endfor +    endif +    " Comment regions +    exe 'syn match CSVComment /'. <sid>Esc(s:cmts, '/'). '.*'. +		\ (!empty(s:cmte) ? '\%('. <sid>Esc(s:cmte, '/'). '\)\?' +		\: '').  '/' +    hi def link CSVComment Comment +endfun + +fu! <sid>DoSyntaxDefinitions() "{{{3 +    syn spell toplevel + +    " Not really needed +    syn case ignore + +    hi def link CSVColumnHeaderOdd  WarningMsg +    hi def link CSVColumnHeaderEven WarningMsg +    hi def link CSVColumnOdd	    DiffAdd +    hi def link CSVColumnEven	    DiffChange +    " Old Version +    if 0 +	if &t_Co < 88 +	    if !exists("b:csv_fixed_width_cols") +		hi default CSVColumnHeaderOdd ctermfg=DarkRed ctermbg=15 +		    \ guibg=grey80 guifg=black term=underline cterm=standout,bold +		    \ gui=bold,underline  +	    endif +	    hi default CSVColumnOdd	ctermfg=DarkRed ctermbg=15 guibg=grey80 +		    \ guifg=black term=underline cterm=bold gui=underline +	else +	    if !exists("b:csv_fixed_width_cols") +		hi default CSVColumnHeaderOdd ctermfg=darkblue ctermbg=white +		    \ guibg=grey80 guifg=black cterm=standout,underline +		    \ gui=bold,underline +	    endif +	    hi default CSVColumnOdd ctermfg=darkblue ctermbg=white guibg=grey80 +		    \ guifg=black cterm=reverse,underline gui=underline +	endif +	     +	" ctermbg=8 should be safe, even in 8 color terms +	if !exists("b:csv_fixed_width_cols") +	    hi default CSVColumnHeaderEven ctermfg=white ctermbg=darkgrey +		    \ guibg=grey50 guifg=black term=bold cterm=standout,underline +		    \ gui=bold,underline  +	endif +	hi default CSVColumnEven ctermfg=white ctermbg=darkgrey guibg=grey50 +		    \ guifg=black term=bold cterm=underline gui=bold,underline  +    endif +endfun + +" Main: {{{2  +" Make sure, we are using a sane, valid pattern for syntax +" highlighting +call <sid>CheckSaneSearchPattern() + +" Define all necessary syntax groups +call <sid>DoSyntaxDefinitions() + +" Highlight the file +call <sid>DoHighlight() + +" Set the syntax variable {{{2 +let b:current_syntax="csv" + +let &cpo = s:cpo_save +unlet s:cpo_save | 
