Dentro del sistema Unix, encontrarás muchos comandos pequeños y muy específicos donde cada uno hace una tarea y la hace eficientemente. Puedes encadenar estos comandos para que funcionen de manera conjunta para dar solución a un problema complejo. ¿No sería genial si pudieras utilizar estos comandos dentro de Vim?
`:r` es el comando de Vim para leer. Si lo utilizas sin `!`, puedes utilizarlo para obtener el contenido de un archivo. Si tienes un archivo llamado `archivo1.txt` en el directorio actual y ejecutas:
Si ejecutas el comando `:r` seguido por un `!` y un comando externo, la salida de ese comando será insertada dentro del _buffer_ actual. Para obtener el resultado del comando `ls`, ejecuta:
Además de para guardar un archivo, también puedes utilizar el comando de escribir \(`:w`\) para pasar el contenido del _buffer_ actual como la entrada estándar \(STDIN\) a un comando externo. La sintaxis es:
Al utilizar el comando `:w`, Vim utiliza todo el texto del _buffer_ actual, de manera similar al comando global \(la mayoría de comandos de la línea de comandos, si no les pasas un rango, solo ejecutan el comando en la línea actual, no en todo el _buffer_\). Si le pasas al comando `:w` una dirección específica:
Existe una sutil pero significativa diferencia entre `:w !node` y `:w! node`. Con `:w !node`, estás "escribiendo" el texto del _buffer_ actual en un comando externo, en este caso `node`. Con `:w! node`, estás forzando a guardar un archivo y dándole el nombre de "node".
Es imperativo pasar un rango para ejecutar el comando externo como un filtro. Si tratas de ejecutar el comando anterior sin el `.` \(`:!tr '[:lower:]' '[:upper:]'`\), verás un error.
Puedes encadenar múltiples comandos con el operador `|` de igual manera que lo haces en la terminal. Supongamos que tenemos un archivo con estos elementos de un delicioso desayuno:
*`!j` ejecuta el filtro operador del comando normal \(`!`\) en la línea actual y la línea inferior. Recuerda que es un operador del modo normal, la regla gramática de `verbo + sustantivo` se aplica en este caso.
*`tr '[a-z]' '[A-Z]'` reemplaza las letras minúsculas con letras mayúsculas.
El filtro del comando normal solo funciona en movimientos u objetos de texto que tengan al menos una línea o más. Si intentas ejecutar `!iwtr '[a-z]' '[A-Z]'` \(ejecutar `tr` dentro de la palabra donde está el cursor\), verás que se aplica el comando `tr` a la línea completa, no a la palabra sobre la que está el cursor.
Vim no es un entorno de desarrollo integrado \(o IDE por sus siglas en inglés\). Es un editor modal ligero que por diseño es altamente extensible. Debido a esa propiedad de ser extensible, tienes un acceso sencillo a los comandos externos de tu sistema. Con esto, Vim está un paso más cerca de convertirse en un IDE. Alguien dijo alguna vez que el sistema Unix es el primer IDE que ha existido.
El comando _bang_ es tan útil como el número de comandos que conozcas. No te preocupes si tienes un conocimiento limitado de los comando externos. Yo también tengo mucho que aprender. Cada vez que necesites modificar un texto, echa un vistazo si existe un comando externo que pueda solucionar tu problema. No te preocupes en dominar todo sobre un comando en particular. Simplemente aprende los que necesites para realizar tu tarea actual.