Vim: Cómo cambiar entre esquemas de colores!

Publicado por Diego Córdoba en

Hoy vamos a trabajar con los esquemas de colores de Vim para adaptar el coloreado de sintaxis a nuestro gusto en cada lenguaje de programación.


Podemos fácilmente cambiar entre los diferentes esquemas de colores de Vim para encontrar el que mas nos guste en el coloreo de sintaxis!vim

Primero que nada, sepamos que los esquemas de color de _Vim_ nos permiten resaltar la sintaxis de diferentes maneras en nuestros códigos y archivos… y podemos elegir el que nosotros quisiéramos.

Listando esquemas de colores en Vim

Para listar los esquemas de colores instalados en vim, podemos entrar al editor, y escribir «:colorscheme <TAB>» (sin las comillas), es decir, el comando colorscheme, un espacio, y con la tecla tabulador vamos a ir viendo uno por uno todos los colores instalados.

Otra forma, para verlos a todos en lista, podemos escribir, nuevamente «:colorscheme » y luego presionar la combinación «Ctrl+d».

Descargando esquemas de colores

Sepamos también que las configuraciones personales de vim para un usuario determinado se encuentran en el archivo .vimrc de su directorio home, y en los archivos y directorios contenidos en .vim/ también en su home.

Lo primero que haremos será descargarnos un pack de 100 esquemas de colores desde el sitio oficial de Vim accediendo a este enlace:

http://www.vim.org/scripts/script.php?script_id=625

Luego, vamos a mover dicho archivo a nuestro directorio ~/.vim/ de configuración personal del editor, y lo vamos a descomprimir ahí dentro:

diego@sol:~$ mv Downloads/ColorSamplerPack.zip .vim/
diego@sol:~$ cd .vim/
diego@sol:~/.vim$ ls
ColorSamplerPack.zip
diego@sol:~/.vim$ unzip ColorSamplerPack.zip 
Archive:  ColorSamplerPack.zip
   creating: colors/
  inflating: colors/adaryn.vim       
  inflating: colors/adrian.vim       
  inflating: colors/aiseered.vim     
  inflating: colors/anokha.vim       
  inflating: colors/anotherdark.vim  
  [...]
diego@sol:~/.vim$ ls
colors  ColorSamplerPack.zip  plugin

Veremos dos directorios dentro de nuestro .vim/, uno con plugins, y otro con los esquemas de colores.
En el directorio colors/ veremos muchos archivos .vim que son esquemas de colores diferentes.

Un script para automatizar los cambios de esquema

Vamos ahora a crear un archivo de plugin nuevo al que vamos a llamar setcolors.vim, dentro de ~/.vim/plugins/ y que contendrá el siguiente contenido:

" 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
" 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']  " colorscheme names that we use to set color

" 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 = split(globpath(&runtimepath, 'colors/*.vim'), "n")
    let s:mycolors = 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 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 s: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(s:mycolors) == 0
    call s:SetColors('all')
  endif
  if exists('g:colors_name')
    let current = index(s:mycolors, g:colors_name)
  else
    let current = -1
  endif
  let missing = []
  let how = a:how
  for i in range(len(s:mycolors))
    if how == 0
      let current = localtime() % len(s:mycolors)
      let how = 1  " in case random color does not exist
    else
      let current += how
      if !(0 <= current && current < len(s:mycolors))
        let current = (how>0 ? 0 : len(s:mycolors)-1)
      endif
    endif
    try
      execute 'colorscheme '.s:mycolors[current]
      break
    catch /E185:/
      call add(missing, s:mycolors[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

Usando el plugin nuevo

Con el archivo cargado ahora podremos utilizar cualquiera de las funciones escritas, y sus atajos de teclado.
Por ejemplo, si dentro del editor queremos ver la lista de esquemas de colores podemos simplemente ejecutar:

:SetColors

Para cargar todos los esquemas en nuestro editor en esta sesión, podremos correr:

:SetColors all

Y con las siguientes combinaciones de teclas podremos ir probando los esquemas de colores:

F8 – Siguiente esquema de color
Shift+F8 – Esquma de color anterior
Alt+F8 – Un esquema de color aleatorio de la lista

También podremos seleccionar una lista personal de esquemas de color entre la que ciclar, de la siguiente forma, por ejemplo:

:SetColors blue slate ron 
:SetColors

O podremos, en el caso de querer siempre la misma lista de esquemas al iniciar nuestro editor, cambiar en el script propuesto, en la línea 20 aproximadamente, la siguiente línea:

let s:mycolors = ['slate', 'torte', 'darkblue', 'delek', 'murphy', 'elflord', 'pablo', 'koehler']

Por los esquemas que nosotros quisiéramos, y aplicarlos de esta forma:

:SetColors my

Un truco adicional 😀

Si quisiéramos, dentro del editor, y por el único hecho de impresionar a quien nos ve trabajando en Vim, cambiar cada X cantidad de segundos nuestro esquema de color, podríamos correr el siguiente comando:

while 1|sleep 5|call NextColor(1)|endwhile

5 es la cantidad de segundos de espera 😛

Espero les sea útil!

Update 20170202:

Gracias a nuestro amigo Porfilio Andres, de Facebook, por el aporte! Les comparto un link con una serie de schemcolors «para todos los gustos» como dice el 🙂

vimcolors.com

Que lo disfruten!


Fuente: http://vim.wikia.com/wiki/Switch_color_schemes


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador