" twilight256 color scheme file " Maintainer: Neal Milstein - neal dot milstein at gmail dot com " Last Change: 2011 Feb 1 " " This theme copies the colors from the TextMate theme Twilight. " " The theme is designed to be used on a black background. I only tested it " using a 256-color terminal; I do not think it will work on much else (gvim, " 8-color terminal, etc.). " " The functions in this theme that convert hex color codes to the nearest " xterm-256 color number are from the theme desert2 (desert256), developed by Henry So, Jr. " " The colors of this theme are based on the TextMate Twilight theme " – www.macromates.com " " CUSTOM CHANGES: " 2014.04.14: " * Manually set "Normal" ctermbg to 235 (or #262626) " * Set "NonText" and "SpecialKey" to "Comment" colour " " 2014.05.23: " * Set "StatusLineNC" to a dark grey. This way I get a light grey on the " currently active window and the other windows have darker statuslines. " Makes it easier to see visually where my cursor is. " " 2014.05.25: " * Set "CursorLine" to be a bit lighter than the background. Previously " there was no highlighting definition for this and it defaulted to an " underline. " " 2020.04.29: " * Set "CursorLineNr" to remove the underline. This appeared after " upgrading to Vim 8.2. " " 2020.06.03: " * Use a lighter grey for comments to increase contrast and make text " easier to read. " " 2023.12.08: " * Use darker background colours for DiffAdd, DiffChange, and DiffText to " increase contrast and reduce vibration relative to the foreground " text. This makes the text with diff highlighting easier to read. " set background=dark if version > 580 " no guarantees for version 5.8 and below, but this makes it stop " complaining hi clear if exists("syntax_on") syntax reset endif endif let g:colors_name="twilight256" if has("gui_running") || &t_Co == 88 || &t_Co == 256 " functions {{{ " returns an approximate grey index for the given grey level fun grey_number(x) if &t_Co == 88 if a:x < 23 return 0 elseif a:x < 69 return 1 elseif a:x < 103 return 2 elseif a:x < 127 return 3 elseif a:x < 150 return 4 elseif a:x < 173 return 5 elseif a:x < 196 return 6 elseif a:x < 219 return 7 elseif a:x < 243 return 8 else return 9 endif else if a:x < 14 return 0 else let l:n = (a:x - 8) / 10 let l:m = (a:x - 8) % 10 if l:m < 5 return l:n else return l:n + 1 endif endif endif endfun " returns the actual grey level represented by the grey index fun grey_level(n) if &t_Co == 88 if a:n == 0 return 0 elseif a:n == 1 return 46 elseif a:n == 2 return 92 elseif a:n == 3 return 115 elseif a:n == 4 return 139 elseif a:n == 5 return 162 elseif a:n == 6 return 185 elseif a:n == 7 return 208 elseif a:n == 8 return 231 else return 255 endif else if a:n == 0 return 0 else return 8 + (a:n * 10) endif endif endfun " returns the palette index for the given grey index fun grey_color(n) if &t_Co == 88 if a:n == 0 return 16 elseif a:n == 9 return 79 else return 79 + a:n endif else if a:n == 0 return 16 elseif a:n == 25 return 231 else return 231 + a:n endif endif endfun " returns an approximate color index for the given color level fun rgb_number(x) if &t_Co == 88 if a:x < 69 return 0 elseif a:x < 172 return 1 elseif a:x < 230 return 2 else return 3 endif else if a:x < 75 return 0 else let l:n = (a:x - 55) / 40 let l:m = (a:x - 55) % 40 if l:m < 20 return l:n else return l:n + 1 endif endif endif endfun " returns the actual color level for the given color index fun rgb_level(n) if &t_Co == 88 if a:n == 0 return 0 elseif a:n == 1 return 139 elseif a:n == 2 return 205 else return 255 endif else if a:n == 0 return 0 else return 55 + (a:n * 40) endif endif endfun " returns the palette index for the given R/G/B color indices fun rgb_color(x, y, z) if &t_Co == 88 return 16 + (a:x * 16) + (a:y * 4) + a:z else return 16 + (a:x * 36) + (a:y * 6) + a:z endif endfun " returns the palette index to approximate the given R/G/B color levels fun color(r, g, b) " get the closest grey let l:gx = grey_number(a:r) let l:gy = grey_number(a:g) let l:gz = grey_number(a:b) " get the closest color let l:x = rgb_number(a:r) let l:y = rgb_number(a:g) let l:z = rgb_number(a:b) if l:gx == l:gy && l:gy == l:gz " there are two possibilities let l:dgr = grey_level(l:gx) - a:r let l:dgg = grey_level(l:gy) - a:g let l:dgb = grey_level(l:gz) - a:b let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) let l:dr = rgb_level(l:gx) - a:r let l:dg = rgb_level(l:gy) - a:g let l:db = rgb_level(l:gz) - a:b let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) if l:dgrey < l:drgb " use the grey return grey_color(l:gx) else " use the color return rgb_color(l:x, l:y, l:z) endif else " only one possibility return rgb_color(l:x, l:y, l:z) endif endfun " returns the palette index to approximate the 'rrggbb' hex string fun rgb(rgb) let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 return color(l:r, l:g, l:b) endfun " sets the highlighting for the given group fun X(group, fg, bg, attr) if a:fg != "" exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) endif if a:bg != "" exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) endif if a:attr != "" exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr endif endfun " }}} call X("Normal", "ffffff", "", "") " Added 2014.04.15: Set background colour to #262626 manually because it " was displaying as white before. -tw hi Normal ctermbg=235 " highlight groups "call X("Cursor", "708090", "f0e68c", "") "CursorIM "Directory highlight DiffAdd term=bold ctermbg=17 guibg=DarkBlue highlight DiffChange term=bold ctermbg=53 guibg=DarkMagenta "DiffDelete highlight DiffText term=reverse cterm=bold ctermbg=1 gui=bold guibg=Red "ErrorMsg "call X("VertSplit", "c2bfa5", "7f7f7f", "reverse") "call X("Folded", "ffd700", "4d4d4d", "") "call X("FoldColumn", "d2b48c", "4d4d4d", "") "call X("IncSearch", "708090", "f0e68c", "") call X("LineNr", "CCCCCC", "", "") "call X("ModeMsg", "D4D4D4", "", "") "call X("MoreMsg", "2e8b57", "", "") "call X("NonText", "addbe7", "000000", "bold") "call X("Question", "00ff7f", "", "") "call X("Search", "f5deb3", "cd853f", "") "call X("SpecialKey", "9acd32", "", "") "call X("StatusLine", "c2bfa5", "000000", "reverse") "call X("StatusLineNC", "c2bfa5", "7f7f7f", "reverse") "call X("Title", "cd5c5c", "", "") call X("Visual", "D3D3D3", "3E3E3E", "reverse") "VisualNOS "call X("WarningMsg", "fa8072", "", "") "WildMenu "Menu "Scrollbar "Tooltip " Added 2014.05.23: set custom statusline colour. Lighter colour for the " active window and darker colour for others. call X("StatusLineNC", "c2bfa5", "000000", "reverse") " Added 2014.05.25: set colour for cursorline hi CursorLine cterm=none ctermbg=237 " Added 2020.04.29: remove underline on the line number of the current line hi CursorLineNr cterm=none " syntax highlighting groups " Added 2020.06.03 hi Comment ctermfg=7 call X("NonText", "828282", "", "") call X("SpecialKey", "828282", "", "") call X("Constant", "CF6A4C", "", "") call X("Identifier", "7587A6", "", "none") call X("Function", "9B703F", "", "") call X("Define", "CDA869", "", "none") call X("Statement", "CDA869", "", "") call X("String", "8F9D6A", "", "") call X("PreProc", "AFC4DB", "", "") call X("Type", "F9EE98", "", "") call X("Special", "DAEFA3", "", "") "Underlined call X("Ignore", "666666", "", "") "Error call X("Todo", "ff4500", "eeee00", "") " delete functions {{{ delf X delf rgb delf color delf rgb_color delf rgb_level delf rgb_number delf grey_color delf grey_level delf grey_number " }}} endif " vim: set fdl=0 fdm=marker: