Skip to content

Instantly share code, notes, and snippets.

@netj
Created December 5, 2011 02:13
Show Gist options
  • Save netj/1432015 to your computer and use it in GitHub Desktop.
Save netj/1432015 to your computer and use it in GitHub Desktop.
Vim plugin: Switch color schemes (see also http://vim.wikia.com/wiki/VimTip341)
" Change the color scheme from a list of color scheme names.
" Version 2010-09-12 from http://vim.wikia.com/wiki/VimTip341
" Press key:
" F8 next scheme
" Shift-F8 previous scheme
" Alt-F8 random scheme
" Define g:mySetColors from your ~/.vimrc as following:
" let g:mySetColors = split('jellybeans desertEx inkpot darkZ')
" Or,
" Set the list of color schemes used by the above (default is 'all'):
" :SetColors all (all $VIMRUNTIME/colors/*.vim)
" :SetColors my (names built into script)
" :SetColors blue slate ron (these schemes)
" :SetColors (display current scheme names)
" Set the current color scheme based on time of day:
" :SetColors now
if v:version < 700 || exists('loaded_setcolors') || &cp
finish
endif
let loaded_setcolors = 1
if !exists("g:mySetColors")
let g:mySetColors = ['slate', 'torte', 'darkblue', 'delek', 'murphy', 'elflord', 'pablo', 'koehler'] " colorscheme names that we use to set color
endif
" Set list of color scheme names that we will use, except
" argument 'now' actually changes the current color scheme.
function! s:SetColors(args)
if len(a:args) == 0
echo 'Current color scheme names:'
let i = 0
while i < len(g:mySetColors)
echo ' '.join(map(g:mySetColors[i : i+4], 'printf("%-14s", v:val)'))
let i += 5
endwhile
elseif a:args == 'all'
let paths = split(globpath(&runtimepath, 'colors/*.vim'), "\n")
let g:mySetColors = map(paths, 'fnamemodify(v:val, ":t:r")')
echo 'List of colors set from all installed color schemes'
elseif a:args == 'my'
let c1 = 'default elflord peachpuff desert256 breeze morning'
let c2 = 'darkblue gothic aqua earth black_angus relaxedgreen'
let c3 = 'darkblack freya motus impact less chocolateliquor'
let g:mySetColors = split(c1.' '.c2.' '.c3)
echo 'List of colors set from built-in names'
elseif a:args == 'now'
call s:HourColor()
else
let g:mySetColors = split(a:args)
echo 'List of colors set from argument (space-separated names)'
endif
endfunction
command! -nargs=* SetColors call <SID>SetColors('<args>')
" Set next/previous/random (how = 1/-1/0) color from our list of colors.
" The 'random' index is actually set from the current time in seconds.
" Global (no 's:') so can easily call from command line.
function! NextColor(how)
call s:NextColor(a:how, 1)
endfunction
" Helper function for NextColor(), allows echoing of the color name to be
" disabled.
function! s:NextColor(how, echo_color)
if len(g:mySetColors) == 0
call s:SetColors('all')
endif
if exists('g:colors_name')
let current = index(g:mySetColors, g:colors_name, 0, 1)
else
let current = -1
endif
let missing = []
let how = a:how
for i in range(len(g:mySetColors))
if how == 0
let random = system('echo $RANDOM') % len(g:mySetColors)
let current = (random != current ? random : (current+1) % len(g:mySetColors))
let how = 1 " in case random color does not exist
else
let current += how
if !(0 <= current && current < len(g:mySetColors))
let current = (how>0 ? 0 : len(g:mySetColors)-1)
endif
endif
try
execute 'colorscheme '.g:mySetColors[current]
break
catch /E185:/
call add(missing, g:mySetColors[current])
endtry
endfor
redraw
if len(missing) > 0
echo 'Error: colorscheme not found:' join(missing)
endif
if (a:echo_color)
echo g:colors_name
endif
endfunction
nnoremap <F8> :call NextColor(1)<CR>
nnoremap <S-F8> :call NextColor(-1)<CR>
nnoremap <A-F8> :call NextColor(0)<CR>
" Set color scheme according to current time of day.
function! s:HourColor()
let hr = str2nr(strftime('%H'))
if hr <= 3
let i = 0
elseif hr <= 7
let i = 1
elseif hr <= 14
let i = 2
elseif hr <= 18
let i = 3
else
let i = 4
endif
let nowcolors = 'elflord morning desert evening pablo'
execute 'colorscheme '.split(nowcolors)[i]
redraw
echo g:colors_name
endfunction
" vim:sw=2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment