10. Vim: comandos definidos por el usuario

Publicado por

Vim es en extremo flexible, lo hemos comprobado en cada nota de esta serie. El editor te permite modificar prácticamente cualquier comportamiento que te puedas imaginar, desde definir combinaciones de teclas, hasta escribir scripts complejos y organizarlos en plugins, funciones y como veremos a continuación: comandos.

Vim te permite definir tus propios comandos, los cuales se ejecutan de la misma manera que aquellos incluidos en el editor. Considera el siguiente ejemplo:

:command BorraPrimera 1delete | normal <C-o>

La línea anterior define un nuevo comando llamado BorraPrimera que en realidad ejecuta dos instrucciones, separadas por el símbolo |:

  • 1delete mueve el cursor a la primera línea del buffer y la elimina
  • normal <C-o> regresa el cursor a su posición original.

Hasta aquí todo bien, pues podemos combinar más de un comando para construir instrucciones más complejas. Si quisiéramos realizar tareas más específicas, que requieran de una lógica algo más elaborada, podemos definir un comando cuya tarea sea invocar una función.

Como ejemplo, considera la siguiente situación: Estoy escribiendo un documento de texto y quiero insertar la fecha actual al inicio del texto, alineado a la derecha:

function FuncionInsertaFecha()
  let &expandtab = 1
  let @f = strftime('%y/%m/%d')
  normal ggO
  normal "fP
  right
endfunction

command Fecha call FuncionInsertaFecha()

El código anterior lo puedes guardar en un archivo .vim dentro de tu carpeta de plugins ($HOME/.vim/plugins, por ejemplo), de modo que al iniciar el editor el comando sea definido. Acto seguido, bastará con ejecutar el comando :Fecha para ejecutar la función FuncionInsertaFecha().

Comando para insertar fecha (primera version)
Comando para insertar fecha (primera version)

Nota como el cursor no solo cambia de posición, sino que se queda ahí luego de que el comando ha terminado de ejecutarse. Además, para poder realizar la tarea, se han modificado los valores de la opción 'expandtab' y del registro f, si por alguna razón necesitas los valores anteriores, hay que guardarlos antes de modificarlos para poder restaurarlos al final. Si realizamos esas modificaciones a la función para insertar la fecha, obtendremos algo como esto:

function FuncionInsertaFecha()
  let l:cursor = getcurpos()   " Guardamos el estado del editor
  let l:expandtab = &expandtab
  let l:f = @f

  let &expandtab = 1
  let @f = strftime('%y/%m/%d')
  normal ggO
  normal "fP
  right
  normal 0Rcodingornot.com     " Un pequeño detalle


  let @f = l:f                 " Restauramos el estado del editor
  let &expandtab = l:expandtab
  call setpos('.', l:cursor)
endfunction

command! Fecha call FuncionInsertaFecha()

Ahora, cuando ejecutemos el comando :Fecha, obtendremos algo como esto:

Comando para insertar fecha (segunda version)
Comando para insertar fecha (segunda version)

Nota cómo ahora, el cursor vuelve a su posición original luego de que el comando termina, y además de la fecha del lado derecho, insertamos la leyenda codingornot.com del lado izquierdo. Podrá parecer un ejemplo algo simplón, pero ilustra muy bien, como es que a través de comandos y funciones, se pueden explotar varias de las características del editor, como los registros (@f), funciones de biblioteca (strftime()) y las opciones ('expandtab'), de la manera que más nos convenga . En conclusión: solo la imaginación es el límite a la hora de personalizar Vim.

Espero que esta nota te sea útil, y que te anime a definir algunos comandos que te ayuden a explotar al máximo el editor. Te espero en la siguiente nota ¡Hasta entonces!

3 comments

  1. Hola, estoy aprendiendo mucho con estos artículos. Alguien podría ayudarme en este Script?
    Solo necesito entrar en modo linea de comando desde cualquier modo con la tecla como esto:

    function! Cmdline()
    execute «normal \:»
    endfunction
    map :call Cmdline()

    También intenté esto:
    function! Cmdline()
    normal :
    endfunction
    imap =Cmdline()

    He intentado también poner «normal Q» o «normal q:» pero hace cosas raras

    1. Hola Esau, muchas gracias por escribirnos.

      Si te entendí bien, lo que buscas es cambiar a modo comando con una tecla personalizada. Para ello es suficiente con asociar el comando dos puntos ‘:’ a la tecla de tu elección; digamos que cuentas con un teclado en español y quieres entrar en modo comando pulsando la tecla ‘ñ’, para eso puedes utilizar los comandos «nnoremap» para el modo normal y «vnoremap» para el modo visual.

      nnoremap ñ :
      vnoremap ñ :

      Espero que esta respuesta te sea de utilidad, y si tienes más dudas estaremos encantados en ayudarte.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *