aboutsummaryrefslogtreecommitdiffstats
path: root/colors/twilight256.vim
blob: 83e711455465bfa7da527a261209baf48f47171d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
" 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 <SID>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 <SID>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 <SID>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 <SID>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 <SID>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 <SID>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 <SID>color(r, g, b)
        " get the closest grey
        let l:gx = <SID>grey_number(a:r)
        let l:gy = <SID>grey_number(a:g)
        let l:gz = <SID>grey_number(a:b)

        " get the closest color
        let l:x = <SID>rgb_number(a:r)
        let l:y = <SID>rgb_number(a:g)
        let l:z = <SID>rgb_number(a:b)

        if l:gx == l:gy && l:gy == l:gz
            " there are two possibilities
            let l:dgr = <SID>grey_level(l:gx) - a:r
            let l:dgg = <SID>grey_level(l:gy) - a:g
            let l:dgb = <SID>grey_level(l:gz) - a:b
            let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb)
            let l:dr = <SID>rgb_level(l:gx) - a:r
            let l:dg = <SID>rgb_level(l:gy) - a:g
            let l:db = <SID>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 <SID>grey_color(l:gx)
            else
                " use the color
                return <SID>rgb_color(l:x, l:y, l:z)
            endif
        else
            " only one possibility
            return <SID>rgb_color(l:x, l:y, l:z)
        endif
    endfun

    " returns the palette index to approximate the 'rrggbb' hex string
    fun <SID>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 <SID>color(l:r, l:g, l:b)
    endfun

    " sets the highlighting for the given group
    fun <SID>X(group, fg, bg, attr)
        if a:fg != ""
            exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . <SID>rgb(a:fg)
        endif
        if a:bg != ""
            exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . <SID>rgb(a:bg)
        endif
        if a:attr != ""
            exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr
        endif
    endfun
    " }}}

    call <SID>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 <SID>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 <SID>X("VertSplit", "c2bfa5", "7f7f7f", "reverse")
    "call <SID>X("Folded", "ffd700", "4d4d4d", "")
    "call <SID>X("FoldColumn", "d2b48c", "4d4d4d", "")
    "call <SID>X("IncSearch", "708090", "f0e68c", "")
    call <SID>X("LineNr", "CCCCCC", "", "")
    "call <SID>X("ModeMsg", "D4D4D4", "", "")
    "call <SID>X("MoreMsg", "2e8b57", "", "")
    "call <SID>X("NonText", "addbe7", "000000", "bold")
    "call <SID>X("Question", "00ff7f", "", "")
    "call <SID>X("Search", "f5deb3", "cd853f", "")
    "call <SID>X("SpecialKey", "9acd32", "", "")
    "call <SID>X("StatusLine", "c2bfa5", "000000", "reverse")
    "call <SID>X("StatusLineNC", "c2bfa5", "7f7f7f", "reverse")
    "call <SID>X("Title", "cd5c5c", "", "")
    call <SID>X("Visual", "D3D3D3", "3E3E3E", "reverse")
    "VisualNOS
    "call <SID>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 <SID>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 <SID>X("NonText", "828282", "", "")
    call <SID>X("SpecialKey", "828282", "", "")
    call <SID>X("Constant", "CF6A4C", "", "")
    call <SID>X("Identifier", "7587A6", "", "none")
    call <SID>X("Function", "9B703F", "", "")
    call <SID>X("Define", "CDA869", "", "none")
    call <SID>X("Statement", "CDA869", "", "")
    call <SID>X("String", "8F9D6A", "", "")
    call <SID>X("PreProc", "AFC4DB", "", "")
    call <SID>X("Type", "F9EE98", "", "")
    call <SID>X("Special", "DAEFA3", "", "")
    "Underlined
    call <SID>X("Ignore", "666666", "", "")
    "Error
    call <SID>X("Todo", "ff4500", "eeee00", "")

    " delete functions {{{
    delf <SID>X
    delf <SID>rgb
    delf <SID>color
    delf <SID>rgb_color
    delf <SID>rgb_level
    delf <SID>rgb_number
    delf <SID>grey_color
    delf <SID>grey_level
    delf <SID>grey_number
    " }}}
endif

" vim: set fdl=0 fdm=marker: