Vim Tips Wiki
Advertisement

//added by ag@qs.cx Hi,if I have a little time, I will try to clean up this post: generally there is an issue with duplicated color schemes names, I've loaded 150 colo and then i could only view a few because 100 and 110 were the same (but loaded from different path), so there was only short loop between them.

Here some working code:

" Change the color scheme from a list of color scheme names. " Version 2010-09-12 from http://vim.wikia.com/wiki/VimTip341 " Press key: "FIXME: i prefer F2 :P " F2 next scheme " Shift-F2 previous scheme " Alt-F2 random scheme " 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 let s:mycolors = ['slate', 'torte', 'darkblue', 'delek', 'murphy', 'elflord', 'pablo', 'koehler', 'solarized'] " colorscheme names that we use to set color

"FIXME need to use global enumerator let s:current = -1

" 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(s:mycolors)
     echo '  '.join(map(s:mycolors[i : i+4], 'printf("%-14s", v:val)'))
     let i += 5
   endwhile
 elseif a:args == 'all'

" let paths = []

   let paths_tofix = split(globpath(&runtimepath, 'colors/*.vim'), "\n")

" FIXME ag@qs.cx duplicated color schemes - it doesnt - take a look /usr/share/.../murphy.vim and ~/vim/color/murphy.vim " for i in range(len(paths_tofix)) " if index(paths, paths_tofix[i]) == -1 " call add(paths, paths_tofix[i]) " echo paths_tofix[i] " endif " endfor

   let paths = paths_tofix
   let s:mycolors = map(paths, 'fnamemodify(v:val, ":t:r")')

" echo 'List of colors set from all installed color schemes (added ' . len(paths). ' schemes).'

   let g:colorschemes = len(paths)
 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 s:mycolors = split(c1.' '.c2.' '.c3)

" echo 'List of colors set from built-in names'

 elseif a:args == 'now'
   call s:HourColor()
 else
   let s:mycolors = split(a:args)

" echo 'List of colors set from argument (space-separated names)'

 endif

endfunction

command! -nargs=* SetColors call <SID>SetColors('<args>')

"FIXME - i have not chosen my prefered set of colour schemes so i add all of them execute "call <SID>SetColors('all')"

" 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(s:mycolors) == 0
   call s:SetColors('all')
 endif
 let missing = []
 let how = a:how
 for i in range(len(s:mycolors))
   if how == 0
     let s:current = localtime() % len(s:mycolors)
     let how = 1  " in case random color does not exist
   else
     let s:current += how

" echoerr current . '/' . len(s:mycolors)

     if !(0 <= s:current && s:current < len(s:mycolors))
       let s:current = (how>0 ? 0 : len(s:mycolors)-1)
     endif
   endif
   try
     execute 'colorscheme '.s:mycolors[s:current]
     break
   catch /E185:/
     echoerr 'Could not locate colorscheme: ' . s:mycolors[s:current]
     call add(missing, s:mycolors[s:current])
   endtry
 endfor
 redraw
 if len(missing) > 0
   echo 'Error: colorscheme not found:' join(missing)
 endif
 if (a:echo_color)
   echo '[' . s:current . '] ' . g:colors_name
 endif

endfunction


"FIXME my mod - useful when you have 150 colour schemes function! SetColor()

 let s:current = input("Enter number [0," . (len(s:mycolors) - 1) . "]: ")
 try
   execute 'colorscheme '.s:mycolors[s:current]
 catch
   call s:NextColor(1,1)
 endtry

endfunction noremap <F7> :call SetColor()<CR>

inoremap <F2> <ESC>:call NextColor(1)<CR>i inoremap <S-F2> <ESC>:call NextColor(-1)<CR>i inoremap <A-F2> <ESC>:call NextColor(0)<CR>i

nnoremap <F2> :call NextColor(1)<CR> nnoremap <S-F2> :call NextColor(-1)<CR> nnoremap <A-F2> :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





Write the first paragraph of your article here.

Section heading

Write the first section of your article here.

References

Comments

Advertisement