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=
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 h
map j
map k
map 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á:
Y muchas más opciones. Además, podremos ir editando cada una de las zonas de forma sencilla usando tab.