Saltar al contenido principal

Cómo configurar Vim y su configuración recomendada

Dónde esta el fichero de config de vim

Lo primero que tienes que saber es que Vim no tiene algo como vscode para configurar el editor de forma cómoda. Vim usa su propio fichero de config que tienes que modificar a mano.

Para el caso de Vim este fichero se encuentra dentro de tu carpeta personal y se tiene que llamar .vimrc.

Para el caso de Línux sería tal que así:

~/.vimrc

Mientras que el de Neovim estaría en:

~/.config/nvim/init.vim

Para el caso de Windows estaría en:

`C:/Users/<TU USUARIO>/_vimrc`

En Mac debería estar aquí, aunque no lo tengo claro porque no uso Mac:

/usr/share/vim/vimrc

Si no tienes este fichero creado lo tienes que crear de forma manual.

La configuración que uso en mi día a día

Para no andar explicando cada config que tiene Vim porque es mucha, voy a explicar directamente la config que tengo en mi Vim y luego ya modificas tú lo que necesites.

Tengo que aclarar que yo tengo dos configs, una para vim asecas y otra para neovim. Esto es así porque al principio usaba vim y luego me pasé a neovim.

La config para neovim es la misma que para vim asecas, solo que tienes que poner alguna línea menos.

Por cierto, si ves en la config dobles comillas " significa que es un comentario, en este artículo voy a poner comentarios con el nombre del fichero de config que uso para diferenciar entre vim y neovim

IMPORTANTE: Voy a dejar de lado los plugins, ya que para eso existe el artículo de Plugins interesantes para Vim y Neovim. Entre los plugins se encuentra uno para poder tener autocompletado en Vim como el del vscode, por si has entrado en este artículo buscando eso.

También te recomiendo que eches un ojo al artículo de Configuración de Vim para frontend 🚧 y al de Temas de color recomendados para Vim 🚧.

Config general

Lo primero que tengo en mi .vimrc (vim asecas) es lo siguiente:

" .vimrc
set nocompatible

Esto lo que hace es anular la compatibilidad con Vi, el editor antiguo del que se basa Vim. En neovim no necesitas poner esta línea en la config.

También tengo justo debajo esta línea:

" .vimrc
set history=1000

Esta opción lo que hace es aumentar la cantidad de comandos y de cosas que guarda Vim para que luego puedas volver atrás, por defecto es de 20. En neovim esta línea no la tengo en la config porque no es necesaria.

Luego tengo esta línea que lo que hace es que la terminal dibuje mejor el color de fondo, ya que con ciertos temas de color el fondo de la terminal solo se dibuja en la línea con texto. Más info en este issue

" .vimrc
let &t_ut=''  " To render properly background of the color scheme

Una vez más, esta líena no la tengo en el fichero de neovim, pero si en el de vim asecas.

Config de ficheros

Una cosa muy recomendable es desactivar los ficheros swap que crea Vim ya que son muy molestos. Los ficheros swap lo que permiten es que aunque cierres Vim puedas volver atrás a cambios anteriores y que no pierdas el fichero original.

Hoy en día esto no es muy recomendable porque por cada fichero se va a crear un fichero swap en el proyecto, recomiendo mejor usar un sistema de control de versiones como git.

Para desactivar los ficheros swap, en el vimrc tengo estas 3 líneas (esto tampoco te hace falta si usas neovim).

" .vimrc

set nobackup
set nowritebackup
set noswapfile

La siguiente líena que tengo en mi .vimrc sirve para poder usar el backspace del teclado en modo insert en cualquier sitio:

.vimrc
set backspace=indent,eol,start    " backspace everywhere in insert mode

La línea anterior tampoco la tengo en mi config de neovim, supongo que porque tampoco hará falta.

Las siguientes líneas de la config tienen que ver con el identado:

".vimrc y init.vim

set autoindent " autoindent always ON.
set expandtab " expand tabs
set shiftwidth=2 " spaces for autoindenting
set softtabstop=2 " remove a full pseudo-TAB when i press <BS>

El autoident sirve a la hora de crear nuevas líenas en el fichero, que dependiendo de donde la crees te meta indentado de forma automática.

Con expandtab lo que hago es transformar los tabs del identado en espacios (cuestión de gustos), y con shiftwidth y softtabstop configuro los espacios para que sean por defecto de 2 espacios (no te preocupes porque luego puedes definir que para x lenguaje se aplique una config de 4 o de 8), por ejemplo:

autocmd BufRead,BufNewFile *.java setlocal shiftwidth=4 softtabstop=4

Para el caso de vim asecas también tengo esta config (en neovim no hace falta):

" .vimrc
set encoding=utf-8          " always use unicode
set hidden                  " to hide warning when opening files
set ignorecase              " to ignore case in searchs

Como dicen los comentarios con la primera línea le digo a vim que abra los ficheros en UTF-8, con la segunda línea desactivo un warning molesto al abrir un fichero y tener el actual sin guardar y en la última línea le digo a vim que las búsquedas las haga sin tener en cuenta las mayúsculas y minúsculas. Toda esta config no es necesaria en neovim.

La siguiente config la añadí recientemente. Se trata de una opción que lo que hace es añadir un márgen de unas líneas cuando haces scroll bajando o subiendo el cursor por la pantalla (no me mola que el cursor esté en la última línea de la pantalla al bajar por ejemplo). Esta config también la tengo en neovim.

" .vimrc y init.vim
set scrolloff=8               " Keep at least 8 lines below cursor

Config de interfaz

Sobre la config de interfaz y de UI lo primero que tengo es una opción para habilitar los números relativos. Esto de los números relativos lo que hace es que a la izquierda, en lugar de salirte los números de la línea, te salen de forma relativa, es decir:

https://jeffkreeftmeijer.com/vim-number/toggle.gif

Esto sirve para que luego sea más sencillo hacer los saltos de línea, ya que puedes leer directamente el número sin tener que hacer sumas y restas para saber el número de líneas a saltar.

Para activar esto lo tengo así:

" .vimrc y init.vim

set number relativenumber   " Relative numbers for jumping
set nu rnu  "Hybrid. Relative numbers and the current line number

También tengo esta config para que a la hora de dividir la pantalla en varios ficheros a la vez, siempre se abran a la derecha y abajo. Echa un ojo también al artículo de Splits en vim 🚧.

" .vimrc y init.vim

set splitbelow splitright   " Set the splits to open at the right side and below

También tengo esta opción para mejorar un pelín el rendimiento, lo que hace es desactivar el fold (el plegado y desplegado, las típicas flechitas de otros editores para contraer funciones), como no lo uso pues lo quito.

" .vimrc y init.vim

set foldmethod=manual "To avoid performance issues, I never fold anything

También relacionado con la performance tengo este par de opciones para hacer que la terminal se pinte cuando se necesite y para aprovechar las ventajas de las terminales rápidas.

" .vimrc y init.vim

set lazyredraw
set ttyfast

Para el caso particular de vim asecas también tengo esta config en esta sección:

" .vimrc

set showmatch      " higlight matching parentheses and brackets
set wildmenu       " enable visual wildmenu
set nohlsearch     " clear highlight after a search

La primera opción lo que hace es que cuando te pongas con el cursor sobre un paréntesis o llave, automáticamente te señala el de cierre (o el de apertura si estás en el de cierre).

Con wildmenu lo que consigues es que tengas un pequeño autocompletado de los comandos que escribes con los dos puntos, por ejemplo cuando escribes :color y le das al Tab.

La última opción es para que al buscar cosas en un fichero, cuando navegues a los resultados se borre el higlight, ya que me pone muy nervioso que se mantenga cuando ya he buscado algo.

Config de macros y atajos

Por último vamos a ver la config que tengo de atajos de teclado que uso habitualmente.

Lo primero es saber que tengo la tecla leader usando la coma por comodidad. La tecla leader se suele usar para crear otros atajos, por lo que a partir de ahora cuando veas <leader en la config estoy hablando de esta tecla.

" .vimrc y init.vim

let mapleader = ","

Lo primero que tengo es un snippet para poner un console.log(), como lo tengo mapeado con leader pues para meter el console solo tengo que pulsar , , c

Por cierto, cuando veas nmap significa que es un mapeo para el Modo normal de Vim, mientras que los de noremap lo que hacen es anular mapeos anteriores (hacerlos no recursivos).

" .vimrc y init.vim

nmap <leader><leader>c oconsole.log({});<Esc>0t{la

Este mapeo lo tengo desde hace poco y muy contento. Lo que hace es que al escribir de forma normal en modo insertar, si te da por usar las teclas de dirección del teclado, que no cree puntos de guardado, así cuando pulsas u para volver atrás no tiene en cuenta la pulsación de las flechas.

" .vimrc y init.vim

inoremap <Left> <c-g>U<Left>
inoremap <Right> <c-g>U<Right>

También tengo estos comandos para poder mover el cursor entre los splits abiertos a la vez en pantalla.

" .vimrc y init.vim

map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l

Es decir, con los mapeos anteriores puedo pulsar por ejemplo Control + l para moverme al split de la derecha o puedo pulsar Control + k para moverme al de arriba.

Los siguientes comandos son para trabajar con los buffers. Cuando abres varios ficheros en Vim vas abriendo buffers, y para nevegar entre ellos tengo esto:

" .vimrc y init.vim

map <C-d>  :bnext<CR>
map <C-a>  :bprev<CR>
imap <C-D> <Esc>:bnext<CR>a
imap <C-A> <Esc>:bprev<CR>a

Con esto puedo hacer Control + d para ir al buffer anterior y Control + a para ir al buffer siguiente.

Siguientes comandos que tengo:

" .vimrc y init.vim

noremap <silent> <Up> gk
noremap <silent> <Down> gj

Lo que hace es que cuando tienes puesto el editor que haga wrap de las líneas (que si hay una líena muy larga hace un salto de línea "virtual" el editor para que quepa en pantalla), al moverte por las líneas que han saltado puedas hacerlo como si fueran líneas normales.

También tengo estos comandos para poder hacer resize de los splits de manera más comoda:

" .vimrc y init.vim

nnoremap <silent> <Leader>h+ :exe "resize " . (winheight(0) * 5/4)<CR>
nnoremap <silent> <Leader>h- :exe "resize " . (winheight(0) * 4/5)<CR>

nnoremap <silent> <Leader>w+ :exe "vertical resize " . (winwidth(0) * 5/4)<CR>
nnoremap <silent> <Leader>w- :exe "vertical resize " . (winwidth(0) * 4/5)<CR>

Es decir, pulsando , h + lo que hago es aumentar el tamaño del split de forma horizontal, mientras que con , h - lo disminuyo, y lo mismo para el verticual pero usando la w en lugar de la h.

Estos dos son truquitos que he aprendido recientemente.

" .vimrc y init.vim

nnoremap Y y$

nnoremap n nzzzv
nnoremap N Nzzzv
nnoremap * *zzzv

El primero lo que hace es hacer que la letra Y mayúsculas en modo normal se comporte como el resto de letras mayúsculas (como la D por ejemplo).

Las otras líneas sirven para que al hacer búsquedas y usar la tecla n para ir nevegando entre los resultados, siempre se te mantenga el cursor centrado en pantalla.

Por último tengo este comando que lo que hace es que al usar :bd para cerrar un buffer, en caso de que lo tengas abierto a la vez con otro fichero (en un split), al ejecutarlo no te reviente el split.

" .vimrc y init.vim

nnoremap <silent> <C-q> :lclose<bar>b#<bar>bd #<CR>

Fichero completo de config

Te comparto también ambos ficheros con mi config. No he incluído plugins y config de plugins para que no sea un lío.

.vimrc:

" TABLE OF CONTENTS:

" 1. Generic settings
" 2. File settings
" 3. UI
" 4. Maps and functions

"-----------------------------------------
" 1. GENERIC SETTINGS
"-----------------------------------------

set nocompatible " disable vi compatibility mode
set history=1000 " increase history size

"-----------------------------------------
" 2. FILE SETTINGS
"-----------------------------------------

" Stop creating backup files, please use Git for backups

set nobackup
set nowritebackup
set noswapfile
set backspace=indent,eol,start

" Modify indenting settings

set autoindent " autoindent always ON.
set expandtab " expand tabs
set shiftwidth=2 " spaces for autoindenting
set softtabstop=2 " remove a full pseudo-TAB when i press <BS>

" Modify some other settings about files

set encoding=utf-8 " always use unicode
set hidden
set ignorecase
set scrolloff=8 " Keep at least 8 lines below cursor
set foldmethod=manual " To avoid performance issues, I never fold anything so...

"-----------------------------------------
" 3. UI
"-----------------------------------------

set fillchars+=vert:\ " Remove unpleasant pipes from vertical splits

" Sauce on this: http://stackoverflow.com/a/9001540

set wildmenu " enable visual wildmenu
set number " show line numbers
set showmatch " higlight matching parentheses and brackets
set nohlsearch
set lazyredraw
set ttyfast
set hidden

"-----------------------------------------
" 4. MAPS AND FUNCTIONS
"-----------------------------------------

let mapleader=","

" Snippet for console.log
nmap <leader><leader>c oconsole.log({});<Esc>==f{a

" To avoid undo points when using arrow keys
inoremap <Left> <c-g>U<Left>
inoremap <Right> <c-g>U<Right>

" Whit leader p you can delete things without saving to register so you can
" paste what you have before
vnoremap <leader>p "_d

" Make window navigation less painful.
map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l

" Working with buffers is cool.
map <C-d> :bnext<CR>
map <C-a> :bprev<CR>
imap <C-D> <Esc>:bnext<CR>a
imap <C-A> <Esc>:bprev<CR>a

" Capital Y to copy to the end of the line like C or D
nnoremap Y y$

" To move in the search list but keeping the cursor in the middle of screen
nnoremap n nzzzv
nnoremap N Nzzzv
nnoremap * *zzzv

" To close buffers without closing splits
nnoremap <silent> <C-q> :lclose<bar>b#<bar>bd #<CR>

También te dejo la config para neovim, aunque es muy similar simplemente tiene menos cosas.

"------------------------
" General options
"----------------------------

set lazyredraw
set ttyfast
set number relativenumber " Relative numbers for jumping
set nu rnu " Hybrid numbers, you have relative numbers and the current line number

set autoindent " autoindent always ON.
set expandtab " expand tabs
set shiftwidth=2 " spaces for autoindenting
set softtabstop=2 " remove a full pseudo-TAB when i press <BS>

set scrolloff=8 " Keep at least 8 lines below cursor

set foldmethod=manual " To avoid performance issues, I never fold anything so...

set noshowmode " We don't need to know the insert/normal mode casue we have lualine

set ignorecase
set nohlsearch " Clear search highlights

set splitbelow splitright " Set the splits to open at the right side and below


"---------------------------
" Keybindings
"----------------------------


let mapleader = ","

" Snippet for console.log

nmap <leader><leader>c oconsole.log({});<Esc>==f{a

" To avoid undo points when using arrow keys

inoremap <Left> <c-g>U<Left>
inoremap <Right> <c-g>U<Right>

" Whit leader p you can delete things without saving to register so you can

" paste what you have before

vnoremap <leader>p "_d

" Make window navigation less painful.

map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l

" Working with buffers is cool.

set hidden

map <C-d> :bnext<CR>
map <C-a> :bprev<CR>
imap <C-D> <Esc>:bnext<CR>a
imap <C-A> <Esc>:bprev<CR>a

" Move up/down in wrapped lines by display lines

noremap <silent> <Up> gk
noremap <silent> <Down> gj

" To resize window height

nnoremap <silent> <Leader>h+ :exe "resize " . (winheight(0) * 5/4)<CR>
nnoremap <silent> <Leader>h- :exe "resize " . (winheight(0) * 4/5)<CR>

" To resize window width

nnoremap <silent> <Leader>w+ :exe "vertical resize " . (winwidth(0) * 5/4)<CR>
nnoremap <silent> <Leader>w- :exe "vertical resize " . (winwidth(0) * 4/5)<CR>

" Capital Y to copy to the end of the line like C or D

nnoremap Y y$

" To move in the search list but keeping the cursor in the middle of screen

nnoremap n nzzzv
nnoremap N Nzzzv
nnoremap * *zzzv

" To close buffer without closing splits

nnoremap <silent> <C-q> :lclose<bar>b#<bar>bd #<CR>