" Vim global plugin for short description " Maintainer: Jan Pobrislo " Version: 0.2 " Description: Long description. " Last Change: 2015-08-27 " License: Vim License (see :help license) " Location: plugin/prism.vim " Website: https://webprojekty.cz/ccx/bzr/vim-prism " " See prism.txt for help. This can be accessed by doing: " " :helptags ~/.vim/doc " :help prism let g:prism_version = '0.2' " Allow use of line continuation. let s:save_cpo = &cpo set cpo&vim " load guard if exists("g:loaded_prism") let &cpo = s:save_cpo finish endif let g:loaded_prism = 1 if !exists('g:prism_enabled') let g:prism_enabled = 1 endif if !exists('g:prism_dark_colors') let g:prism_dark_colors = [ 31, 35, 113, 137, 130, 172, 191, 132, 140, 147 ] endif if !exists('g:prism_light_colors') let g:prism_light_colors = [ \ 'red', \ 'darkyellow', \ 'darkgreen', \ 'blue', \ 'darkmagenta', \ 'red', \ 'darkyellow', \ 'darkgreen', \ 'blue', \ 'darkmagenta' ] endif command! PrismEnable let g:prism_enabled = 1 exe 'set ft='.&ft command! PrismDisable let g:prism_enabled = 0 exe 'set ft='.&ft " set up colors and return their count fun! s:PrismScheme() let l:n = 0 if &bg == "dark" for colorid in g:prism_dark_colors exe 'hi default hlLevel'.l:n.' ctermfg='.colorid let l:n = l:n + 1 endfor return len(g:prism_dark_colors) else for colorid in g:prism_light_colors exe 'hi default hlLevel'.l:n.' ctermfg='.colorid let l:n = l:n + 1 endfor return len(g:prism_light_colors) endif endfun " produce contains= string for round/square/curly variations of given depth fun! s:con(depth) return 'contains=prism'.a:depth.'r,prism'.a:depth.'s,prism'.a:depth.'c' endfun " create syntax rules for bracketed regions, on top of existing syntax rules " call this from after/syntax/filetype.vim fun! Prism(depth, contains, containedin) if !g:prism_enabled return endif if a:depth let l:depth = min([a:depth, s:PrismScheme() - 1]) else let l:depth = s:PrismScheme() - 1 endif if !empty(a:contains) && a:contains !~ '^,' let l:contains = ','.a:contains else let l:contains = a:contains endif if !empty(a:containedin) && a:containedin !~ '^containedin=' let l:containedin = 'containedin='.a:containedin else let l:containedin = a:containedin endif exe 'syn region prism0r transparent matchgroup=hlLevel0 start=/(/ end=/)/ '.s:con(1).l:contains.' '.l:containedin exe 'syn region prism0c transparent matchgroup=hlLevel0 start=/{/ end=/}/ '.s:con(1).l:contains.' '.l:containedin exe 'syn region prism0s transparent matchgroup=hlLevel0 start=/\[/ end=/\]/ '.s:con(1).l:contains.' '.l:containedin for n in range(1, l:depth - 1) exe 'syn region prism'.n.'r transparent matchgroup=hlLevel'.n.' start=/(/ end=/)/ contained '.s:con(n+1).l:contains exe 'syn region prism'.n.'c transparent matchgroup=hlLevel'.n.' start=/{/ end=/}/ contained '.s:con(n+1).l:contains exe 'syn region prism'.n.'s transparent matchgroup=hlLevel'.n.' start=/\[/ end=/\]/ contained '.s:con(n+1).l:contains endfor exe 'syn region prism'.l:depth.'r transparent matchgroup=hlLevel'.l:depth.' start=/(/ end=/)/ contained '.s:con(0).l:contains exe 'syn region prism'.l:depth.'c transparent matchgroup=hlLevel'.l:depth.' start=/{/ end=/}/ contained '.s:con(0).l:contains exe 'syn region prism'.l:depth.'s transparent matchgroup=hlLevel'.l:depth.' start=/\[/ end=/\]/ contained '.s:con(0).l:contains endfun " Returns string that closes all open brackets at the point of cursor fun! PrismClose() let l:result = '' for id in synstack(line("."), col(".")) let l:name = synIDattr(id, "name") if l:name[:4] == 'prism' let l:type = name[strlen(name)-1] if l:type == 'r' let l:result = ')' . l:result elseif l:type == 's' let l:result = ']' . l:result elseif l:type == 'c' let l:result = '}' . l:result endif endif endfor return l:result endfun " Returns string that closes innermost open bracket at the point of cursor fun! PrismCloseInner() let l:result = '' for id in synstack(line("."), col(".")) let l:name = synIDattr(id, "name") if l:name[:4] == 'prism' let l:type = name[strlen(name)-1] if l:type == 'r' let l:result = ')' elseif l:type == 's' let l:result = ']' elseif l:type == 'c' let l:result = '}' endif endif endfor return l:result endfun "reset &cpo back to users setting let &cpo = s:save_cpo " vim: sw=4 sts=4 ts=4 noet