Como segunda parte del primer post sobre configuraciones de vim, voy a describir qué tengo ahora mismo en mi ~/.vimrc y plugins que uso. Esta configuración «está viva» y la cambio de vez en cuando. ¿Por qué? Pues porque tus gustos varÃan de vez en cuando y porque siempre descubres cosas nuevas que vas añadiendo o mejorando.
He colgado en github mi configuración al completo basandome en lo explicado en el anterior post. Puedes verlo aquÃ: https://github.com/tatai/vim
Como acabo de comentar, es posible que lo que haya ahora, es diferente de lo que explique aquÃ.
~/.vimrc
Vayamos por partes y poco a poco. Pese a que todas las lÃneas están comentadas, añadiré lo que crea que puede aclarar tras cada trozo de código.
Aclarar que estas opciones son personales y que espero que sean una guÃa para decidir cómo es tú configuración. Sólo probando encontrarás la combinación perfecta.
Muchas de las opciones se dehabilitan poniendo «no» delante de la opción o se habilitan quitando ese mismo «no», como por ejemplo se puede ver en la primera de las lÃneas, con «set nocompatible» que indica que no sea compatible y con «set compatible» se hace que sea compatible.
set nocompatible
Obligatorio, debes tenerla como tu primera opción en .vimrc puesto que el funcionamiento de interno de vim y de muchos plugins varÃa. Se obliga a que vim no sea compatible con el antiguo «vi».
" Pathogen
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()
Llamadas para inicializar Pathogen (ver el primer post)
" UTF-8 by default
set fileencoding=utf-8
Forzamos que la codificación del documento sea utf-8
" Background will always be black
set background=dark
Me encanta la consola negra y asà seguirá siendo 🙂
" Show ruler
set ruler
" Show current combination of keystrokes
set showcmd
Información sobre la posición, columna y posición del cursor en la página. Además, mostrar la combinación de teclas que estemos realizando.
" I like wrapping lines in vim
set wrap
Activamos que el texto no continúe más allá del borde derecho de la ventana (o split) en el que esté.
" 1 tab = 4 spaces
set tabstop=4
" Same for autoindenting
set shiftwidth=4
" Use tabs, not spaces for indenting
set noexpandtab
" Indenting
set autoindent
set smartindent
set copyindent
" Insert tabs on the start of a line according to shiftwidth, not tabstop
set smarttab
" Use multiple of shiftwidth when indenting with '<' and '>'
set shiftround
Uso de tabs en vez de espacios y definir que el espacio de un tab equivale a 4 espacios. Además, que la indentación sea «inteligente» y cuando por ejemplo usamos {, se indente automáticamente y al hacer escribir }, haga lo contrario.
" Show matching parenthesis
set showmatch
Ayuda a ver los bloques en códigos complicados. Además, pulsando % cuando estamos sobre uno de ellos, automáticamente salta al otro 😉
" Do not show line numbers (hate them)
set nonumber
No mostrar los números a la izquierda, en el lateral. Estoy muy acostumbrado a mirar al ruler y usar :n para ir a una lÃnea. Además, es más cómo cuando copias seleccionando con el ratón y pegas en otro sitio.
" I like case-sensitive searching, but this is the best of both worlds:
" search is case-insensitive but it is not when using at least one capital
set ignorecase
set smartcase
Me gusta buscar y que distinga mayúsculas y minúsculas, pero activando estas dos opciones, por defecto busca sin distinguir, pero si cualquiera de las letras es mayúscula, entonces sà que hace distinción.
" Do not highlight searchs
set nohlsearch
Cuando buscas algo, no marcar los resultados. Me marea mucho que cuando busco algo, empiece a marcar toda la pantalla. En caso de necesitarlo, lo activo momentáneamente, pero me gusta desactivado.
" Commands to be rememebered
set history=500
Vim y su potencia de historial de comandos. Prefiero una lista más larga que los 20 por defecto, que no ocupa nada en disco.
" Undo levels
set undolevels=1000
Deshacer en un fichero «casi» infinito 😉
" Change terminal title
set title
Cambia el tÃtulo del terminal para que muestre el path y fichero que se está editando. Comodidad.
" Like beeping
set novisualbell
set noerrorbells
Ni avisos visuales ni sonoros ante errores.
" Swap file save my work many times :)
set swapfile
Crear el fichero de intercambio .[nombrefichero.ext].swp porque no es la primera vez que consigo recuperar mi trabajo gracias a él. A veces son molestos estos ficheros, pero podemos definir un directorio donde se crean todos, en vez de justo en el mismo sitio que el fichero.
" Disable folding
set nofoldenable
Prefiero ver el texto completo, sin recoger.
" Custom filetype configuration
filetype plugin indent on
autocmd filetype yaml set shiftwidth=2 tabstop=2 expandtab
Activamos indentaciones distintas según tipo de fichero y defino que los YAML tengan espacios en vez de tabs y con un tamaño de dos (asà lo requiere el formato YAML)
" No syntax highlighting
syntax off
No me gusta el syntax highlighting. Y cuando te acostumbras a ello, luego todo te da igual y ves antes los errores (menos cuando te dejas un comentario sin cerrar, jeje)
" Use F2 when pasting to avoid applying indents
set pastetoggle=<F2>
Opción muy interesante cuando usamos indentación automática. Si pegamos texto (por ejemplo código), vim piensa que sabemos escribir muy muy rápido y si hemos definido, como efectivamente he hecho antes, que haga indentación automática, si el texto que estamos copiando también lo lleva, el efecto que provoca es bastante desagradable. Con esta opción, definimos que, pulsando la tecla de función F2 en modo INSERT, activamos el modo paste (pegar) de modo que deshabilita momentáneamente estos indentados. De esta forma, conseguimos que el texto se pegue como realmente queremos.
" When line wrapping is enabled this make that when pressing up or down goes
" the visual line up or down, not physical line
" I only enable it sometimes
"nnoremap j gj
"nnoremap k gk
Estas lÃneas no las tengo activadas, pero las guardo para acordarme. Vim considera que cuando le das hacia arriba, bien sea pulsando la k en modo comando o bien la tecla arriba si asà lo tenemos mapeado, irá de lÃnea en lÃnea. Al estar activado «wrap lines», lÃneas muy largas ocuparán visualmente varias lÃneas, pero no fÃsicamente. Vim por defecto irá de lÃnea fÃsica en lÃnea fÃsica. Activando (descomentando) estas lineas, provocaremos un comportamiento más «natural» ya que al movernos entre lÃneas lo haremos entre las lÃneas visuales. No lo activo por costumbre ya que me parece más cómodo. Viene muy bien cuando editamos ficheros con pocos saltos de lÃnea (dumps de SQL, csv, etc)
" Easy change between splits
map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l
Mapeos de teclas que uso mucho. Usando splits, para moverme entre ellos uso Control+[h|j|k|l] en vez de Control+w + [h|j|k|l]
" When you forget to sudo
" http://forrst.com/posts/Use_w_to_sudo_write_a_file_with_Vim-uAN
cmap w!! w !sudo tee % >/dev/null
Si alguna vez olvidas hacer sudo editando un fichero, para que no tengas que salir y volver a hacerlo 😉
" Mappings for FindFile & config
nmap , :FindFileSplit
nmap ; :FindFileCache .
let g:FindFileIgnore = ['*.o', '*.pyc', '*/tmp/*', 'cache_*', '*.swp']
Mapeos y configuración de FindFile. La coma para buscar fichero, punto y coma para que indexe y añado que no indexe fichero que empiecen por cache_ ni terminen en .swp
Plugins
Algunos plugins de vim que considero bastante útiles. Iré añadiendo más en posteriores posts.
Pathogen
Creo que queda poco por añadir. Plugin que te permite organizar el resto de tus plugins de modo que cada plugin ocupa una carpeta distinta dentro de ~/.vim/bundle/ en vez de juntarlos todos en sus correspondientes carpetas en la carpeta raÃz ~/.vim/
De esta forma, añadir o quitar plugins consta simplemente de añadir o quitar toda una carpeta.
FindFile
Este plugin permite recopilar todos los ficheros y poder abrir ficheros usando autocompletado. A partir del directorio donde nos encontramos, le decimos a FindFile (usando :FC) que rastree todos los ficheros y que guarde una relación de todos ellos con el lugar exacto donde se encuentran. Entonces, usando :FS o :FF (dependiendo si queremos que el fichero lo abra en un nuevo split horizontal o no) podremos ir escribiendo el nombre del fichero y automáticamente nos dará todas las posibilidades.
Lo primero que tenemos que tener en cuenta es estar en el directorio adecuado. Para ello, nos ayudaremos de unos comandos cuya funcionalidad es igual a la de la consola:
- :pwd nos dice el directorio en el que nos encontramos
- :cd para cambiar de directorio. Tenemos que indicar el directorio al que queremos ir. El autocompletado mediante tab ayudará mucho
Yo tengo mapeada la tecla ; (punto y coma) a :FC y , (coma) a :FS para trabajar con más rapidez.
Este plugin tiene un par de limitaciones que me parecen bastante importantes y hay que tener en cuenta.
La primera es que el autocompletado funciona letra a letra desde el principio del nombre del fichero. No valen comodines. No es muy crÃtica, pero algunas veces viene muy bien poder hacerlo.
La segunda es que no guarda el resultado de :FC en ningún sitio y hay que ejecutarlo cada vez que usamos vim. Esto es un engorro si hay muchos ficheros ya que estaremos varios segundos hasta que podamos empezar a trabajar.
NERDTree
Si te gusta el sistema de ficheros, tanto directorios como ficheros con forma de árbol, este es tu plugin. Tecleando :NERDTree abrirá un split vertical a la izquierda a todo lo alto mostrando los directorios y ficheros al estilo :Sex, pero con la diferencia de poder abrir y cerrar los directorios en vez de entrar a navegar por ellos. Usando la tecla o sobre cualquier fichero, lo abrirá en la ventana que tenÃamos activa antes de abrir NERDTree y si usamos la i, lo hará en un split horizontal distinto, de modo que la antigua ventana siga disponible.
En cualquier momento podemos cerrar este árbol y volverlo a abrir. Además, puede sustituir a :Sex sin ningún problema y es realmente cómodo.
snipmate
Para poder insertar snippets en vim. Tan sencillo como escribir una palabra clave y al pulsar tab, insertará el snippet. Flexible y potente. Además, se definen zonas de modo que, tras insertar el snippet, usando el tab podemos ir de uno a otro y asà completar toda la información. Cada zona tiene un texto por defecto.
El vÃdeo demo os aclarará completamente su funcionamiento.
Gracias a que el plugin se encuentra en github, en vez de usar directamente este plugin, lo que he hecho ha sido hacer un fork del proyecto en mi cuenta y usar este como plugin. Esto me permite cambiar y añadir snippets manteniendo siempre el repositorio original como referencia. Realizando un simple merge, puedo actualizar todos los cambios del plugin original. Esto evidentemente añade un paso más a todo el proceso explicado en el post anterior ya que primero tengo que actualizar mi fork con el repo oficial y segundo, actualizar el submodule, pero a cambio obtengo independencia total y compatible a cambios con el repo original.
sparkup
Este plugin me ha parecido muy curioso y potente, pese a que no escribo mucho HTML. Para explicarlo, es más fácil ver el vÃdeo demo, pero rápidamente diré que permite definir con una sintaxis muy sencilla el código HTML a generar y él se encargará automáticamente.
Por ejemplo, escribiendo:
ul.menu > li*2 > a > span < < <
y pulsando Control+e, generará:
<ul class="menu">
<li>
<a href="#">
<span></span>
</a>
</li>
<li>
<a href="#">
<span></span>
</a>
</li>
</ul>
Y muchas más opciones. Además, podremos ir editando cada una de las zonas de forma sencilla usando tab.
<li><a href=»#»><span></span></a></li>