" Source repo: http://github.com/rking/vim-detailed
"
" So many 256-color schemes merely shift the palette around, displaying only 8
" colors (even though they're a *different* set of 8 colors than default).
"
" This scheme is more detailed than that.
"
" Your eyes will learn to pick up on subtler patterns without requiring as
" much from your conscious mind.  Instead of the goal being merely looking
" cool, the goal is to maximize info bandwidth from the computer to the brain.
" The regexes, for example, are much easier to pick out. The overall feel of a
" given file becomes much more intuitively recognizeable (you'll know you're
" in foo.rb, not bar.rb, without having to read any text). Certain bits will
" "pop" into being the right colors, such as the difference between
" "RUBY_VERISON" and "RUBY_VERSION", or # encoding: utf-8
"
" ## 256 Color Requirement
"
" If you aren't getting 256 colors, you aren't getting detailed.vim.
" Typically, you'll have to make sure your `$TERM` variable is set right. This
" can get un-set by some programs, such as tmux. So you can force it to
" something like:
"
"     export TERM=screen-256color
"     # or:
"     export TERM=xterm-256color
"
" If these are unavailable on the target system, you might have to place a
" terminfo file in `~/.terminfo/`  -or- you can be totally gross and force it
" with `:set &t_Co=256` in vim. But don't be gross. It's uncouth.
"
" ## Download
"
"  If using Pathogen,
"
"      cd ~/.vim/bundle && git clone https://github.com/rking/vim-detailed
"
"  If using no vim plugin manager:
"
"      mkdir -p ~/.vim/colors/ && cd $_ && wget https://raw.github.com/rking/vim-detailed/master/colors/detailed.vim
"
" ## Setup
"
" In your ~/.vimrc (or ~/.vim/plugin/colorscheme.vim if you like to organize):
"
"     colo detailed
"
" This enables it globally. If you want to just do it for a trial, as long as
" you have done one of the steps in the "Download" section, above, you can do:
"
"     vim foo.rb +colo\ detailed
"
" Or, from within vim:
"
"     :colo detailed

let colors_name = 'detailed'

" Prevent any screwy setting from causing errors:
let s:save_cpo = &cpo | set cpo&vim

" Turn on moar syntaks!
let ruby_operators = 1

" If you don't have this, rails.vim will zap the matchers when it resets
" syntax for its own additions:
au Syntax * call s:fatpacked_rainbow_parens()
au Syntax * call s:detailed_syntax_addtions()

au Syntax ruby call s:ruby_syntax_and_highlights()
au Syntax c    call s:c_syntax_and_highlights()
au Syntax diff call s:diff_syntax_and_highlights()
au Syntax vim  call s:vim_syntax_and_highlights()
au Syntax javascript call s:javascript_syntax_and_highlights()
au Syntax go   call s:go_syntax_and_highlights()

" Show detailed syntax stack
nmap <Leader>dets :call <SID>SynStack()<CR>
fun! <SID>SynStack()
  echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfun

" Color Palette {{{

" Boring ctermfg ⇒ guifg map {{{
let s:cterm_gui_map = {
  \0: '000000',
  \1: 'ff0000',
  \2: '00ff00',
  \3: 'ffff00',
  \4: '0000ff',
  \5: 'ff00ff',
  \6: '00ffff',
  \16: '000000',
  \17: '00005f',
  \18: '000087',
  \19: '0000af',
  \20: '0000d7',
  \21: '0000ff',
  \22: '005f00',
  \23: '005f5f',
  \24: '005f87',
  \25: '005faf',
  \26: '005fd7',
  \27: '005fff',
  \28: '008700',
  \29: '00875f',
  \30: '008787',
  \31: '0087af',
  \32: '0087d7',
  \33: '0087ff',
  \34: '00af00',
  \35: '00af5f',
  \36: '00af87',
  \37: '00afaf',
  \38: '00afd7',
  \39: '00afff',
  \40: '00d700',
  \41: '00d75f',
  \42: '00d787',
  \43: '00d7af',
  \44: '00d7d7',
  \45: '00d7ff',
  \46: '00ff00',
  \47: '00ff5f',
  \48: '00ff87',
  \49: '00ffaf',
  \50: '00ffd7',
  \51: '00ffff',
  \52: '5f0000',
  \53: '5f005f',
  \54: '5f0087',
  \55: '5f00af',
  \56: '5f00d7',
  \57: '5f00ff',
  \58: '5f5f00',
  \59: '5f5f5f',
  \60: '5f5f87',
  \61: '5f5faf',
  \62: '5f5fd7',
  \63: '5f5fff',
  \64: '5f8700',
  \65: '5f875f',
  \66: '5f8787',
  \67: '5f87af',
  \68: '5f87d7',
  \69: '5f87ff',
  \70: '5faf00',
  \71: '5faf5f',
  \72: '5faf87',
  \73: '5fafaf',
  \74: '5fafd7',
  \75: '5fafff',
  \76: '5fd700',
  \77: '5fd75f',
  \78: '5fd787',
  \79: '5fd7af',
  \80: '5fd7d7',
  \81: '5fd7ff',
  \82: '5fff00',
  \83: '5fff5f',
  \84: '5fff87',
  \85: '5fffaf',
  \86: '5fffd7',
  \87: '5fffff',
  \88: '870000',
  \89: '87005f',
  \90: '870087',
  \91: '8700af',
  \92: '8700d7',
  \93: '8700ff',
  \94: '875f00',
  \95: '875f5f',
  \96: '875f87',
  \97: '875faf',
  \98: '875fd7',
  \99: '875fff',
  \100: '878700',
  \101: '87875f',
  \102: '878787',
  \103: '8787af',
  \104: '8787d7',
  \105: '8787ff',
  \106: '87af00',
  \107: '87af5f',
  \108: '87af87',
  \109: '87afaf',
  \110: '87afd7',
  \111: '87afff',
  \112: '87d700',
  \113: '87d75f',
  \114: '87d787',
  \115: '87d7af',
  \116: '87d7d7',
  \117: '87d7ff',
  \118: '87ff00',
  \119: '87ff5f',
  \120: '87ff87',
  \121: '87ffaf',
  \122: '87ffd7',
  \123: '87ffff',
  \124: 'af0000',
  \125: 'af005f',
  \126: 'af0087',
  \127: 'af00af',
  \128: 'af00d7',
  \129: 'af00ff',
  \130: 'af5f00',
  \131: 'af5f5f',
  \132: 'af5f87',
  \133: 'af5faf',
  \134: 'af5fd7',
  \135: 'af5fff',
  \136: 'af8700',
  \137: 'af875f',
  \138: 'af8787',
  \139: 'af87af',
  \140: 'af87d7',
  \141: 'af87ff',
  \142: 'afaf00',
  \143: 'afaf5f',
  \144: 'afaf87',
  \145: 'afafaf',
  \146: 'afafd7',
  \147: 'afafff',
  \148: 'afd700',
  \149: 'afd75f',
  \150: 'afd787',
  \151: 'afd7af',
  \152: 'afd7d7',
  \153: 'afd7ff',
  \154: 'afff00',
  \155: 'afff5f',
  \156: 'afff87',
  \157: 'afffaf',
  \158: 'afffd7',
  \159: 'afffff',
  \160: 'd70000',
  \161: 'd7005f',
  \162: 'd70087',
  \163: 'd700af',
  \164: 'd700d7',
  \165: 'd700ff',
  \166: 'd75f00',
  \167: 'd75f5f',
  \168: 'd75f87',
  \169: 'd75faf',
  \170: 'd75fd7',
  \171: 'd75fff',
  \172: 'd78700',
  \173: 'd7875f',
  \174: 'd78787',
  \175: 'd787af',
  \176: 'd787d7',
  \177: 'd787ff',
  \178: 'd7af00',
  \179: 'd7af5f',
  \180: 'd7af87',
  \181: 'd7afaf',
  \182: 'd7afd7',
  \183: 'd7afff',
  \184: 'd7d700',
  \185: 'd7d75f',
  \186: 'd7d787',
  \187: 'd7d7af',
  \188: 'd7d7d7',
  \189: 'd7d7ff',
  \190: 'd7ff00',
  \191: 'd7ff5f',
  \192: 'd7ff87',
  \193: 'd7ffaf',
  \194: 'd7ffd7',
  \195: 'd7ffff',
  \196: 'ff0000',
  \197: 'ff005f',
  \198: 'ff0087',
  \199: 'ff00af',
  \200: 'ff00d7',
  \201: 'ff00ff',
  \202: 'ff5f00',
  \203: 'ff5f5f',
  \204: 'ff5f87',
  \205: 'ff5faf',
  \206: 'ff5fd7',
  \207: 'ff5fff',
  \208: 'ff8700',
  \209: 'ff875f',
  \210: 'ff8787',
  \211: 'ff87af',
  \212: 'ff87d7',
  \213: 'ff87ff',
  \214: 'ffaf00',
  \215: 'ffaf5f',
  \216: 'ffaf87',
  \217: 'ffafaf',
  \218: 'ffafd7',
  \219: 'ffafff',
  \220: 'ffd700',
  \221: 'ffd75f',
  \222: 'ffd787',
  \223: 'ffd7af',
  \224: 'ffd7d7',
  \225: 'ffd7ff',
  \226: 'ffff00',
  \227: 'ffff5f',
  \228: 'ffff87',
  \229: 'ffffaf',
  \230: 'ffffd7',
  \231: 'ffffff',
  \232: '080808',
  \233: '121212',
  \234: '1c1c1c',
  \235: '262626',
  \236: '303030',
  \237: '3a3a3a',
  \238: '444444',
  \239: '4e4e4e',
  \240: '585858',
  \241: '626262',
  \242: '6c6c6c',
  \243: '767676',
  \244: '808080',
  \245: '8a8a8a',
  \246: '949494',
  \247: '9e9e9e',
  \248: 'a8a8a8',
  \249: 'b2b2b2',
  \250: 'bcbcbc',
  \251: 'c6c6c6',
  \252: 'd0d0d0',
  \253: 'dadada',
  \254: 'e4e4e4',
  \255: 'eeeeee',
  \}
" }}}

let s:c = {
  \'basic8_red (TODO: use this)': 1,
  \'basic8_green': 2,
  \'basic8_yellow': 3,
  \'basic8_blue (TODO: use this)': 4,
  \'basic8_magenta': 5,
  \'basic8_cyan': 6,
  \'basic8_black': 0,
  \'red52': 52,
  \'red88': 88,
  \'red124': 124,
  \'red160': 160,
  \'red161': 161,
  \'red196': 196,
  \'yellow58': 58,
  \'yellow100': 100,
  \'yellow136 (TODO: use this)': 136,
  \'yellow142 (TODO: use this)': 142,
  \'yellow148': 148,
  \'yellow149': 149,
  \'yellow190': 190,
  \'yellow220 (TODO: use this)': 220,
  \'yellow228': 228,
  \'orange208': 208,
  \'orange178': 178,
  \'orange180': 180,
  \'orange222': 222,
  \'light_yellow230': 229,
  \'graygreen (TODO: use this)': 23,
  \'green22': 22,
  \'green23': 23,
  \'green28': 28,
  \'green34': 34,
  \'green37': 37,
  \'green71': 71,
  \'green76': 76,
  \'green84': 84,
  \'green114': 114,
  \'green123': 123,
  \'seafoam': 30,
  \'seafoam2 (TODO: use this)': 35,
  \'teal50': 50,
  \'blue17 (TODO: use this)': 17,
  \'blue19 (TODO: use this)': 19,
  \'blue20 (TODO: use this)': 20,
  \'blue25': 25,
  \'blue27': 27,
  \'blue33': 33,
  \'blue37': 37,
  \'blue75': 75,
  \'blue87': 87,
  \'lavender104': 104,
  \'purple53': 53,
  \'purple89 (TODO: use this)': 89,
  \'purple90': 90,
  \'purple95 (TODO: use this)': 95,
  \'purple99 (TODO: use this)': 79,
  \'purple125': 125,
  \'purple126': 126,
  \'purple127': 127,
  \'purple131': 131,
  \'purple132': 132,
  \'purple139': 139,
  \'purple134': 134,
  \'purple141 (TODO: use this)': 141,
  \'purple161 (TODO: use this)': 161,
  \'purple201': 201,
  \'purple224': 224,
  \'purple225': 225,
  \'gray16': 16,
  \'gray232': 232,
  \'gray233': 233,
  \'gray234': 234,
  \'gray235': 235,
  \'gray236': 236,
  \'gray237': 237,
  \'gray238': 238,
  \'gray239': 239,
  \'gray240': 240,
  \'gray241': 241,
  \'gray242': 242,
  \'gray243': 243,
  \'gray244': 244,
  \'gray245': 245,
  \'gray246': 246,
  \'gray247': 247,
  \'gray248': 248,
  \'gray249': 249,
  \'gray250': 250,
  \'gray251': 251,
  \'gray252': 252,
  \'gray253': 253,
  \'gray254': 254,
  \'gray255': 255,
  \}

" }}}

" :hi funcs {{{
fun! s:color_for(id, fgbg)
  let num = s:c[a:id]
  let gui = s:cterm_gui_map[l:num]
  return 'cterm'.a:fgbg.'='.l:num.' gui'.a:fgbg.'=#'.l:gui
endfun

fun! s:fg(group, fg)
  exe 'hi '.a:group.' '.s:color_for(a:fg,'fg')
endfun

fun! s:bg(group, bg)
  exe 'hi '.a:group.' '.s:color_for(a:bg,'bg')
endfun

fun! s:fgbg(group, fg, bg)
  exe 'hi '.a:group.' '.s:color_for(a:fg,'fg').' '.s:color_for(a:bg,'bg')
endfun

fun! s:bold(group)
  exe 'hi '.a:group.' cterm=bold gui=bold'
endfun

fun! s:bold_fg(group, fg)
  call s:fg(a:group, a:fg)
  call s:bold(a:group)
endfun

fun! s:bold_fgbg(group, fg, bg)
  call s:fgbg(a:group, a:fg, a:bg)
  call s:bold(a:group)
endfun

fun! s:underline_fgbg(group, fg, bg)
  exe 'hi '.a:group.' ctermfg='.s:c[a:fg].' '
    \s:color_for(a:bg,'bg').' cterm=underline,bold gui=underline,bold'
endfun

fun! s:make_obvious(group)
  call s:fgbg(a:group, 'green84', 'red160')
endfun
" }}}

" For now, force darkness. If you're a big fan of white bg's, let me know, and
" we can collaborate on a solution.
set bg=dark
call s:fgbg('Normal', 'gray254', 'gray232')

" Basic/Default-like Palette {{{
hi SpecialKey     term=bold ctermfg=81 guifg=Cyan
hi NonText        term=bold ctermfg=12 gui=bold guifg=Blue
hi Directory      term=bold ctermfg=159 guifg=Cyan
hi ErrorMsg       term=standout ctermfg=15 ctermbg=1 guifg=White guibg=Red
hi IncSearch      term=reverse cterm=reverse gui=reverse
hi MoreMsg        term=bold ctermfg=121 gui=bold guifg=SeaGreen
hi ModeMsg        term=bold cterm=bold gui=bold
hi LineNr gui=NONE term=NONE guifg=#005f87 ctermfg=24
hi CursorLineNr   term=bold ctermfg=11 gui=bold guifg=Yellow
hi Question       term=standout ctermfg=121 gui=bold guifg=Green
hi StatusLine     term=bold,reverse cterm=bold,reverse gui=bold,reverse
hi StatusLineNC   term=reverse cterm=reverse gui=reverse
hi VertSplit      term=reverse cterm=reverse gui=reverse
hi Title          term=bold ctermfg=225 gui=bold guifg=Magenta
hi WarningMsg     term=standout ctermfg=224 guifg=Red
hi WildMenu       term=standout ctermfg=0 ctermbg=11 guifg=Black guibg=Yellow
hi FoldColumn     term=standout ctermfg=14 ctermbg=242 guifg=Cyan guibg=Grey
hi SpellBad       term=reverse ctermbg=9 gui=undercurl guisp=Red
hi SpellCap       term=reverse ctermbg=12 gui=undercurl guisp=Blue
hi SpellRare      term=reverse ctermbg=13 gui=undercurl guisp=Magenta
hi SpellLocal     term=underline ctermbg=14 gui=undercurl guisp=Cyan
hi TabLine        term=underline cterm=underline ctermfg=15 ctermbg=242 gui=underline guibg=DarkGrey
hi TabLineSel     term=bold cterm=bold gui=bold
hi TabLineFill    term=reverse cterm=reverse gui=reverse
hi CursorColumn   term=reverse ctermbg=242 guibg=Grey40
hi Constant       term=underline ctermfg=13 guifg=#ffa0a0
hi Special        term=bold ctermfg=224 guifg=Orange
hi Identifier     term=underline cterm=bold ctermfg=14 guifg=#40ffff
hi Statement      term=bold ctermfg=11 gui=bold guifg=#ffff60
hi PreProc        term=underline ctermfg=81 guifg=#ff80ff
hi Type           term=underline ctermfg=121 gui=bold guifg=#60ff60
hi Underlined     term=underline cterm=underline ctermfg=81 gui=underline guifg=#80a0ff
hi Ignore         ctermfg=0 guifg=bg
hi Error          term=reverse ctermfg=15 ctermbg=9 guifg=White guibg=Red
hi Todo           term=standout ctermfg=0 ctermbg=11 guifg=Blue guibg=Yellow

call s:fg('Comment', 'gray242') " In my books, comments should be quiet.
" }}}

" Generic links {{{
hi link String          detailedString
hi link Character       Constant
hi link Number          detailedInteger
hi link Boolean         detailedBoolean
hi link Float           detailedFloat
hi link Function        Identifier
hi link Conditional     Statement
hi link Repeat          detailedRepeat
hi link Label           Statement
hi link Operator        Statement
hi link Keyword         Statement
hi link Include         PreProc
hi link Define          PreProc
hi link Macro           PreProc
hi link PreCondit       PreProc
hi link StorageClass    Type
hi link Structure       Type
hi link Typedef         Type
hi link Tag             Special
hi link SpecialChar     Special
hi link Delimiter       Special
hi link SpecialComment  Special
hi link Debug           Special
"}}}

" s:detailed_colors — the good stuff {{{
fun! s:detailed_colors()
  call s:diff_syntax_and_highlights() " For vimdiff, which uses other filetypes

  call s:underline_fgbg('MatchParen', 'gray255', 'gray243')

  " For :set colorcolumn=80
  call s:fgbg('ColorColumn', 'gray254', 'gray233')

  " For the Syntastic and quickfixsigns plugins:
  call s:bg('SignColumn', 'gray233')

  "* Distinguish between each of TODO/FIXME/XXX
  call s:fgbg('detailedTodo', 'green76', 'gray238')
  call s:fgbg('detailedFixme', 'gray232', 'orange208')
  call s:fgbg('detailedXxx', 'gray235', 'red196')

  call s:fgbg('Error', 'gray235', 'red196')
  call s:underline_fgbg('Search', 'gray254', 'gray235')

  call s:fgbg('Folded', 'blue37', 'gray237')

  " ^P (completion) menu
  call s:fgbg('Pmenu', 'gray232', 'gray246')
  call s:fgbg('PmenuSel', 'gray232', 'green28')
  call s:bg('PmenuSbar', 'gray234')
  call s:bg('PmenuThumb', 'gray232')

  " Visual selections
  call s:bg('Visual', 'green22')
  hi VisualNOS term=bold,underline cterm=bold,underline gui=bold,underline

  " Tone this one down a bit. The color lowers contrast and is too obtrusive.
  call s:bg('Conceal', 'gray235')

  " https://github.com/bitc/vim-bad-whitespace
  call s:fgbg('BadWhitespace', 'gray238', 'yellow58')

  call s:fg('detailedConstant', 'green34')

  call s:bold_fg('detailedClass', 'purple126')
  call s:fg('detailedModule', 'purple126')
  call s:fg('detailedDefine', 'green23')
  call s:fg('detailedInclude', 'purple53')
  call s:fg('detailedDeclaration', 'yellow100') " Originally for go lang
  call s:fg('detailedDeclType', 'green37') " Originally for go lang

  call s:bold_fg('detailedFunction', 'blue27')

  call s:fg('detailedInstanceVariable', 'blue75')

  call s:fgbg('detailedString', 'purple125', 'gray233')
  call s:fgbg('detailedInterpolatedString', 'purple126', 'gray233')
  call s:bold_fgbg('detailedExecutedString', 'green34', 'purple53')
  call s:fgbg('detailedRawString', 'red160', 'gray233')
  call s:fg('detailedStringDelimiter', 'blue33')
  call s:fg('detailedInterpolationDelimiter', 'gray244')

  call s:fg('detailedRegexpSpecial', 'seafoam')

  call s:fg('detailedRegexpCharClass', 'basic8_green')
  call s:fg('detailedRegexpQuantifier', 'yellow148')
  call s:bold_fg('detailedRegexpEscape', 'purple90')
  call s:fg('detailedRegexpAnchor', 'purple90')
  call s:fg('detailedRegexpDot', 'green34')
  call s:bold_fg('detailedRegexpDelimiter', 'red88')
  call s:fgbg('rubyRegexp', 'red160', 'gray233')
  call s:fg('detailedASCIICode', 'green71')

  call s:fg('detailedPseudoVariable', 'purple125')
  call s:fg('detailedInteger', 'purple134')
  call s:fg('detailedFloat', 'purple132')
  call s:bold_fg('detailedImaginary', 'purple139')

  call s:fg('detailedBlockArgument', 'blue87')
  call s:fg('detailedSymbol', 'lavender104')
  call s:bold_fg('detailedBlockParameter', 'basic8_cyan')
  call s:fg('detailedBlockParameterList', 'blue25')
  call s:bold_fg('detailedPredefinedConstant', 'green22')
  call s:bold_fg('detailedPredefinedVariable', 'blue37')
  call s:fg('detailedBoolean', 'purple131')
  call s:fg('detailedOperator', 'green123')
  call s:fg('detailedAccess', 'yellow100')
  call s:fg('detailedAttribute', 'orange178') " attr_{accessor,reader,writer}
  call s:fg('detailedEval', 'yellow190')

  " Blocks:
  " (basic)
  call s:fg('detailedMethodBlock', 'green114')
  call s:fg('detailedBlock', 'purple225')
  call s:fg('detailedBlockExpression', 'orange180')
  " (conditionals)
  call s:fg('detailedControl', 'orange178')
  call s:bold_fg('Conditional', 'basic8_yellow')
  call s:bold_fg('detailedConditionalModifier', 'yellow148') " 'Yoda if'
  call s:fg('detailedConditionalExpression', 'light_yellow230')
  " (loops)
  call s:bold_fg('detailedRepeat', 'orange178')
  call s:bold_fg('detailedRepeatModifier', 'yellow149') " …while/until
  call s:fg('detailedRepeatExpression', 'orange222')

  call s:fg('detailedSharpBang', 'gray251')
  " hi rubyMultilineComment cleared
  call s:fg('detailedDataDirective', 'purple201')
  call s:fg('detailedData', 'gray245')

  call s:bold_fg('detailedDirective', 'green22')

  "* `fail`/`raise`/`exit` were yellow by default, but here a more warny orange.
  call s:fg('Exception', 'orange208')
  "* class `@@vars` get ugly, cautionary color: they are troublesome.
  call s:fgbg('rubyClassVariable', 'blue75', 'red52')
  "* global `$vars` also get a bit of ugliness. Everyone knows they're iffy.
  call s:fgbg('rubyGlobalVariable', 'red161', 'gray234')

  " rails.vim niceness:
  call s:fg('detailedRailsARAssociationMethod', 'teal50')

  " detailed.vim especialties:
  call s:fg('detailedInitialize', 'green84')
  hi link detailedEncodingDirective detailedDirective

  hi link detailedExits Exception
endfun

fun! s:diff_syntax_and_highlights()
  " vimdiff uses Diff*
  call s:bg('DiffChange', 'gray240')
  call s:bg('DiffText', 'gray232')
  call s:bg('DiffAdd', 'green23')
  call s:bg('DiffDelete', 'yellow58')
  " ft=diff syntax uses diff*
  call s:fg('diffAdded', 'green34')
  call s:fg('diffRemoved', 'yellow58')
  " diffFile
endfun

fun! s:c_syntax_and_highlights()
  hi link cRepeat detailedRepeat
  hi link cUserLabel detailedRepeat
  hi link cInclude detailedModule
  hi link cStatement detailedControl " return goto asm continue break
  hi link cConstant detailedConstant
  hi link cNumber detailedInteger
  " Since the C details came after Ruby, the names could be redone a bit:
  hi link cIncluded detailedString
  hi link cStructure detailedClass
  hi link cStorageClass detailedClass
  hi link cOperator detailedDefine
endfun

fun! s:go_syntax_and_highlights()

  " hi link goBlock detailedBlock
  hi link goDirective detailedDirective
  hi link goDeclaration detailedDeclaration
  hi link goDeclType detailedDeclType
  hi link goConstants detailedBoolean
  hi link goStatement detailedControl
  hi link goRawString detailedRawString
  hi link goImaginary detailedImaginary
  hi link goSpaceError BadWhitespace
endfun

fun! s:vim_syntax_and_highlights()
  hi link vimFuncKey detailedDefine
  hi link vimFunction detailedFunction
  "hi link vimFuncBody detailedDefine
endfun

fun! s:javascript_syntax_and_highlights()
  hi link javascriptFunction detailedDefine
  hi link javascriptIdentifier Type
  hi link javascriptRailsFunction detailedInstanceVariable
endfun

fun! s:detailed_syntax_addtions()
  call s:detailed_colors()

  " TODO - somehow make the detail{Todo,Fixme,Xxx} work for non-ruby langs.
  " E.g., shTodo overrides them, so it will need something like:
  " syn match   rubyComment   "#.*" contains=rubySharpBang,rubySpaceError,
  "     \rubyFirstAndSecondCommentLine,detailedTodo,detailedFixme,detailedXxx,@Spell
  syn keyword detailedTodo TODO contained
  syn keyword detailedFixme FIXME contained
  syn keyword detailedXxx XXX contained
endfun
call s:detailed_syntax_addtions() " Hrm, can this not be done with aucmd?

fun! s:ruby_syntax_and_highlights()
  " Steal this back from the too-generic 'rubyControl':
  syn match detailedExits "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|trap\)\>[?!]\@!\)"

  " TODO: also handle %(…), etc
  syn region detailedInterpolatedString matchgroup=detailedInterpolatedStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial,@Spell fold
  " TODO: Also, %x(). Anything else?
  syn region detailedExecutedString matchgroup=detailedExecutedStringDelimiter start="`" end="`"  skip="\\\\\|\\`"  contains=@rubyStringSpecial fold

  " The default syntax/ruby.vim gets this way wrong (only does 2 chars and is
  " transparent):
  syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]*" contains=NONE display
  " Bonus!
  syn match rubyInitialize '\<initialize\>' contained containedin=rubyMethodDeclaration

  syn match rubyEncodingDirective "\cencoding: *utf-8" contained

  " TODO - make this more elegant.
  syn match rubyFirstAndSecondCommentLine '\%^#.*'
        \ contains=rubyEncodingDirective contained
  syn match rubyFirstAndSecondCommentLine '\%^#.*\n#.*'
        \ contains=rubyEncodingDirective contained

  syn match   rubyComment   "#.*" contains=rubySharpBang,rubySpaceError,
        \rubyFirstAndSecondCommentLine,detailedTodo,detailedFixme,detailedXxx,@Spell

  hi link rubyConditional  Conditional
  hi link rubyExceptional  rubyConditional " No-show.
  hi link rubyMethodExceptional  rubyDefine " And another.
  hi link rubyStringEscape  Special
  hi link rubyQuoteEscape  rubyStringEscape
  hi link rubyInvalidVariable  Error
  hi link rubyNoInterpolation  rubyString " E.g. \#{} inside a string.
  hi link rubyException   Exception
  hi link rubyKeyword     Keyword
  hi link rubyConstant detailedConstant
  hi link rubyEncodingDirective detailedEncodingDirective
  hi link rubyInitialize detailedInitialize
  hi link rubyRailsARAssociationMethod detailedRailsARAssociationMethod
  hi link rubySpaceError BadWhitespace
  hi link rubyData detailedData
  hi link rubyDataDirective detailedDataDirective
  hi link rubyDocumentation  Comment
  hi link rubyComment Comment
  hi link rubyFirstAndSecondCommentLine rubySharpBang
  hi link rubySharpBang detailedSharpBang
  hi link rubyDoBlock rubyRepeatExpression
  hi link rubyRepeatExpression detailedRepeatExpression
  hi link rubyRepeatModifier detailedRepeatModifier
  hi link rubyRepeat detailedRepeat
  hi link rubyCaseExpression rubyConditionalExpression
  hi link rubyConditionalExpression detailedConditionalExpression
  hi link rubyConditionalModifier detailedConditionalModifier
  hi link rubyControl detailedControl
  hi link rubyBlockExpression detailedBlockExpression
  hi link rubyBlock detailedBlock
  hi link rubyMethodBlock detailedMethodBlock
  hi link rubyEval detailedEval
  hi link rubyAttribute detailedAttribute
  hi link rubyAccess detailedAccess
  hi link rubyBeginEnd    Statement " TODO
  hi link rubyPseudoOperator  rubyOperator " -= /= **= *= etc
  hi link rubyOperator detailedOperator
  hi link rubyBoolean detailedBoolean
  hi link rubyPredefinedVariable detailedPredefinedVariable
  hi link rubyPredefinedConstant detailedPredefinedConstant
  hi link rubyBlockParameterList detailedBlockParameterList
  hi link rubyBlockParameter detailedBlockParameter
  hi link rubySymbol detailedSymbol
  hi link rubyBlockArgument detailedBlockArgument
  hi link rubyFloat detailedFloat
  hi link rubyInteger detailedInteger
  hi link rubyPseudoVariable detailedPseudoVariable
  hi link rubyASCIICode detailedASCIICode
  hi link rubyRegexpDelimiter detailedRegexpDelimiter
  hi link rubyRegexpDot detailedRegexpDot
  hi link rubyRegexpAnchor detailedRegexpAnchor
  hi link rubyRegexpEscape detailedRegexpEscape
  hi link rubyRegexpQuantifier detailedRegexpQuantifier
  hi link rubyRegexpCharClass detailedRegexpCharClass
  hi link rubyRegexpComment Comment
  hi link rubyRegexpSpecial detailedRegexpSpecial
  hi link rubyInterpolationDelimiter detailedInterpolationDelimiter
  hi link rubyStringDelimiter detailedStringDelimiter
  hi link rubyInstanceVariable detailedInstanceVariable
  hi link rubyFunction detailedFunction
  hi link rubyInclude detailedInclude
  hi link rubyDefine detailedDefine
  hi link rubyModule detailedModule
  hi link rubyClass detailedClass

  " Only linked highlights, not actual syntax:
  " call s:make_obvious('rubyIdentifier')
  " call s:make_obvious('rubyError')

  " Pretty much just the leftover default:
  " call s:make_obvious('rubyLocalVariableOrMethod')

  " Gets all [{()}] within any {}'s. Not very useful AFAICT:
  " call s:make_obvious('rubyCurlyBlock')

  " These mess up on first ] of [a[1]]. Seems plain busted.
  " call s:make_obvious('rubyArrayDelimiter')
  " call s:make_obvious('rubyArrayLiteral')

  " Mere implementation details, AFAICT:
  " call s:make_obvious('rubyNestedParentheses')
  " call s:make_obvious('rubyNestedCurlyBraces')
  " call s:make_obvious('rubyNestedAngleBrackets')
  " call s:make_obvious('rubyNestedSquareBrackets')
  " call s:make_obvious('rubyDelimEscape')
  " call s:make_obvious('rubySymbolDelimiter')

  " No-show: call s:make_obvious('rubyMethodDeclaration')
  " Not quite sure why these don't show up:
  " call s:make_obvious('rubyRegexpParens')
  " call s:make_obvious('rubyRegexpBrackets')
  " XXX no clue why this wont show up: call s:make_obvious('rubyHeredocStart')
  " TODO: fix these: call s:make_obvious('rubyAliasDeclaration2')
  "                  call s:make_obvious('rubyAliasDeclaration')
  " TODO! call s:make_obvious('rubyClassDeclaration')
  "       call s:make_obvious('rubyDeclaration')
  " call s:make_obvious('rubyModuleDeclaration')
  " TODO: call s:make_obvious('rubyOptionalDo')
  " TODO: call s:make_obvious('rubyOptionalDoLine')
endfun
" }}}

" Rainbow-Parens Improved {{{
" Inlined from v2.3 of http://www.vim.org/scripts/script.php?script_id=4176
" 1. to remove the external dep, 2. to work around vim-rails resetting it.
" Thanks!
fun! s:fatpacked_rainbow_parens()
  let guifgs = exists('g:rainbow_guifgs')? g:rainbow_guifgs : [
        \ 'DarkOrchid3', 'RoyalBlue3', 'SeaGreen3',
        \ 'DarkOrange3', 'FireBrick',
        \ ]

  " From Pharo Smalltalk:
  " Black, Green, Purple, Maroon, LightGreen, Orange, Red, Blue
  let ctermfgs = exists('g:rainbow_ctermfgs')? g:rainbow_ctermfgs : [
        \ '241', '22', '56', '124', '72', '166', '126', '38', ]

  let max = has('gui_running')? len(guifgs) : len(ctermfgs)

  let cmd = 'syn region %s matchgroup=%s start=/%s/ end=/%s/ containedin=%s contains=%s'
  let str = 'TOP'
  for each in range(1, max)
    let str .= ',lv'.each
  endfor
  for [left , right] in [['(',')'],['\[','\]'],['{','}']]
    for each in range(1, max - 1)
      exe printf(cmd, 'lv'.each, 'lv'.each.'c', left, right, 'lv'.(each+1) , str)
    endfor
    exe printf(cmd, 'lv'.max, 'lv'.max.'c', left, right, 'lv1' , str)
  endfor

  for id in range(1 , max)
    let ctermfg = ctermfgs[(max - id) % len(ctermfgs)]
    let guifg = guifgs[(max - id) % len(guifgs)]
    exe 'hi default lv'.id.'c ctermfg='.ctermfg.' guifg='.guifg
  endfor
endfun
" }}}

let &cpo = s:save_cpo

" vim:foldmethod=marker