Hack x Crack Vim

download Hack x Crack Vim

of 66

Transcript of Hack x Crack Vim

  • Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 Espaa.

  • ndice k133

    ndice

    1. Dedicatoria 1

    2. Introduccin 2

    3. Que es VIM ? 3

    4. Instalacin y caractersticas 4

    5. Entorno del editor 5

    6. Prctica con los modos principales 7

    7. Tareas bsicas para tratamiento de texto 10

    8. Campos de actuacin 12

    9. Movimiento por el archivo 15

    10. Movimiento por la lnea 16

    11. Bsquedas 17

    12. Rangos 18

    13. Marcas personalizadas 23

    14. Comandos que pasan a modo insertar 24

    15. Porta-papeles o buffer 25

    16. Expresiones regulares 26

    17. Editando el archivo de configuracin 35

    18. Expresiones regulares 2 37

    19. Pestaas o Tabs 42

    20. Sangrado de lneas 43

    21. Otras caractersticas 4521.1. Explorador de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4521.2. Autocompletar palabras y rutas . . . . . . . . . . . . . . . . . . . . . . . . . 4521.3. Abrir archivos desde el editor y manejos de buffers . . . . . . . . . . . . . . 47

    i

  • ndice k133

    21.4. Ejecucin de comandos de sistema. . . . . . . . . . . . . . . . . . . . . . . . 5021.5. Correccin ortogrfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5321.6. Guardar sesiones enteras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5621.7. Creando nuestros propios Snippets (mapeos) . . . . . . . . . . . . . . . . . . 5621.8. Gestin de pliegues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    22. Conclusin y opinin personal 62

    ii

  • Dedicatoria k133

    1. Dedicatoria

    Quiero agradecer primero a toda la comunidad de www.hackxcrack.es por seguir mante-niendo entre todos el foro, y particularmente a la pequea familia del IRC ;). No me gusta darnombres, pero quiero agradecer a ksha, gran persona y del que he aprendido muchsimo, ya Neutron, un buen amigo que seguro llegar lejos ;).

    k133

    1

  • Introduccin k133

    2. Introduccin

    En este documento vamos a aprender a manejar VIM. Si, ese editor de texto tan difcilque slo nos intenta complicar la existencia ;). La mayora de la gente que no lo ha usadopiensa que es complicado, como ya he dicho, pero que entendemos por complicado ?. Porponer un ejemplo, si usted alguna vez ha jugado a algn juego de ordenador, piense en cuantasteclas debe memorizar, para controlar el juego. Teclas que ni siquiera tienen por qu cumplirun patrn establecido.

    Pues bueno, VIM es similar, la mayora de las teclas tienen su funcin (incluso puedes irtirando el ratn a la basura por que no lo necesitars ;)). No vamos a ver todas ni mucho menos,pero ayuda que su funcin derive de su nombre en ingls. En este documento vas a aprenderlo necesario para hacer de VIM tu editor favorito (y dejar de usar nano ;)).

    La estructura de este documento la dividir en fases de aprendizaje, ya que al igual quetodas las cosas, hay que ir aprendindolas poco a poco. Por lo tanto habr una primera fasedonde explicar los comandos necesarios para poder editar cualquier archivo, y a partir de ahya iremos aadiendo cosas.

    El documento estar enfocado a las expresiones regulares, esto quiere decir que le dedicms espacio que a otras partes, al ser a mi parecer ms importante. A pesar del dicho: "Si inten-tas resolver un problema con expresiones regulares, pasas a tener dos problemas", aplicarlasen VIM es eficiencia pura ;).

    El entorno que usar, donde instalaremos la herramienta y editaremos los archivos de con-figuracin, ser un Debian, ya que los sistemas ms usados actualmente estn basados en ste.Si usas otra distribucin busca el comando apropiado para instalarlo o compilarlo, y localizala ruta de los archivos de configuracin. Una vez dentro del editor, el entorno es igual paratodos.

    Por que deberas aprender a usarlo?, VIM es un editor que consume un mnimo derecursos, y puedes ejecutarlo con tan solo la necesidad de una terminal, en sistemas con o sininterfaz grfica, shell remota, VPS, etc. Es una de las herramientas que todo administradordebe saber usar, porque optimizaras tiempo y esfuerzo. De igual forma puede ser usado comoIDE para programar, y lo mejor de todo, puedes personalizarlo al 100 %.

    Si el editor de texto es una herramienta importante para ti, y eres de los que se preocu-pan por optimizar su trabajo (y si cumpliendo lo anterior an no usas VIM), continualeyendo ;).

    2

  • Que es VIM ? k133

    3. Que es VIM ?

    Espero que con la introduccin os hayis animado. Vim (VI IMproved), en pocas palabras,es una mejora del ya antiguo editor de texto VI. Mejora en el sentido de que adems de hacertodo lo que hace VI, es mas user friendly, y han aadido montones de cosas nuevas, por nohablar de la gran cantidad de plugins (que no veremos) que podemos aadir.

    VIM esta escrito en C, el desarrollador es Bram Moolenaar, y tiene licencia Charityware(compatible con GPL). El editor es compatible con la mayora de los sistemas (MacOS, OS/2,RiscOS, UNIX, DOS, Windows95..NT, *BSD, Linux, etc). Tambin tiene su interfaz grfica,que no vamos a usar.

    VIM es de cdigo abierto, y podris encontrar instalado por defecto (en la mayora de sis-temas) al antiguo VI. Sabiendo usar VIM, tambin sabremos manejarnos en VI, as que nocreis que hay mucha diferencia entre ambos.

    3

  • Instalacin y caractersticas k133

    4. Instalacin y caractersticas

    Para instalar VIM basta con ejecutar:

    # apt-get install vim

    La versin que hay actualmente en Debian Squeeze es la 7.2.x, si lo instalis en sistemasms actualizados como Ubuntu o la Wheezy de Debian, seguramente os venga ya con laversin 7.3.x .

    VIM soporta la codificacin de caracteres UTF-8, con lo cual podremos poner todo tipode caracteres, adems detecta el tipo que tiene el archivo (Dos, Unix, etc). Incluso podemoscambiar la codificacin desde el propio editor.

    Si el archivo que estamos editando esta comprimido (por ejemplo un .tar), tambin lo de-tectar y nos lo descomprime para poder editarlo.

    Los comandos que vayamos ejecutando, nos los va guardando en un historial, al igual queen una terminal. Podremos movernos con las flechas entre los comandos y si escribimos losprimeros caracteres del comando nos buscar en el historial las coincidencias.

    Podemos realizar bsquedas de forma sencilla, incluso realizar una accin para cada apari-cin de la bsqueda.

    Una cosa que hay que tener clara sobre VIM, para saber como trabaja, es que cuandonosotros nos disponemos a editar un archivo, hasta que no ejecutamos el comando de guardar,todos los cambios que estamos haciendo los esta guardando en un buffer (.swp). Por eso cuan-do la mquina se nos apaga inesperadamente el buffer queda ah, y es posible recuperarlo siejecutamos (estando en la misma ruta):

    $ vim -r

    VIM viene con una opcin para el resalto de sintaxis (despus vemos como habilitarlo), ydispone de multitud de archivos de sintaxis para cada lenguaje (ver /usr/share/vim/vim72/syntax/).

    Tambin tiene soporte para el ratn, pero no lo habilitaremos, no pinta mucho usar el ratnen VIM :p.

    Y nos podemos alargar durante todo el documento con las cosas que se pueden hacer enVIM pero ya lo iremos viendo.

    4

  • Entorno del editor k133

    5. Entorno del editor

    Figura 1: Entorno del editor.

    Cuando ejecutamos VIM sin especificar un archivo, veremos la intro como muestra laimagen anterior. Ah ya vemos los primeros comandos importantes, y con los que nos tenemosque ir quedando (luego los vemos).

    Vamos a explicar el entorno, por ahora no toquis nada! :p. En cada lnea no escrita vemosun ~ que marca donde empieza cada lnea; al escribir nosotros, desaparecer. Abajo tenemosuna lnea reservada para el programa (lnea de estado), ah es donde meteremos los comandos,nos mostrar tambin los errores en momentos puntuales, etc.

    Lo que siempre va estar son los campos que vemos actualmente. Abajo en la esquinaderecha nos muestra en que parte del archivo estamos. Puede poner:

    Todo Si estamos visualizando todo el archivo en la pantalla.ComienzoSi estamos viendo el principio del archivo.Final Si estamos viendo la parte final el archivo.XX % La posicin respecto al total (100 %) del archivo en porcentaje.

    Y al lado, un poco ms hacia la izquierda esta el campo que muestra la posicin del cursor.Primero muestra el nmero de lnea en la que estamos, y separado por una coma, el nmerode la columna. Cuando empecemos a escribir, fijaros en como va avanzando la numeracin.Tambin os daris cuenta de que a veces muestra un solo nmero de columna y otras veces

    5

  • Entorno del editor k133

    separa dos nmeros con un guin. Eso se debe a que si introducimos un carcter fuera delASCII (tildes por ejemplo), gracias a la codificacin vemos el carcter correctamente, peroVIM lo interpreta como doble carcter, as que primero pone la columna segn la interpreta,y luego, despus del guin segn la vemos nosotros.

    NotaPuedes obtener ayuda en cualquier momento con el comando :help acompaado de la

    palabra clave que desees buscar. Se abrir una ventana partida que puedes cerrar con elcomando :close .

    Con esto creo que ya sabemos las partes del entorno, as que vamos a por l ;).

    6

  • Prctica con los modos principales k133

    6. Prctica con los modos principales

    Ok, vamos a comenzar la prctica. Recomiendo que os hagis una pequea chuleta con lasteclas que vamos a comentar y su funcin. Por defecto el editor esta en modo comando, paracomenzar a escribir se lo indicamos al editor pulsando la tecla i. En la lnea de estado nosseala que estamos en el modo insertar texto.

    Figura 2: Modo insertar.

    Para volver al modo comando basta con pulsar la tecla (Escape). Es sencillo no?.Una vez que estamos en modo insertar podemos movernos como en cualquier otro editor, conlas flechas, y escribir. Para aclara un poco ms lo que para VIM es un comando, puede sersimplemente la pulsacin de una tecla, por ejemplo, la propia i que pulsamos para entrar amodo insertar es un comando.

    NotaTambin podemos movernos por el texto (estando en modo comando), con las teclas h

    (izquierda), j (abajo), k (arriba), l (derecha).

    Una cosa importante y que en la mayora de documentos se lo saltan, es como deshac-er/rehacer en VIM. A medida que vayis usando VIM, alguna vez os pasar (y el que diga queno miente), que estando en modo comando nos ponemos a escribir tan alegremente, y claro, lamayora de las teclas ejecutan una accin. As que en un momento de descuido hemos podidoborrar palabras, lneas o vete a saber el qu. Para deshacerlo, simplemente nos aseguramos deque estamos en modo comando y pulsamos la letra u tantas veces como sea necesario, he irdeshaciendo cada accin. En la lnea de estado ir poniendo informacin de las acciones queva deshaciendo/rehaciendo.

    En la lnea de estado tambin podemos escribir comandos, pero par ello antes tenemos queponer el carcter : (estando en modo comando obviamente). Entonces veremos como el cursor

    7

  • Prctica con los modos principales k133

    se desplaza hasta esta lnea. As el comando u visto anteriormente para deshacer, equivale aponer :undo. Para rehacer usamos el comando :redo (o la abreviatura :red).

    Al poner estos comandos, podemos ayudarnos del tabulador que ir autocompletando conlos comandos posibles, al igual que ocurre en la terminal del sistema.

    Figura 3: Deshacer/rehacer

    NotaAl rehacer, para no estar escribiendo continuamente :redo, tras ejecutar el comando la

    primera vez, podemos seguir rehaciendo pulsando .

    Y ha estas alturas, lo nico que nos queda para poder decir que podemos editar cualquierarchivo, es saber como guardarlo (o no) y como salir del editor. Guardar un archivo no es msque escribir el buffer en la unidad slida, esto lo hacemos con :write (o la abreviatura :w). Parasalir usaremos :quit (o la abreviatura :q). Si por el contrario queremos salir sin guardar ningncambio usamos el comodn ! (forzar) junto al comando. Quedara as :q!, cierre forzoso.

    NotaPodemos combinar los comandos guardar y salir, nos quedara un solo comando :wq.

    Si hemos iniciado VIM sin especificar algn archivo, debemos poner el nombre al guardarlopor primera vez.

    8

  • Prctica con los modos principales k133

    Figura 4: Guardamos el archivo.

    Figura 5: Tras ejecutar :w mi_archivo

    En la lnea de estado nos muestra el nombre el archivo, en este caso tambin especifica quelo ha creado (Nuevo), el nmero de lneas del archivo, y los caracteres escritos. Cuenta losfinales de lnea y como comentbamos los caracteres fuera del ascii los cuenta como dos.

    9

  • Tareas bsicas para tratamiento de texto k133

    7. Tareas bsicas para tratamiento de texto

    Hagamos un resumen de lo que sabemos hasta ahora. Sabemos diferenciar entre modo in-sertar y modo comando, y sabemos como pasar de un modo a otro. Sabemos diferencia entrecomandos de ejecucin inmediata (ej: i), y los precedidos por : (necesitamos dar al para que se ejecuten). Y hemos visto los comandos para deshacer/rehacer, guardar y salir. Conesto ya podemos editar cualquier archivo.

    Pero como en cualquier otro editor, necesitamos saber tareas bsicas como cortar, copiar opegar. Vamos con ello, el comando para copiar es y, para cortar/borrar d y para pegar es p.

    Entonces si queremos copiar una lnea, usamos el comando yy, si queremos cortar una lneausaremos dd y para pegar, por defecto p lo pega debajo de la lnea donde tenemos el cursor,si queremos que lo pegue encima usamos P (en mayscula).

    Podemos indicar el nmero de lneas que queremos copiar/cortar. Para ello antes de ponerel comando, pulsamos un nmero, as el comando 3yy indica que queremos copiar tres lneas.

    NotaCuando vamos escribiendo el comando, no se muestra en pantalla, as que si crees que

    te has equivocado, pulsa y comienza de nuevo.

    - Vamos a borrar 2 lneas a partir de la posicin del cursor:

    2dd

    Figura 6: Indicaciones del comando.

    10

  • Tareas bsicas para tratamiento de texto k133

    Figura 7: Tras ejecutar 2dd

    - Y ahora pegamos 2 veces el texto cortado, encima de la lnea que nos queda:

    2P

    Figura 8: Tras ejecutar 2P

    11

  • Campos de actuacin k133

    8. Campos de actuacin

    Anteriormente hemos visto como copiar/cortar lneas, pero en VIM no tenemos por quelimitarnos a eso, y si queremos copiar solo unas palabra, o un prrafo, o todo el documento?.Tras ejecutar los comandos para copiar/cortar (y, d), VIM se queda esperando que le digamosque es lo que queremos copiar/cortar. Aqu es donde se empieza a complicar un poco, ya quenecesitamos entender como trabaja VIM.

    Hay varios tipos de campos que llevan asignados una letra, y esto es muy importantesaberlo.

    - Para referirnos a una palabra lo hacemos con w (word). VIM entiende por palabra a unconjunto de caracteres alfanumricos separados por caracteres no alfanumricos ( , :, -, etc)

    - Si nos referimos a una frase completa usamos s (sentence). VIM entiende por frase a unconjunto de caracteres acabados por punto . .

    - Cuando nos referimos a un prrafo, con p (paragraph). El editor entiende por prrafo altexto delimitado por lneas en blanco.

    - Para referirnos al texto encerrado entre parntesis, con b.

    - Para el texto encerrado entre llaves lo haremos con B.

    Y an queda una cosa ms, hemos estado comentando los delimitadores que usa VIM parareconocer cada campo, pues bien tambin debemos indicar si queremos que incluya o no esosdelimitadores. La i representa el campo sin incluirlos, y la a incluyndolos.

    Una vez que sabemos esto, solo tenemos que ir construyendo el comando, por ejemplo,queremos cortar cinco palabras a partir de la posicin del cursor incluyendo delimitadores:

    5 El nmero de palabras.d Comando para cortar.a Incluimos delimitador.w Indicador de palabra.

    5daw

    12

  • Campos de actuacin k133

    Figura 9: Indicaciones del comando.

    Figura 10: Tras ejecutar 5daw

    Otro ejemplo, tenemos una funcin por ejemplo en C, que va entre llaves, queremos eliminartodo el contenido de la funcin dejando las llaves. Estando dentro de la funcin pondremos:

    d Cortari Sin incluir llaves.B Indicador de llaves.

    diB

    13

  • Campos de actuacin k133

    Figura 11: Indicaciones del comando.

    Figura 12: Tras ejecutar diB

    No hace falta que os aprendis de golpe todos los comandos, tened la chuleta a mano pararevisarlos, y a medida que lo usis se os ir quedando.

    w Palabras Frase i Sin incluir.p Prrafo a Incluyendo.b ParntesisB Llaves

    14

  • Movimiento por el archivo k133

    9. Movimiento por el archivo

    Como hemos quedado en no usar el ratn en VIM, estaris pensando tendr que estar fle-chita arriba, flechita abajo todo el rato !?. Obviamente no, en VIM podemos desplazarnos acualquier sitio del archivo en un instante. Vamos a ver algunos de los comandos de desplaza-miento y sera bueno que vayis probndolos sobre la marcha.

    Primero veremos como buscar la lnea que queremos dentro del archivo. Cuando queremosir a la primera lnea del archivo usamos el comando gg, y para ir a la ltima G. Para ir a unalnea concreta primero ponemos el nmero y luego G, quedando 12G para ir a la lnea doce.

    Estos comando son de ejecucin inmediata (sin el :). Tambin podemos desplazarnos auna lnea concreta con :12, en este ejemplo nos desplazamos a la lnea doce, al igual que lohacamos con 12G. Podemos ir al principio del archivo con :0, al igual que con gg y al finalcon :$ al igual que haca G.

    NotaPara hacer scroll, se usan las teclas y .

    Principio gg :0Intermedio 12G :12Final G :$

    15

  • Movimiento por la lnea k133

    10. Movimiento por la lnea

    Una vez que nos encontramos en la lnea que queremos, tenemos mas opciones que la demovernos flechita derecha y flechita izquierda.

    Si antes hemos visto que con :0 y :$ nos movamos entre el principio y el final del archivo,estando dentro de la lnea usaremos lo mismo pero sin los :. As si pulsamos 0 vamos al iniciode la lnea, y si pulsamos $ iremos al final. Al no tener los dos puntos, quiere decir que soncomandos de accin inmediata, nada ms pulsarlos realizan la accin.

    Y para movernos dentro de la lnea podemos ir de palabra en palabra. Recordamos queel campo palabra esta asignado a la letra w, pues bien pulsando w avanzaremos hasta lasiguiente palabra y pulsando b (before) nos movemos a la palabra anterior. Al igual que enotros comandos, podemos especificar el nmero de palabras que queremos avanzar o retro-ceder, poniendo un valor numrico antes del comando. Por ejemplo con 5w avanzamos cincopalabras.

    Principio palabra Final0 b w $

    16

  • Bsquedas k133

    11. Bsquedas

    Otra forma de movernos por el documento es a travs de las bsquedas. Como en la mayorade editores de texto, nos busca coincidencias de la string que hemos especificado. En VIM,para iniciar una bsqueda pulsaremos /, a partir de ah el cursor pasa a la lnea de estado(abajo), y podremos escribir la string que queremos buscar. Tras pulsar el cursorse posicionar en la siguiente aparicin de esa string en el documento. Si queremos hacer unabsqueda hacia atrs debemos iniciarla con ? en vez de /.

    Tras realizar la bsqueda podemos seguir movindonos a las siguientes coincidencias conn, o a las anteriores con N. Por ejemplo /texto inicia la bsqueda de la palabra texto hacaadelante, y ?texto hacia atrs.

    La bsqueda tambin admite algunos comodines, pero por ahora con quedarnos con esto essuficiente.

    Existe otro comando que bien puede ir en esta seccin de bsqueda, el comando f (find)nos busca la siguiente aparicin del carcter que indiquemos a continuacin. Por ejemplo sipulsamos fx el cursor se posicionar encima del siguiente carcter x. O si queremos ir al finalde la frase bastara un f. . Para buscar el carcter hacia atrs usaremos la F.

    NotaPor defecto la bsqueda en VIM diferencia maysculas de minsculas.

    Atrs Adelante Anterior Siguiente? / N n

    17

  • Rangos k133

    12. Rangos

    Ahora que ya conocemos un poco ms como movernos por el documento, vamos a vercomo realizar tareas orientadas a esos movimientos. Pondremos de ejemplo el comando cortard. Recordamos que al pulsarlo se queda esperando a que digamos el que queremos cortar.Anteriormente probamos como decirle que borrase distinto campos de actuacin predefinidosen VIM, tales como una palabra w o el contenido entre unas llaves B. Pues bien tambinpodemos indicarle un movimiento, de los que hemos visto.

    As, si pulsamos dG le estamos diciendo que corte desde la lnea en la que estamos hastael final del documento. Y as podemos indicarle cualquier movimiento de los que vimos, dggcortar desde la lnea actual al principio del documento. Imaginaos lo que hace d12G ;).Igualmente, podemos usar los movimientos dentro de la lnea. El comando d$ corta desde laposicin actual del cursor, hasta el final de la lnea. Que har d0 ? .

    Incluso podemos especificar el movimiento con una bsqueda, por ejemplo el comandod/texto cortar desde la posicin actual del cursor, hasta la prxima aparicin de la palabratexto (sin incluirla).

    Lo mismo podemos hacer con otros comandos como el de copiar y. Hay ms tipos demovimientos (ms especficos), pero no los voy a nombrar porque, a mi parecer, no son efi-cientes para la mayora de usuarios. Vamos a ver unos ejemplo:

    - Queremos cortar desde la posicin actual hasta el final del archivo.

    dG

    Figura 13: Indicaciones del comando.

    18

  • Rangos k133

    Figura 14: Tras ejecutar dG

    - Queremos cortar desde la posicin actual hasta el final de la lnea:

    d$

    Figura 15: Indicaciones del comando.

    19

  • Rangos k133

    Figura 16: Tras ejecutar d$

    - Aqu queremos cortar desde la posicin actual hasta la siguiente aparicin de la palabraParrafo 3:

    d/Parrafo 3

    Figura 17: Indicaciones del comando.

    20

  • Rangos k133

    Figura 18: Tras ejecutar d/Parrafo 3

    Estos comandos son de actuacin inmediata, menos el que usa la bsqueda que tenemos quepulsar , pero tambin podemos especificar rangos de actuacin algo ms complejossi usamos los comandos precedidos por :. Como ya hemos visto, al pulsar : el cursor pasa ala lnea de estado, y recordamos que tambin vimos algunos movimientos como :$ para ir alfinal del archivo.

    Debemos aadir otros dos caracteres especiales que nos sern de utilidad, % que representatodas las lneas del documento, y . que indica la lnea actual. Pues bien vamos a ver algunosde los rangos ms relevantes en estos ejemplos:

    - Para cortar una sola lnea:

    :12 d

    - Para cortar la lnea actual:

    :. d

    - Para cortar de principio a fin del documento (varias formas):

    :0,$ d

    :1,$ d

    : % d

    21

  • Rangos k133

    - Para cortar desde la lnea actual al principio del documento.

    :0,. d

    - Para cortar desde la lnea actual hasta 3 lneas ms:

    :.,+3 d

    Tambin podemos especificar bsquedas en este tipo de comandos, por ejemplo vamos aborrar las lneas entre dos bsquedas, en concreto desde la cadena Parrafo 2, hasta la cadenaParrafo 3:

    :/Parrafo 2/,/Parrafo 3/ d

    Figura 19: Indicaciones del comando.

    Figura 20: Tras ejecutar :/Parrafo 2/,/Parrafo 3/ d

    22

  • Marcas personalizadas k133

    13. Marcas personalizadas

    VIM nos permite la libertad de definir nuestras propias marcas, y situarlas en la posicinque queramos. Luego, podremos usar estas marcas para definir rangos como lo hemos hechoanteriormente. Para definir una marca lo haremos con el comando m, seguido de una letradel alfabeto (ingls). Entonces... podemos definir tantas marcas como letras tiene el alfabeto...unas 26... NO !! no nos olvidemos de que VIM diferencia maysculas de minsculas ;).

    Es ms, las marcas con maysculas tienen un significado especial, y es que se consid-eran globales. En el caso en que estemos editando varios archivos, si en el primer archivohemos definido la marca mA, cualquier movimiento que hagamos a esa marca desde los otrosarchivos, nos mover al archivo donde la definimos. Por lo tanto solo podr haber una marcapor letra en maysculas, y en minsculas tendremos marcas individuales por cada archivo.

    Para referirnos a una marca lo podemos hacer con un apstrofe o con un acento grave `.Con el apstrofe nos estaremos refiriendo al inicio de la lnea donde esta definida la marca,y con el acento grave iremos justo a la posicin dentro de la lnea. Para estos movimientospodemos usar el comando g que vimos anteriormente, as con ga nos moveremos a la lneade la marca. Con el acento grave no se suele usar ya que es ms engorroso (hay que pulsar dosveces para ponerlo).

    Podemos incluir estas marcas en los rangos, por ejemplo:

    - Para cortar desde la lnea con marca a, hasta la actual:

    :a,. d

    - Para cortar desde la marca a a la b.

    :a,b d

    Marcas individuales Marcas globalesa, ..., z A, ..., Z

    23

  • Comandos que pasan a modo insertar k133

    14. Comandos que pasan a modo insertar

    Para hacer un pequeo receso, vamos a ver algn comando interesante, que nos permiterealizar una accin o movimiento y pasar a modo insercin. Estos comando son muy tiles yseguro les vais a dar bastante uso (o eso espero ;)).

    El comando o nos abre una lnea en blanco debajo de la actual, y O por encima. Podemosejecutar el comando estando en cualquier parte de la lnea, adems nos pasa a modo insertar.Podemos usar esto por ejemplo para empezar un nuevo prrafo de forma rpida, sin importardonde esta situado el cursor dentro de la lnea.

    Otro comando bastante til es A, que nos lleva el cursor al final de la lnea actual y pasaa insertar. Este siempre lo suelo utilizar despus de que he tenido que retroceder en la lneapara corregir alguna palabra. Con una sola pulsacin, tenemos el cursor al final de la lnea,preparado para seguir escribiendo. De igual manera, el comando I nos posiciona el cursor alprincipio de la lnea.

    El comando s corta el carcter de debajo del cursor y pasa a insertar. Por ejemplo, si noshemos dejado de poner una tilde, en un solo paso cortamos la vocal y pasamos a modo insertarpara escribir la correccin.

    La mayscula S corta toda la lnea actual y nos deja el cursor en modo insertar. Por ejemplo,si ha mitad de lnea nos damos cuenta de que hemos metido la pata en algo, cortamos todo y haempezar de nuevo. Ahora me viene a la cabeza algo que seguro que os ha pasado alguna vez,que de tanto apretar la tecla backspace nos hemos pasado poco/bastante de lo que tenamospensado borrar. Con VIM esto ya no ser un problema ;).

    Y el comando C que nos corta desde la posicin actual del cursor hasta el final de la lnea,y nos pasa a insertar.

    Estos son los comandos bsicos, los que creo son ms tiles, hay muchos ms (ms es-pecficos), incluso una misma funcin la pueden realizar 2 comandos distintos. Por ejemploel comando cc equivale al comando S, pero es mejor aprender bien unos pocos, y saberlosaplicar a la hora de la verdad ;).

    24

  • Porta-papeles o buffer k133

    15. Porta-papeles o buffer

    Otro arma potente que tiene VIM es el porta-papeles, o mejor dicho, los porta-papeles. Aligual que sucede con las marcas, disponemos de tantos porta-papeles (que en realidad sonbuffers), como letras del abecedario ingls, y tambin habr diferencia entre maysculas yminsculas.

    Primero vamos a ver como definirlo. Nos referiremos al buffer como x, y ir situado antesde colocar el comando. Por ejemplo el comando a5dd, guarda en el buffer a las cinco lneasque cortamos. Si despus queremos recuperar el contenido, por ejemplo pegarlo, bastara hacerun ap.

    Las maysculas tambin tiene un significado especial, no representan buffers propios. Cuan-do especificamos un buffer como puede ser A, lo que har, es aadir el contenido queasignemos, a la letra en minsculas. As siguiendo el ejemplo anterior, donde metimos cin-co lneas en el buffer a, tras ejecutar el comando A3dd, no se sobreescribir el buffer, sinoque se aaden esas lneas. El buffer a pasa a contener ocho lneas.

    Para entenderlo mejor, si nos manejamos algo en la terminal, equivaldra ha hacer una redi-reccin con > (a) o con >> (A) . Tambin hay una serie de buffers especiales, que no veremosaqu, con saber manejar estos nos sobra.

    Buffers (principales) Buffers (agregan)a, ..., z A, ..., Z

    25

  • Expresiones regulares k133

    16. Expresiones regulares

    Y ahora volviendo al tema de operaciones con rangos, hay un comando que se lleva elpremio gordo, el comando sustituir, de forma abreviada :s. Lo que tiene de especial es queadmite el uso de expresiones regulares, muy similar al comando sed en la terminal.

    Como hemos visto anteriormente, primero debemos especificar el rango donde actuar elcomando, luego ira la estructura del comando, vemos un ejemplo:

    - Queremos sustituir la palabra texto, por su cadena espejo otxet, dentro del rangocomprendido entre la marca a y el final del documento.

    Colocaremos la marca en la lnea actual del cursor que vemos en la imagen:

    ma

    Figura 21: Indicaciones del comando.

    Y ahora ejecutamos el comando:

    :a,$ s/texto/otxet/

    26

  • Expresiones regulares k133

    Figura 22: Tras ejecutar el comando.

    Explicaremos la estructura del comando y lo que ha pasado. El comando sustituir consta dedos campos principales; el primero, es el campo que contendr la cadena origen, que admitirregex. Es la cadena que se buscar, y que se sustituir por la cadena contenida en el segundocampo. Ntese que los campos usan un separador, en este caso el carcter /. Pero no tiene queser siempre ese carcter, puede ser cualquier signo de puntuacin o carcter especial (luegovemos un ejemplo).

    Si os habis fijado solo se ha sustituido la primera coincidencia de cada lnea, esto ocurre aspor defecto. Para que se sustituyan todas las apariciones de la cadena origen, debemos aadirel modificador g al final (luego vemos otros tipos de modificadores), veamos como quedara.

    :a,$ s/texto/otxet/g

    Figura 23: Tras ejecutar el comando.

    - Queremos sustituir todas las vocales e del documento por el carcter /.

    27

  • Expresiones regulares k133

    En este caso el carcter de sustitucin ser /, con lo cual si usamos como separador el mismocarcter, nos dar error. Recurriremos entonces a otro carcter, como decamos anteriormente:

    : %s+e+/+g

    Figura 24: Tras ejecutar el comando.

    Como rango hemos, puesto % que recordamos se refiere a todo el documento, y al igual queantes, aadimos la g al final para sustituir todas las apariciones en cada lnea. Pero no estamosobligados a cambiar los caracteres de separacin de campos, podemos anular el significadoespecial del carcter, precedindolo de una contra barra \. El comando anterior lo podremosponer tambin de esta manera:

    : %s/e/\//g

    Antes de continuar vamos a ver lo tipos de comandos o modificadores ms usados, quepodemos aadir al final del comando sustituir.

    c Nos pregunta antes de cada sustitucin, y nos dar las siguientes opciones:y Reemplazarlo.n Pasar a la siguiente coincidencia.a Reemplazar todo (no nos vuelve a preguntar en las coincidencias restantes).CTRL+E Ver mas texto, hacia adelante.CTRL+Y Ver mas texto, hacia atrs.

    g Que sustituya todas las ocurrencias de cada lnea.i Que no sea sensible a maysculas.

    28

  • Expresiones regulares k133

    Vamos a poner un ejemplo del uso de estos modificadores.

    - Primero vamos a sustituir la primera aparicin de la vocal e por la E mayscula. Vamos aponer tambin que nos pida confirmacin.

    : %s/e/E/c

    Figura 25: Tras ejecutar el comando.

    Nos pide confirmacin, podemos ir dando a la y para ir una por una, aunque ya que notenemos inconveniente en sustituir todas, podemos pulsar la a.

    Figura 26: Tras acabar de ejecutarlo.

    29

  • Expresiones regulares k133

    - Ahora sustituiremos tanto la e como la E, por el nmero 5, usando para ello el modificadorpara ignorar diferencias entre maysculas/minsculas.

    : %s/e/5/gi

    Figura 27: Tras ejecutar el comando.

    Que no se nos olvide aadir el g !!!

    Pero esta funcionalidad sera un poco pobre si no hiciramos uso de las expresiones regu-lares. Estas expresiones nos permitirn seleccionar lo que queremos buscar de forma bastanteprecisa. Y es muy recomendable saber usarlo, ya que nos va a ahorrar mucho tiempo, cuandonecesitemos modificar un archivo, o extraer ciertas partes del mismo.

    Primero vamos a definir como llamaremos a los campos del comando sustituir. Aunquetienen ya un nombre establecido, para hacerlo simple lo llamaremos:

    s/campo1/campo2/

    A continuacin vamos a ver una serie de caracteres y expresiones especiales con significa-do. La mayora de ellos son comunes para los diferentes tipos de estndares sobre expresionesregulares, aunque en algn lenguaje pueden variar.

    30

  • Expresiones regulares k133

    \n Salto de lnea (en campo1).\t Tabulador.\s Espacio.\_s Salto de lnea o espacio.\S No espacio.\d Dgito.\D No dgito.\u Maysculas (en campo1). Si esta en campo2 pasa a mayscula el carcter que

    le sigue.\U No maysculas (en campo1). Si esta en campo2 pasa a mayscula los carac-

    teres que le siguen.\l Minsculas (en campo1). Si esta en campo2 pasa a minscula el carcter que

    le sigue.\L No minsculas (en campo1). Si esta en campo2 pasa a minscula los carac-

    teres que le siguen.\E En el campo2 marca cuando acaban el \U y el \L.\r Introduce un salto de lnea (en campo2).^ Principio de lnea.$ Final de lnea.. Cualquier carcter, menos el salto de lnea. Que lo anterior aparezca 0 o ms veces.\+ Que lo anterior aparezca 1 o ms veces.\= Que lo anterior aparezca 0 o 1 vez.

    \{n,m} Que lo anterior aparezca de n a m veces.\{n} Que lo anterior aparezca n veces.\{,m} Que lo anterior aparezca como mximo m veces.\{n,} Que lo anterior aparezca como mnimo n veces.\< Hace referencia al principio de cualquier palabra.\> Hace referencia al final de cualquier palabra.\| Sirve como or

    \( \) Creacin de grupos\1 Contenido del grupo referenciado por su posicin, en este caso ser el primer

    grupo.& Contenido del patrn especificado en el campo1, deberemos ponerlo en el

    campo2.[ab] Posibles caracteres que puede adquirir un nico carcter. Los caracteres espe-

    ciales pierden su significado.[^ab] Posibles caracteres que NO puede adquirir un nico carcter.

    Esto como se aprende es a base de practicar, as que vamos a ver unos ejemplos.

    31

  • Expresiones regulares k133

    - Vamos a coger todas las palabras de 3 caracteres y las vamos a poner en mayscula.

    : %s/\/\U&/g

    Figura 28: Tras ejecutar el comando.

    En el campo1 hemos puesto que busque los inicios de palabra (\). Y en el campo2 ir lasustitucin, en este caso pasar a maysculas (\U), el propio contenido marcado en el campo1,que sern las palabras con tres caracteres que encuentre.

    - Vamos a sustituir las lneas totalmente vacas por unos cuantos guiones a modo de sepa-rador.

    : %s/^$ /---/

    Figura 29: Tras ejecutar el comando.

    32

  • Expresiones regulares k133

    En el campo1 ponemos que la linea empiece (^) y seguidamente que este ya el final ($). Ascogers las lneas que no tengan nada. El campo2 no tiene ningn misterio. Podramos haberdejado la opcin de que la lnea pueda contener 0 o ms espacios en blanco (\s).

    - Vamos a poner en maysculas la primera y la ltima palabra de cada lnea:

    : %s/^\([^ ]\+\)\(.\)\s\([^ ]\+\.\)$ /\U\1\E\2 \U\3/

    Figura 30: Tras ejecutar el comando.

    Vamos por partes, en el campo1 buscamos el inicio de la lnea (^), y creamos tres grupos,dos de ellos contendrn las palabras que queremos poner en mayscula y el otro contendrtodo el texto restante. El primer grupo, delimitado por los parntesis \( \) debe estar en elinicio de la lnea, y coger cualquier carcter que no sea un espacio ([^ ]) y indicamos queeste debe aparecer 1 o ms veces (\+). Dentro del corchete hemos puesto un espacio real, nopodemos usar el carcter especial \s por que dentro no lo interpreta como tal. Cuando llegue aun espacio (terminacin de una palabra), cierra el primer grupo y sigue ejecutando la regex.

    En el segundo grupo cogeremos cualquier carcter (.) y decimos que pueda aparecer 0 oms veces (). Por lo tanto coger el espacio con el que se cerr el primer grupo e ir cogiendocaracteres hasta que encuentre la "seal de stop". Entonces analizar el resto de la regex.

    A continuacin le indicamos que deber parar en un espacio (\s) pero para que sepa en cualde todos, necesita mirar el resto de la regex. Y en el tercer grupo al igual que en el primero, leindicamos que coja caracteres que no sean espacio ([^ ]), que sean 1 o ms (\+), y que finaliceen punto (\.). Con el carcter de final de lnea ($) a continuacin, el tercer grupo seleccionarjusto la ltima palabra de la lnea, y el espacio donde parar el segundo grupo ser el anteriora la ltima palabra. El punto final lo podemos sacar del grupo, pero bueno no habr problemaal pasar a maysculas.

    33

  • Expresiones regulares k133

    En el campo2 ponemos que queremos pasar a maysculas (\U) todos los caracteres delprimer grupo (\1), luego parar de pasar a maysculas (\E). Ponemos el segundo grupo conel texto central segn esta (\2 ), aadiendo el espacio que usamos para marcar la regex en elcampo1. Y pasamos a maysculas (\U) el tercer grupo (\3).

    Como veis, no es ms que ir mirando qu es lo que queremos ir marcando, y aplicarle laregex adecuada. La mayora de errores se producen por fallos en la sintaxis, ya que comohemos visto muchos caracteres necesitan ser escapados con la contra-barra. Por eso ante unerror lo primero mirar que la sintaxis este bien y luego ya ir mirando la regex parte por parte.

    34

  • Editando el archivo de configuracin k133

    17. Editando el archivo de configuracin

    Hasta ahora hemos estado editando archivos con la configuracin estndar del editor, peropodemos hacernos un VIM a medida ;). Vamos a ver una serie de configuraciones que puedenresultarnos muy tiles. El archivo de configuracin se encuentra en /etc/vim/vimrc . El carc-ter usado como comentario es la comilla .

    NotaIMPORTANTE! Al editar el archivo /etc/vim/vimrc estamos aplicando la configu-

    racin para todos los usuarios del sistema, si usted comparte el pc con otras personas ono tiene los permisos suficientes, cree un archivo ~/.vimrc y aada toda la nueva config-uracin en l.

    Para habilitar el resalto de sintaxis, podemos descomentar la lnea que pone syntax on.As segn el tipo de archivo que abramos usar un resalto de sintaxis de los que almacenaen /usr/share/vim/vim72/syntax/. Para quitar el resalto desde el editor podemos lanzar elcomando :syntax off.

    Tambin podemos habilitar la numeracin de las lneas, aadimos al final del archivo setnumber. Para quitar la numeracin podemos ejecutar el comando :set nonumber.

    NotaLa mayora de seteos se niegan aadiendo no delante.

    Seguramente os acordaris que os dije que no podamos ver los comandos de actuacininmediata que bamos tecleando, pues bien era mentira :p. Podemos descomentar la lnea quepone set showcmd, as veremos lo que vamos pulsando. Se muestran en la lnea de estado, ala izquierda de la numeracin de linea,columna.

    Tambin podemos descomentar la lnea set incsearch, as cuando estemos realizando unabsqueda, nos ir buscando en tiempo real mientras escribamos.

    Si aadimos tambin la opcin set hlsearch, que resalta las bsquedas, tenemos una granayuda a la hora de crear la expresin regular. A medida que vayamos escribindola, se irresaltando el texto que marca. Muy muy til ;). Si queremos quitarlo :set nohlsearch.

    35

  • Editando el archivo de configuracin k133

    Si nos dedicamos a programar nos ser muy til la opcin set autoindent, que nos manten-dr la indentacin de una lnea a otra.

    Y para los que estis hartos de los tabuladores (como yo), la opcin set expandtab. Alintroducir un tabulador, en realidad nos lo convierte en espacios, y podemos definir el nmerode espacios que pondr por cada tabulacin con set tabstop=2 (por ejemplo).

    Para habilitar o deshabilitar el ajuste de lnea, tenemos las opciones :set wrap (habilitar) y:set nowrap (deshabilitar).

    Hay muchas ms opciones, mas especificas, que podis investigar si os quedis con ganas.Una vez que hemos aadido las opciones, el editor quedara tal que as:

    Figura 31: Con nuevas opciones.

    Vemos como est la numeracin de lneas y el resalto en las bsquedas.

    36

  • Expresiones regulares 2 k133

    18. Expresiones regulares 2

    Hay otro comando que es incluso ms potente que el de sustituir :s, es el comando global :g.Este comando nos permite buscar lneas que contengan una cadena de texto o una expresinregular sobre un rango especificado, y una vez que encuentra ese texto podremos ejecutar uncomando, incluso podemos ejecutar el propio comando de sustituir dentro de el global.

    El comando global por defecto toma como rango todo el archivo ( %) a diferencia del susti-tuir que tomaba la lnea actual (.). La sintaxis es esta::g/texto/comando

    Vamos a poner unos ejemplos, con su correspondiente explicacin:

    - Queremos eliminar las lneas en blanco de un archivo:

    :g/^\s$ /d

    Figura 32: Tras ejecutar el comando.

    Hemos hecho una bsqueda de las lneas que empiecen (^), pudiendo contener 0 o msespacios en blanco (\s) y terminando seguidamente la lnea ($). Tras lo cual vamos a ejecutarel comando borrar (d) sobre las lnas coincidentes.

    - Vamos a aadir unos caracteres en las lneas con el ttulo del prrafo, al principio y al final:

    :g/Parrafo\s[0-9]\+/s//## & #####/

    37

  • Expresiones regulares 2 k133

    Figura 33: Tras ejecutar el comando.

    En este caso seleccionamos el texto Parrafo, seguido de un espacio (\s) y de uno o msdgitos ([0-9]\+), ya que no sabemos si el nmero de prrafos llega a 9, 20 500. Para se-leccionar los dgitos podamos haber usado el carcter especial \d. En esta ocasin usamos elcomando sustituir, pero en el campo1 no ponemos nada por que al buscar la cadena con :g,hemos seleccionado ya lo que queramos. As que solo queda poner en el campo2 unas almo-hadillas y entre medio el contenido de la bsqueda (&), en este caso no del propio comandosustituir, sino del global.

    - Vamos a corregir el fallo ortogrfico (hecho a posta :p) en la palabra Parrafo:

    :g/Parrafo/s/a//

    Figura 34: Tras ejecutar el comando.

    38

  • Expresiones regulares 2 k133

    En este caso si que hemos especificado en el comando sustituir que queramos cambiar solola a por la , ntese que al no poner el modificador g, solo sustituir la primera aparicin deesa letra (como as queramos).

    An queda otra utilidad por ver sobre el comando global. Nos permite negar una bsqueda,lo que quiere decir que podemos seleccionar lo que NO coincida con la bsqueda. Para ellobasta aadir un !::g!/texto/comando

    - Vamos a guardar las lneas que no estn vacas o las de los ttulos de prrafo, en otroarchivo llamado prueba2:

    :g!/^\s$ \|Parrafo/. w >> prueba2

    Figura 35: Tras ejecutar el comando.

    En la imagen vemos como se guarda el texto correctamente. Una cosa importante, el archivolo tenemos que haber creado antes, ya que si no VIM dar un error al no poder abrir un archivoinexistente. Lo que hacemos aqu es seleccionar las lneas vacas (^\s$) y usamos el indicador\| (or), para indicar otra opcin, en este caso las lneas que contengan la cadena Parrafo.Posteriormente le decimos que la lnea actual (.) la guarde (w), agregndola (>>) al archivoprueba2. Esto ltimo aunque parezca lioso es el comando guardar, donde hemos puesto unrango (la lnea actual) y un archivo donde guardarlo, podis ejecutarlo por separado :. w >>prueba2 para comprobarlo.

    Lo nico que hay que saber es como trabaja el comando global. Este va buscando lneaa lnea y ejecutando el comando en cada lnea que encuentra coincidencia. Por eso el puntoindica la lnea actual donde se encuentre el comando, y esa lnea la llevamos al archivo. De

    39

  • Expresiones regulares 2 k133

    ah la importancia de poner el >>, ya que se realizaran mltiples inserciones al archivo. De locontrario nos salta el error al intentar sobreescribir un archivo. As es como queda el archivo:

    Figura 36: Nuevo archivo creado.

    - Y un ltimo ejemplo, vamos cambiar las ips de un hipottico archivo de logs:

    Figura 37: Falso archivo de logs.

    Tenemos este archivo con ips variadas, y queremos, por ejemplo, cambiar todas a 127.0.0.1.

    40

  • Expresiones regulares 2 k133

    : %s/\(\d\{1,3}\.\)\{3}\d\{1,3}/127\.0\.0\.1/g

    Figura 38: Tras ejecutar el comando.

    En esta expresin regular le decimos, primeramente que debe buscar el contenido de ungrupo \( \) un nmero exacto de veces, en este caso debe aparecer tres veces ({3}). El grupoestar formado por un dgito cualquiera (\d), que puede aparecer de una a tres veces ({1,3}),y por un punto (\.), que ser el punto de separacin de los octetos. Una vez que cogemos lostres primeros campos de la IP, solo nos queda un nmero (\d) que podr aparecer de una atres veces ({1,3}), al igual que antes. En el campo2 ponemos la ip a sustiruir y aadimos elmodificador g por si hay ms de una ip por lnea.

    41

  • Pestaas o Tabs k133

    19. Pestaas o Tabs

    Una de las utilidades que ms me gusta es las posibilidad de abrir pestaas. Nos ahorramucho espacio, al no tener que abrir una terminal nueva. Tendremos a golpe de vista losarchivos que tenemos abiertos, cosa que no ocurre si editamos varios archivos de una vez, conel mtodo que conocamos hasta ahora. El comando es :tabnew archivo, pudiendo especificarel archivo mediante su ruta absoluta o relativa. De igual modo que en la terminal, podemosusar la tecla para ir autocomplentando.

    Figura 39: Archivos en pestaas.

    Como vemos, en la parte de arriba se reserva una lnea para las pestaas. Y solo se ve laprimera letra de cada directorio de la ruta al archivo vimrc. Para ir de una pestaa a otrausamos los comandos gt (siguiente pestaa) y gT (anterior pestaa). Otra ventaja es que pode-mos compartir el porta-papeles, as podemos copiar unas lneas en el archivo a y pegarlasen b.

    42

  • Sangrado de lneas k133

    20. Sangrado de lneas

    Para aplicar un sangrado tenemos el comando > o > o (las cinco lneas siguiente), o unmovimiento por el archivo. Por ejemplo >G aplica un nivel de sangrado desde la lnea actualhasta el final de archivo, si recordamos con G nos movamos la final del archivo. Tambinpodemos especificar una bsqueda, por ejemplo situados en la primera lnea, si queremossubir un nivel al primer prrafo >/^\s$ .

    Figura 40: Tras ejecutar el comando.

    Simplemente le decimos que aplique un nivel desde la posicin actual hasta que encuentreesa bsqueda. Si recordamos, VIM identificaba al prrafo con la letra p, as que podemosahorrarnos trabajo con este comando >ip. Con i le decimos que no coja la lnea en blanco (loque el editor entiende por separacin entre prrafo), y con p le decimos el rango de actuacin(el prrafo actual).

    El resultado ser el mismo, la ventaja es que podemos situarnos en cualquier lnea dentro delprrafo, al ejecutar el comando. Ya os dije que era importante saberse los campos de actuacinpredefinidos por VIM ;).

    NotaPara establecer el nmero de espacios que insertar este comando, aadir al archivo

    de configuracin (/etc/vim/vimrc) la opcin set shiftwidth=2 (por ejemplo). Para que loscambios tengan efecto podemos cerrar y abrir el archivo de nuevo, o lo guardamos yejecutamos :e sin parmetros que volver a abrir el mismo archivo.

    43

  • Sangrado de lneas k133

    Hay una opcin especial para la programacin en C, no se si lo he dicho antes pero VIM estapensado para la programacin, en concreto en C. Y tiene una opcin para el sangrado o au-toindentacin de este tipo de archivos. Debemos aadir al archivo de configuracin: autocmdFileType c setlocal cindent . Definimos as una opcin que se habilitar solo para archivos deC. A mi me gusta, pero ya cada uno que decida.

    44

  • Otras caractersticas k133

    21. Otras caractersticas

    VIM tiene muchas ms posibilidades y utilidades. A continuacin voy a comentar algunasque me parecen interesantes, y que no se han tratado anteriores secciones por que no son al-go de primera necesidad. Este apartado servir como complemento al resto del documento,para aquellos curiosos, que se hayan quedado con ganas de ms ;).

    21.1. Explorador de archivos

    VIM tambin nos sirve como explorador de archivos, quiere decir esto que puede editardirectorios. Podemos lanzar por ejemplo un vim /etc/apt, y nos abrir ese directorio en unapantalla como la de un archivo normal, pero con unas funcionalidades distintas. Primero ten-dremos una cabecera con la ruta donde nos encontramos, como esta ordenando el contenido,una pequea ayuda, y la lista de directorios y archivos que contiene ese directorio. Podemosnavegar por el rbol de directorios, y para editar cualquier archivo nos posicionamos encimay damos , fcil no? ;).

    Figura 41: Modo explorador de archivos.

    21.2. Autocompletar palabras y rutas

    Y otra de las muchas utilidades que nos ayudar, es el autocompletado de las palabras.Pulsando la combinacin CTRL+N mientras escribimos (en modo insertar), se despliega unmen con las posibles coincidencias. La lista de coincidencias las saca a partir de las palabrasque ya hemos escrito anteriormente. Por ejemplo si hemos llamado a una funcin leerAr-chivoDatos, para no tener que escribirlo de nuevo (con el peligro de equivocarnos), pulsamosla combinacin y nos aparece el men donde lo seleccionaremos.

    45

  • Otras caractersticas k133

    Figura 42: Autocompletar palabras.

    Vemos el men que se abri encima de la palabra a autocompletar. Por defecto lo completacon la primera aparicin de la lista, pero basta con movernos por el men y seleccionar la quequeramos.

    Hay bastantes ms combinaciones para el autocompletado, pero una que puede sernos til esCTRL+X CTRL+F. Nos autocompleta el path o ruta que estemos escribiendo, por ejemplo:

    Figura 43: Autocompletar ruta.

    Nos puso por defecto la primera opcin, basta seleccionar la correcta. Al igual que la ante-rior, solo necesita que le pongamos los primeros caracteres y en base a eso nos da la lista conlas posibilidades.

    46

  • Otras caractersticas k133

    21.3. Abrir archivos desde el editor y manejos de buffers

    Otra curiosidad sobre este editor, es que podemos abrir un archivo desde otro, con tansolo tener escrito el path o ruta del archivo en cuestin. El comando que usaremos es gf. Paraentenderlo mejor vemos un ejemplo:

    Figura 44: Archivo inicial.

    Aqu tenemos escrito el archivo prueba2. Este es el nombre de un archivo vlido, si recordiseste archivo le generamos en un ejemplo de expresiones regulares, anteriormente. En este casoal estar en la misma ruta en donde hemos abierto el archivo actual, con ponerlo tal cual so-bra, pero si no debemos especificar la ruta absoluta o la relativa a partir de nuestro directorioactivo. Por ejemplo: /etc/vim/vimrc .

    NotaPara ver cual es el directorio activo, donde estamos, podemos usar el comando :pwd .

    Antes de ejecutar el comando, debemos asegurarnos de que el cursor esta situado sobre elarchivo que queremos abrir. Y tambin debemos guardar el archivo, ya que al abrir el otroarchivo, cerraremos el actual. De todas formas, nos avisar de ello.

    Figura 45: Error al no guardar.

    47

  • Otras caractersticas k133

    Una vez guardado, nos abre el nuevo archivo sin problemas, pero y si queremos volver alinicial ?.

    Figura 46: Archivo prueba2 abierto.

    Si recordamos al principio del documento dije que los archivos realmente son buffers, asque cuando hemos cerrado el archivo, hemos cerrado su buffer, pero este no desaparece de lamemoria. Podemos ver los buffers con el comando :buffers .

    Figura 47: Buffers.

    Como vemos, cada archivo tiene un buffer numerado, seguido de unos caracteres o flags(ahora vemos su significado), seguido del propio nombre y la lnea en la que tenamos elcursor. Los caracteres significan:

    48

  • Otras caractersticas k133

    % Buffer actual.# Buffer cerrado.a Buffer activo (cargado y visible).h Buffer oculto (cargado pero oculto).- Buffer no es modificable.= Buffer con permiso de solo lectura.+ Buffer es modificable.x Buffer con errores de lectura.

    Analizando esos caracteres, vemos que el buffer nmero uno, correspondiente al archivoinicial, tiene el flag de buffer cerrado (como estaba previsto). Los flags del buffer nmerodos, indican que es el actual y es visible. Podemos saltar de un buffer a otro especificando sunmero, por ejemplo con :buffer 1 volvemos a cargar o abrir el primer archivo. Tras ejecutarel comando podemos ver con :buffers, como ahora el primero es el actual, y el segundo estacerrado.

    Retomando el hilo de esta seccin, que por si ha alguno se le olvid, estbamos viendocomo abrir archivos a partir del nombre o ruta directamente escrita en el archivo. El mtodoanterior, con el comando gf, es un poco engorroso ya que nos cierra el archivo para abrir elotro. Hay otra alternativa que posiblemente nos contente ms, y es abrirlo en una ventanapartida.

    Vimos casi al principio del documento como eran las ventanas, si recordis al pedir ayudacon el comando :help, nos abre una ventana. Para abrir un archivo en una ventana, ejecutare-mos el comando CTRL+W CTRL+F (posicionados sobre el nombre del archivo), con laventaja de poder ver los dos archivos, y no cerrar el inicial.

    Figura 48: Archivos en ventana.

    49

  • Otras caractersticas k133

    Aqu vemos los dos archivos, arriba el que hemos abierto. La nueva ventana ocupar la mi-tad de lneas que la inicial. Ahora el archivo donde nos movemos es el que acabamos de abrir.Para cambiar el control a la ventana de abajo, con el archivo inicial, usamos la combinacinCTRL+W seguido de la flecha hacia abajo, o hacia arriba si queremos subir a la ventana dearriba desde la de abajo. Para cerrar cualquiera de las ventanas usamos el comando :close .

    21.4. Ejecucin de comandos de sistema.

    VIM tambin puede ejecutar otro tipo de comandos, diferentes a los de su propio entorno.Podemos ejecutar comandos del sistema, tales como sort, uniq, etc, y todo sin salir deleditor claro ;). Para ello usamos el comando :! , que al igual que los dems le tendremos quepasar un rango de actuacin y el propio comando a ejecutar.

    Para esto hay que tener un poco de idea de los comandos bsico del sistema y de su uti-lizacin. Vamos a ver unos ejemplos, partiendo del archivo que vemos a continuacin:

    Figura 49: Archivo original.

    - Queremos ordenar todo nuestro archivo alfabticamente:

    : %!sort

    50

  • Otras caractersticas k133

    Figura 50: Tras ejecutar el comando.

    Aqu hay poco que explicar, el comando sort realiza esa funcin, y aplicamos el rango atodo el archivo con % .

    - Ahora adems vamos a quitar las lneas duplicadas:

    : %!sort | uniq

    Figura 51: Tras ejecutar el comando.

    En este caso hemos usado una tubera para enlazar los dos comandos necesarios.

    Podemos usar comandos que generen una salida. Pero en este caso sobreescribir el rangoseleccionado, me explico, si seleccionamos un rango de todo el archivo ( %), y ejecutamosel comando echo hola, nos dejar una sola lnea con esa palabra. Para solucionarlo podemosdejar una lnea vaca, y especificar como rango esa nica lnea, que como estar vaca noimporta que lo sobreescriba.

    51

  • Otras caractersticas k133

    Pero esa es la forma cutre ;), para comandos con salida, podemos enlazarlo con el comando:read . Este comando lo que hace es leer de la fuente que nosotros le proporcionemos yescribirlo donde le indiquemos. En nuestro caso queremos que lea desde un comando, vemosun ejemplo:

    - Queremos hacer un listado de los host que estn en nuestra red, partimos de un archivo talque as:

    Figura 52: Archivo original.

    Ahora vamos a ejecutar nmap, junto con read:

    :1read ! nmap -sP 192.168.1.1/24

    Figura 53: Tras ejecutar el comando.

    52

  • Otras caractersticas k133

    Y voil tenemos el reporte hecho ;). Como rango hemos puesto la primera lnea, aspondr la salida a continuacin. Ya segn el nivel de manejo de los comandos, y de la propiaimaginacin de cada uno, le iris encontrando utilidades.

    NotaSe puede abrir temporalmente una shell con el comando :shell . En esta nueva shell,

    podemos trabajar igual que en cualquier otra, pero al cerrarla (con exit) volveremos aleditor.

    21.5. Correccin ortogrfica

    Para ser una buena herramienta de edicin de texto, no poda faltar el corrector ortogrfico.Siguiendo unos sencillos pasos lo tendremos totalmente operativo.

    Primero vamos a aadir lo necesario a nuestro archivo de configuracin /etc/vim/vimrc. Aadiremos el seteo set spell spelllang=es,en al final del archivo (por ejemplo). Comoveis, como lenguaje principal ponemos el espaol (es), y de secundario el ingls (en), ya queactualmente las palabras en ingls, estn a la orden del da.

    Pero an nos quedan cosas que hacer, si intentamos editar algn archivo con esta configu-racin, VIM nos saltar con una advertencia, que nos da una buena pista de lo que nos falta.

    Figura 54: Error por falta de archivos.

    Efectivamente, nos fata por descargar los diccionarios. Primero vamos a crear el directoriodonde se alojarn, y nos situaremos all.

    53

  • Otras caractersticas k133

    Figura 55: Creando el directorio.

    Y ahora descargamos los archivos necesarios, en nuestro caso los dos diccionarios tan-to de espaol como de ingls. Para la codificacin escogemos los utf-8, para un mejor so-porte. Lo podemos obtener en la pagina oficial de VIM, en concreto son: http://ftp.vim.org/vim/runtime/spell/es.utf-8.spl y http://ftp.vim.org/vim/runtime/spell/en.utf-8.spl .

    Figura 56: Descargando los diccionarios.

    Y ya podemos editar cualquier archivo con soporte de correccin ortogrfica. Lo que hares resaltar aquellas palabras que detecte estn mal escritas. Aqu vemos como quedara:

    Figura 57: Resalto de palabras.

    En este caso vemos como las palabras al inicio de lnea o tras un punto, en minsculas, sonresaltadas con azul. Y los dems errores ortogrficos con un tono rosa. A la hora de ver lasposibles sugerencias, tenemos un amplio abanico de comandos, vamos a ver los ms tiles.Todos los debemos ejecutar posicionando el cursor encima de la palabra.

    54

  • Otras caractersticas k133

    Con el comando z= nos da una lista de sugerencias numeradas, para elegir cualquiera deestas, ponemos el nmero y pulsamos .

    Figura 58: Lista de sugerencias.

    Si nos gusta ms los mens, como los de autocompletar, y no queremos estar saliendoa modo comando, podemos usar el comando CTRL+X s . As estando en modo insertarpodemos abrir un men con las sugerencias.

    Figura 59: Men de sugerencias.

    NotaCuando realicemos una correccin, podemos ejecutar el comando :spellrepall , que

    corregir automticamente todas las palabras (mal escritas), que coincidan con la queacabamos de corregir.

    Y para aquellas palabras que no vienen contempladas en la lista, podemos agregarlas con elcomando zg, o si cambiamos de opinin, quitarlas con zw . Por ejemplo la palabra Debianviene como mal escrita, al ser un termino fuera del diccionario, pero la podemos agregar, asen futuros casos, no nos volver a aparecer con el resalto.

    55

  • Otras caractersticas k133

    Figura 60: Palabra aadida a la lista.

    NotaPara movernos entre las palabras mal escritas, podemos usar los comandos ]s (sigu-

    iente), y [s (anterior).

    21.6. Guardar sesiones enteras

    Cuando editamos archivos grandes, en los que tenemos unas cuantas marcas, hemos copi-ado varias lneas en distintos buffers, y no queremos perderlas al cerrar el archivo, podemosguardar toda esa informacin. VIM dispone de un comando para guardar una sesin completacon todos lo registros, marcas, seteos, etc, cuya sintaxis es :mksession . En concre-to, el comando :set sessionoptions contiene todo lo que se guardar. Debemos especificar unnombre para el archivo que se crear con la informacin.

    Para cargar una sesin, una vez abierto el archivo de forma normal, ponemos el comando:source . Tanto al crear el archivo de sesin como al cargarlo, VIM no notifica nadaen la barra de estado, slo si se llegase a producir algn error.

    NotaVIM permite la ejecucin de comandos al lanzar el programa con el parmetro -c .

    Podemos incorporar el comando anterior, si abrimos el archivo con ese parmetro: vim-c :source .

    21.7. Creando nuestros propios Snippets (mapeos)

    Hay muchos comandos dedicados a mapear, dependiendo del modo donde queramos quese haga, o de su recursividad. Vamos a ver un comando que puede ahorrarnos algo de tiempo,

    56

  • Otras caractersticas k133

    a los programadores sobre todo. Puesto que nos interesa que el snippet salte a medida quevamos escribiendo usaremos la opcin inoremap . La i indica el modo insertar, el noreindica que no ser recursivo (si tenemos definidos otros mapeos), y map pues el comandoen s.

    El mapeo lo incluiremos en el archivo de configuracin (vimrc). La sintaxis del comandoes:

    inoremap campo1 campo2

    Donde campo1 es una combinacin de caracteres, que una vez escritos se convertirn enel campo2. Por ejemplo uno sencillito sera este: inoremap { {} . Cuando abramosun corchete, inmediatamente nos lo convierte a la estructura del campo2, que bsicamentelo cierra y nos mueve el cursor un espacio a la izquierda, para que quede entre medio.

    NotaLas teclas se pueden representar, como se ha visto en el ejemplo, para la flecha a la

    izquierda use .

    Aqu una lista de la notacin que usan algunas teclas especiales:

    Flecha arriba .. Teclas de funcin Flecha abajo Insert Flecha izquierda End Flecha derecha Re Pg Escape Av Pg Enter CTRL+ Espacio SHIFT+ Tabulador CTRL+SHIFT+ Backspace Supr

    Esto da muchas posibilidades de cara a hacer nuestros propios snippets, y cada uno seguroque ya esta pensando en como darle uso ;). El ejemplo anterior le podemos refinar, quedandoas:

    57

  • Otras caractersticas k133

    inoremap { {}

    Figura 61: Snippet.

    Como veis no tiene ninguna complicacin, es ir poniendo lo que nosotros haramos, susti-tuyendo las teclas especiales por su notacin. Un ltimo ejemplo:

    inoremap printf printf(,); .

    Figura 62: Otro snippet.

    Ojo, por que si lo definimos tal cual, cada vez que estemos editando cualquier archivo, nosseguir haciendo los mapeos. Por eso lo mejor es especificar cuando queremos que se usen, omejor dicho con que tipos de archivos. Si recordis, cuando vimos la indentacin, haba unaespecial para c, que la metamos en el comando autocmd FileType c . Pues haremos lo mismocon los comandos para el mapeo, nos quedara tal que as:

    autocmd FileType c inoremap { {}

    Esto lo aadimos al archivo de configuracin, por supuesto. As podis ir definiendo mapeospara cada lenguaje de programacin, o bueno para lo que queris, si le echis imaginacin ;).

    58

  • Otras caractersticas k133

    NotaCuando estemos escribiendo el snippet, VIM va evaluando las tecla pulsadas, y puede

    que nos parezca que el texto no se esta escribiendo. Pero ojo, por que si dejamos deescribir o no escribimos el snippet medianamente rpido, dejar de analizar las teclas yel mapeo no tendr efecto.

    21.8. Gestin de pliegues

    Cuando estamos programando, puede que queramos ocultar el contenido de las funciones,o de las variables, con el fin de ver el cdigo ms organizado. VIM tiene muchas opcionesy tipos de pliegues, incluso los podemos personalizar. Pero para seguir un mtodo generalvamos a ver algunos de los tipos de pliegues predefinidos.

    Vamos a empezar por el mtodo quizs mas orientado a la programacin, y es el que se rigeen base a nivel de sangrado. Para ello aadimos en el archivo de configuracin el comando setfoldmethod=indent . Una buena practica en la programacin es aplicar un nivel de sangradoacorde con las funciones y subfunciones que vamos poniendo. Y este mtodo se aprovecha deesta regla no escrita, pudiendo llegar a ser muy til.

    Figura 63: Pliegues segn sangrado.

    Podemos ver en esa imagen dos pliegues, uno en cada funcin, vamos a analizar su estruc-tura. Segn el nivel de pliegue, va a tener ms o menos guiones despus de signo de suma.En este caso los dos son unos pliegues de primer nivel y tienen dos guiones (+--). Si den-tro tuvisemos una funcin con distinto sangrado (un for por ejemplo), tendra un pliegue desegundo nivel, al estar contenido en el principal y se representara con tres guiones al inicio(+---). A continuacin nos indica el nmero de lineas que contiene el pliegue, y nos incluyetambin el contenido de la primera lnea del pliegue.

    59

  • Otras caractersticas k133

    Para abrir el pliegue nos posicionamos encima y movemos el cursor en sentido horizontal(izquierda o derecha). Podemos copiar el pliegue, o cortarlo como si se tratase de una lneacualquiera. Hay una serie de comandos especficos para gestionar los pliegues:

    zo Abre el pliegue actual (open).zO Abre el pliegue actual, incluso los anidados a este.zc Cierra el pliegue actual (close).zC Cierra el pliegue actual, incluso los anidados a este.zr Abre TODOS los pliegues.zR Abre TODOS los pliegues, hasta los que estn anidados.zm Cierra TODOS los pliegues.zM Cierra TODOS los pliegues, hasta los que estn anidados.

    El otro mtodo que vamos a ver es el que se basa en un marcador. Quiere decir esto, quenosotros pondremos la cadena que inicia el pliegue y la que lo finaliza. Vamos a cambiar eltipo de pliegue en el archivo de configuracin, por este otro set foldmethod=marker .

    Por defecto las marcas que usa este mtodo son {{{ para el inicio y }}} para el cierre final.Lo bueno de este mtodo es que al poner nosotros las marcas, podemos poner pliegues encualquier documento, no solo en archivos de programacin. Por ejemplo, para tener organiza-do un documento por captulos, y que cada uno tenga su pliegue.

    En este caso vamos a poner el pliegue en una funcin, quedara tal que as:

    Figura 64: Pliegues segn marcas.

    Aqu vemos como la cadena de comienzo del pliegue, la hemos puesto en el inicio de lafuncin, luego veremos para qu. Y la cadena de finalizacin en el final, con la intencin deabarcar toda la funcin, obviamente. En este caso no lo hemos hecho, pero podramos habernumerado el nivel del pliegue. Este nivel se aade a la marca de comienzo, quedando {{{1 ,para el primer nivel. Si tenemos algn otro pliegue dentro de este le podemos poner {{{2 ,etc. Esta numeracin no es obligatoria, ni mucho menos, esta pensada para que nos sea til

    60

  • Otras caractersticas k133

    a nosotros identificar el nivel donde nos encontramos. Una vez cerrado el pliegue (con zc) loveremos tal que as:

    Figura 65: Pliegue cerrado.

    La razn por la que le pusimos el comienzo del pliegue, al inicio de la funcin, es para queal cerrar el pliegue nos aparezca esa lnea con la declaracin de la funcin. Bueno que paragustos los colores, ya sabris vosotros como os viene mejor ponerlos ;).

    NotaHay mas mtodos, pero tambin ms engorrosos, si queris investigarlo ms :help

    foldmethod y :help foldmarker .

    61

  • Conclusin y opinin personal k133

    22. Conclusin y opinin personal

    Y despus de esto, creo que lo nico que le falta a VIM, es una combinacin de teclas paraque venga alguien a abanicarnos mientras programamos ;). Fuera bromas, espero que os hayagustado este pequeo documento. Quiero recalcar que lo que se ha visto aqu no es mas que lapunta del iceberg. Este editor ofrece innumerables opciones, incluso tiene su propio lenguajede scripting (archivos .vim), para realizar nuestras propias macros (tambin es compatible conotros lenguajes de scripting). Aqu tenis el repositorio oficial por si queris echar un vistazohttp://www.vim.org/scripts/index.php.

    Este es un editor que requiere un pequeo sacrificio al principio, pero que es capaz derecompensarnoslo a la larga. Hay mucha documentacin en internet, por ejemplo podis verla documentacin en http://vimdoc.sourceforge.net , y encontrar muchos consejos ytrucos en http://vim.wikia.com/wiki/Vim_Tips_Wiki.

    Y una ltima reflexin, y es que a mitad del recorrido del aprendizaje, se me plante unaduda y es la siguiente... Merece la pena invertir tantas horas en el aprendizaje de un editor detexto, ya sea VIM o cualquier otro ?. Al final he llegado a la conclusin de que si lo merece,pero ojo! cuando lo que vas a aprender no te va a ayudar en el da a da, no merece la penaseguir adelante. Despus de haber ledo varios libros, recorrerme montones de webs, y loms importante haber practicado mucho, me tope con el lenguaje de scripting de VIM y mepregunte me es necesario ?. Y la verdad que por mucha ilusin que tena hice un stop. Quizdentro de unos aos lo retome como hobby, pero lo que quiero decir, no hay que perder devista lo que realmente necesitas.

    Y es por eso, que en este documento me he intentado centrar en lo que a mi parecer esimprescindible saber sobre VIM, a partir de aqu, que cada uno decida su camino. Saludos ygracias por leerme ;).

    62

    DedicatoriaIntroduccin Que es VIM ?Instalacin y caractersticasEntorno del editorPrctica con los modos principalesTareas bsicas para tratamiento de textoCampos de actuacinMovimiento por el archivoMovimiento por la lneaBsquedasRangosMarcas personalizadasComandos que pasan a modo insertarPorta-papeles o bufferExpresiones regularesEditando el archivo de configuracinExpresiones regulares 2Pestaas o TabsSangrado de lneasOtras caractersticasExplorador de archivosAutocompletar palabras y rutasAbrir archivos desde el editor y manejos de buffersEjecucin de comandos de sistema.Correccin ortogrficaGuardar sesiones enterasCreando nuestros propios Snippets (mapeos)Gestin de pliegues

    Conclusin y opinin personal