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 eliminanormal <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()
.
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:
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!
Realmente muy bueno, felicidades y quedo a la espera de los próximos artículos 🙂
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
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.