Editores (Vim)
Escribir palabras en español y escribir código son actividades muy diferentes. Cuando programas, gastas más tiempo cambiando de archivos, leyendo, navegando y editando código en vez de escribir largas secuencias de texto. Tiene sentido que existan diferentes tipos de programas para escribir palabras en español y código (e.g. Microsoft Word comparado con Visual Studio Code).
Como programadores, gastamos la mayoría del tiempo editando nuestro código, por lo que es valioso invertir tiempo en dominar un editor que se ajuste a tus necesidades. Acá esta la forma de cómo aprender un nuevo editor:
- Comenzar con un tutorial (i.e. esta clase, además de otros recursos que te indicamos)
- Usar el editor para todas tus necesidades de edición (incluso si al comienzo te vuelve más lento)
- Investigar a medida que avanzas: si parece que debiera existir una mejor manera de hacer algo, probablemente la haya
Si sigues el método de arriba al pie de la letra, comprometido totalmente a usar el nuevo programa cada vez que tu proposito sea editar un texto, la línea de tiempo para aprender el sofisticado editor de texto será algo como lo siguiente: en una o dos horas, aprenderas lo básico de las funciones de edición como abrir y editar archivos, guardar/salir, y navegar por los buffers. Una vez que lleves 20 horas de práctica, deberías ser igual de rápido como eras con tu antiguo editor. Luego de esto, comienzan los beneficios: tendrás suficiente conocimiento y memoria muscular de tal manera que al usar el nuevo editor ahorrarás tiempo. Los editores de texto modernos son herramientas sofisticadas y poderosas, por lo que el aprendizaje nunca termina: y te volveras incluso más rápido a medida que aprendas más.
¿Qué editor aprender?
Los programadores tienen fuertes opiniones acerca de sus editores de texto.
¿Qué editores son populares hoy? Echa un vistazo a esta encuesta de Stack Overflow (puede haber sesgos debido a que los usuarios de Stack Overflow no necesariamente son una muestra representativa de todos los programadores). Visual Studio Code es el editor más popular y Vim es el editor más popular basado en la consola (línea de comandos).
Vim
Todos los instructores de esta clase usan Vim como editor. Vim tiene una gran historia; fue creado a partir del editor Vi (1976) y aún hasta el día de hoy sigue siendo desarrollado. Vim tiene algunas ideas realmente interesantes detras de él, y por esta razón, muchas herramientas soportan un modo de emular Vim (por ejemplo, 1.4 millones de personas tienen instalado el modo de emulación de Vim para VS code). Es probable que valga la pena aprender Vim incluso si decides finalmente cambiarte a otro editor de texto.
No es posible enseñar todas las funcionalidades de Vim en 50 mínutos, por lo que nos enfocaremos en explicar la filosofía de Vim, enseñarte lo básico, mostrarte algunas de las funcionalidades más avanzadas y darte los recursos necesarios para que domines la herramienta.
La filosofía de Vim
Cuando programas gastas la mayor parte de tu tiempo leyendo, o editando, y no escribiendo. Por esta razón, Vim es un editor modal: tiene diferentes modos para insertar texto y manipular texto. Vim es programable (con Vimscript y otros lenguajes como python) y la interfaz de Vim en sí es un lenguage de programación: teclas designadas (con nombres mnemónicos) que son comandos, y con estos comandos se pueden crear composiciones. Vim evita el uso del mouse porque es muy lento, incluso evita el uso de las flechas del teclado porque requieren de mucho movimiento.
El resultado final de esto es un editor que puede igualar la velocidad a la que piensas.
Modos de edición
El diseño de Vim esta basado en la idea de que la mayor parte del tiempo de un programador se utiliza leyendo, navengado, realizando pequeñas ediciones, contrario a escribir texto de forma regular, en los que se escriben grandes secuencias de texto. Por esta razón, Vim tiene multiples modos para operar:
- Normal: para moverse dentro del archivo y realizar ediciones
- Inserción: para insertar texto
- Remplazo: para reemplazar texto
- Visual (plano, línea o bloque): para seleccionar bloques de texto
- Comando: para ejecutar comandos
Las teclas tienen un significado distinto según el modo en el cuál se esta operando.
Por ejemplo, la letra x
en el modo Inserción solo va a insertar el carácter
‘x’, pero en modo Normal va a borrar el carácter que se encuentra debajo del
cursor, y en modo Visual se borrará todo lo que se encuentra seleccionado.
En la configuración por defecto, Vim te muestra el modo actual abajo a la izquierda. El modo por defecto es el modo Normal. La mayoría de tu tiempo estarás entre los modos Normal e Inserción.
Desde cualquier modo al apretar <ESC>
(tecla escape) regresas al modo Normal.
Desde el modo Normal te puedes cambiar al modo Inserción con la tecla i
.
Para ir al modo Remplazo debes utilizar la tecla R
, al modo Visual con v
,
al modo Visual Línea con V
, al modo Visual Bloque con <C-v>
(Ctrl-V, a veces como ^V
),
y finalmente al modo Comando con :
.
Utilizaras un monton la tecla <ESC>
cuando estes usando Vim: considera reasignar
la tecla bloq mayús a escape (instrucciones para macOS).
Básico
Insertar texto
Desde el modo Normal, presiona la tecla i
para entrar al modo Inserción. Ahora
Vim se comporta como cualquier otro editor de texto hasta que presiones la tecla
<ESC>
para regresar al modo Normal. Esto, con lo básico explicado anteriormente,
es todo lo que necesitar para comenzar a editar archivos usando Vim (aunque no
particularmente eficiente, si estás todo el tiempo editando desde el modo Insertar).
Buffers, pestañas, y ventanas
Vim mantiene un conjunto de archivos abiertos llamados buffers. Una sesión de Vim tiene un número de pestañas, de las cuáles cada una tiene un número de ventanas (paneles separados). Cada ventana muestra un único buffer. A diferencia de otros programas con los que puedes estar familiarizado, como los exploradores web, no hay una correspondencia 1-a-1 entre buffers y ventanas; Las ventanas son simplemente vistas. Un buffer puede estar abierto en múltiples ventanas, incluso dentro de la misma pestaña. Esto puede ser útil para ver diferentes partes de un mismo archivo.
Por defecto, Vim se inicia con una única pestaña abierta y esta contiene una única ventana.
Modo comando (o línea de comandos)
Se ingresa al modo Comando tipeando :
en modo Normal. El cursor se posicionará
en la línea de comandos que se encuentra en la parte inferior de la pantalla
cuando presiones :
. Este modo tiene muchas funcionalidades, incluyendo las de
abrir, guardar y cerrar archivos, además de salir de Vim.
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it.
— I Am Devloper (@iamdevloper) February 17, 2014
:q
salir o cerrar ventana (q
de quit en inglés):w
guardar (w
de write en inglés):wq
guardar y salir:e {nombre del archivo}
abrir un archivo para su edición (e
de edit en inglés):ls
muestra los buffers que están abiertos:help {topic}
abrir ayuda:help :w
abre la documentación del comando:w
:help w
abre la documentación de la tecla de movimientow
La interfaz de Vim es un lenguaje de programación
La idea más importante en Vim es que su interfaz de comando es un lenguaje de programación en sí. Las teclas (con nombres mnemónicos) son comandos, y con estos se puede componer. Lo que permite moverse y editar de manera eficiente, especialmente cuando los comandos son asimilados por la memoria muscular.
Movimiento
Deberías pasar la mayor parte de tu tiempo en modo Normal, usando comandos de movimiento para navegar en el buffer. Los movimientos en Vim son llamados “sustantivos” porque hacen referencia a fragmentos del texto.
- Movimientos básicos:
hjkl
(izquierda, abajo, arriba, derecha) - Palabras:
w
: siguiente palabra (del inglés word)b
: comienzo de la palabra (del inglés begin)e
: final de la palabra (del inglés end)
- Líneas:
0
(comienzo de la línea),^
(primer carácter no en blanco),$
(final de la línea) - Pantalla:
H
(parte superior de la pantalla),M
(parte media de la pantalla),L
(parte inferior de la pantalla) - Desplazarse:
Ctrl-u
(hacia arriba yu
del inglés up),Ctrl-d
(hacia abajo yd
del inglés down) - Archivo:
gg
(comienzo del archivo),G
(fin del archivo) - Número de línea:
:{número}<CR>
or{número}G
(línea {número}) - Misceláneos:
%
(objeto respectivo) - Encontrar:
f{carácter}
,t{carácter}
,F{carácter}
,T{carácter}
- encontrar/ir hacia adelante/ir hacia atras {carácter} sobre la línea actual
,
/;
para navegar entre las coincidencias
- Buscar:
/{regex}
, una vez apretada la tecla enter para buscar, conn
/N
puedes navegar entre las coincidencias encontradas anterior/siguiente respectivamente
Selección
Modo visual (visualización):
- Visual
- Visual Line
- Visual Block
Se pueden usar las teclas de movimiento para realizar selección.
Edición
Todo lo que solías hacer con el mouse, lo puedes hacer con el teclado usando los comandos de edición y a través de los comandos de movimiento. Aquí es donde la interfaz de Vim comienza a parecerse a un lenguaje de programación. Los comandos de edición de Vim también se conocen como “verbos” porque actuan sobre “sustantivos”.
i
entrar al modo Insertar- pero para manipular/borrar texto, quieres usar algo como backspace (tecla retroceso)
o
/O
insertar una línea abajo / arribad{movimiento}
borrar {movimiento}- e.g.
dw
es borrar palabra (dw
de delete word en inglés),d$
es borrar hasta el final de la línea,d0
es borrar hasta el principio de la línea (se combinan con los sustantivos de movimiento vistos arriba comow
,$
y0
)
- e.g.
c{motion}
cambiar {movimiento}- e.g.
cw
es cambiar palabra (cw
de change word en inglés) - es equivalente a usar
d{motion}
seguido dei
- e.g.
x
borrar carácter (equivalente adl
o borrar una posición)s
sustituir carácter (equivalente axi
)- Modo visual + manipulación
- seleccionar texto,
d
para borrarlo oc
para cambiarlo
- seleccionar texto,
u
para deshacer (u
de undone en inglés),<C-r>
para rehacer (lar
es de redo en inglés)y
para copiar / del inglés “yank” (algunos comandos comod
también copian)p
para pegar- Mucho más para aprender: e.g.
~
cambiar de minúsculas/mayúsculas un carácter
Conteo
Puedes combinar sustantivos y verbos con un conteo, esto hará que la acción se realice el número de veces especificado.
3w
moverse 3 palabras hacía adelante5j
moverse 5 líneas hacía abajo7dw
borrar 7 palabras
Modificadores
Los modificadores se pueden utilizar para cambiar el significado de un sustantivo.
Algunos modificares son i
, que significa “interior” o “dentro”, y a
que
significa “alrededor”.
ci(
cambiar el contenido dentro del actual par de paréntesisci[
cambiar el contenido dentro del actual par de paréntesis cuadrados (square brackets)da'
eliminar el texto en comillas simples, incluyendo las comillas a su alrededor
Demo
Aquí una implementación incorrecta del juego infantil fizz buzz:
def fizz_buzz(limit):
for i in range(limit):
if i % 3 == 0:
print('fizz')
if i % 5 == 0:
print('fizz')
if i % 3 and i % 5:
print(i)
def main():
fizz_buzz(10)
Arreglaremos los siguientes problemas:
- La función
main()
nunca es llamada en el programa - El índice comienza en 0 en vez de 1
- Prints “fizz” y “buzz” en líneas separadas para los múltiplos de 15
- Prints “fizz” para múltiplos de 5
- Se fija con código el argumento al llamar a
fizz_buzz
(en 10), esto en vez de tomar el input de la línea de comandos como el argumento
Ve el video de la clase en el mínuto exacto de la demostración. Compara como los cambios de arriba se aplican usando Vim respecto a cómo aplicarías las mismas ediciones usando algún otro programa. Nota que tan pocos tipeos de teclas requiere Vim, permitiendote editar a la velocidad que piensas.
Personalizando Vim
Vim es personalizable a través de un archivo de configuración de texto-plano
en ~/.vimrc
(que contiene comandos Vimscript). Probablemente existen un
monton de configuraciones básicas que quieras activar.
Nosotros proporcionamos una configuración básica bien documentada que puedes
usar como punto de partida. Recomendamos usarla porque arregla alguno de los
comportamientos por defectos raros de Vim. Descarga nuestra configuración aquí
y guardala en ~/.vimrc
.
Vim es altamente personificable y vale la pena gastar tiempo explorando las opciones que se pueden modificar. Puedes dar un vistazo a los dotfiles de personas en GitHub para usarlas como inspiración, por ejemplo, las configuraciones de Vim de los instructores (Anish, Jon (usa neovim), Jose). Existen también muchas entradas de blog sobre estos temas. Intenta no copiar y pegar configuraciones completas de otras personas, sino que leelas y entiéndelas, y toma lo que te sirva.
Extendiendo Vim
Existen cientos de complementos para expandir las funcionalidades de Vim. Contrario
al desactualizado consejo que puedes encontrar en internet, no es necesario
utilizar un gestor de complementos para Vim (desde Vim 8.0). En vez de eso, puedes
utilizar el sistema de gestión de paquetes incorporado en el sistema. Simplemente
debes crear el directorio ~/.vim/pack/vendor/start/
y poner los complementos
ahí (e.g. vía git clone
).
Aquí algunos de nuestros complementos favoritos:
- ctrlp.vim: para busquedas imprecisas de archivos (fuzzy)
- ack.vim: buscador de código
- nerdtree: explorador de archivos
- vim-easymotion: movimientos mágicos
Tratamos de evitar dar una lista abrumadoramente larga de complementos. Puedes revisar en los dotfiles de los instructores (Anish, Jon, Jose) para ver que otros complementos usamos. Revisar el sitio Vim Awesome para más complementos geniales de Vim. Adicionalmente existen cientos de entradas de blog sobre estos temas: solo tienes que buscar por “best Vim plugins” (en inglés se máximiza el contenido de la búsqueda).
Modo Vim en otros programas
Muchas herramientas soportan emular Vim. La calidad varía de buena a excelente; Dependiendo de la herramienta, esta puede no soportar las caracteristicas más elaboradas de Vim, pero la mayoría cubre lo básico bastante bien.
Consola (Shell)
Si eres usuario de Bash, usa set -o vi
. Si usas Zsh, bindkey -v
. Para Fish,
fish_vi_key_bindings
. Adicionalmente, no importa cual consola ocupes, puedes
usar export EDITOR=vim
. Esta es la variable ambiente utilizada para decirle a
la consola cual editor debe abrir cuando un programa requiera uno. Por ejemplo,
git
utilizará Vim como editor para los mensajes de los commits.
Readline
Muchos programas usan la librería GNU
Readline para su
interfaz de línea de comandos. Readline también soporta emular Vim (básica),
la cual se puede activar agregando la siguiente línea al archivo ~/.inputrc
:
set editing-mode vi
Esta configuración permite que, por ejemplo, el REPL de Python soporte las combinaciones de teclas de Vim.
Otros
Existen extensiones para los exploradores web para usar las combinaciones de teclas de Vim - algunos de los más populares son Vimium para Google Chrome y Tridactyl para Firefox. Incluso puedes usar las combinaciones de teclas de Vim con Jupyter notebooks.
Vim avanzado
Aquí algunos ejemplos para demostrar el poder del editor. No podemos enseñarte todo este tipo de cosas, pero las aprenderás a medida que avances. Una buena heurística es: siempre que estés usando el editor y pienses “debe existir una mejor forma de hacerlo”, probablemente exista: búscala en internet.
Buscar y remplazar
:s
(sustituir) comando (documentación).
%s/foo/bar/g
- remplaza foo por bar globalmente en el archivo
%s/\[.*\](\(.*\))/\1/g
- remplaza los hipervinculos con etiqueta en Markdown por URLs planas
Multiples Ventanas
:sp
/:vsp
para dividir la ventana- Puedes tener multiples vistas del mismo buffer
Macros
q{character}
para comenzar a grabar una macro y registrarla en{character}
q
para dejar de grabar@{character}
repetir la macro- Las ejecuciones de macros se detienen por error
{number}@{character}
ejecuta una macro {número} de veces- Las macros pueden ser recursivas
- primero borra la macro con
q{character}q
- graba la macro con
@{character}
para invocarla recursivamente (será una no-op hasta que su grabación sea completada)
- primero borra la macro con
- Ejemplo: convertir de xml a json (archivo)
- Lista de objetos con llaves “name” / “email”
- Usar un programa en Python?
- Usa sed / regexes
g/people/d
%s/<person>/{/g
%s/<name>\(.*\)<\/name>/"name": "\1",/g
- …
- Comandos Vim / macros
Gdd
,ggdd
borra la primera y última de las líneas- Macro para dar formato a un único elemento (register
e
)- Dirigirse a la línea con
<name>
qe^r"f>s": "<ESC>f<C"<ESC>q
- Dirigirse a la línea con
- Macro para dar formato a person
- Dirigirse a la línea con
<person>
qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
- Dirigirse a la línea con
- Macro para dar formato a persona y luego ir a la siguiente persona
- Dirigirse a la línea con
<person>
qq@pjq
- Dirigirse a la línea con
- Ejecutar macro hasta el final del archivo
999@q
- Manualmente remover el último
,
y agregar los delimitadores[
y]
Recursos
vimtutor
es un tutorial que viene instalado con Vim - Si Vim se encuentra instalado deberías poder corrervimtutor
desde tu consola- Vim Adventures es un juego para aprender Vim
- Vim Tips Wiki
- Vim Advent Calendar tiene varios consejos de Vim
- Vim Golf es code golf , pero donde el lenguaje de programación es la interfaz de usuario de Vim
- Vi/Vim Stack Exchange
- Vim Screencasts
- Practical Vim (libro)
Ejercicios
- Completar
vimtutor
. Nota: se ve mejor si la ventana del terminal esta en 80x24 (80 columnas por 24 líneas). - Descargar nuestro vimrc básico y guárdalo en
~/.vimrc
. Leer a través del archivo documentado (usando Vim!), y observa como Vim se ve y comporta un poco diferente con la nueva configuración. - Instalar y configurar el complemento:
ctrlp.vim.
- Crear el directorio para el complemento con
mkdir -p ~/.vim/pack/vendor/start
- Descargar el complemento:
cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
- Leer la
documentación
del complemento. Intenta usar CtrlP para localizar un archivo navegando en el
directorio de un proyecto, abriendo Vim, y usando el modo comando para
comenzar
:CtrlP
. - Personaliza tu Vim modificando el archivo de configuración
~/.vimrc
para que el complemento CtrlP se abrá al teclear Ctrl-P.
- Crear el directorio para el complemento con
- Para que practiques con Vim, rehace la Demo de la clase en tu propio equipo.
- Usa Vim para todas tus ediciones de texto el mes siguiente. Siempre que algo parezca ineficiente, o cuando pienses “debe existir una mejor forma de hacerlo”, intenta Googlear, probablemente exista. Si te quedas entrampado, envíanos un correo.
- Configurar tus otras herramientas para usar las teclas de Vim (ver instrucciones arriba).
- Personaliza aún más tu archivo
~/.vimrc
e instala complementos adicionales. - (Avanzado) Convierte XML a JSON (archivo de ejemplo) usando macros de Vim. Intenta hacerlo por tu cuenta, pero puedes mirar la sección macros más arriba si te quedas entrampado.
Licensed under CC BY-NC-SA.