martes, marzo 26, 2013

vim: Introducción a comandos (II)

Continuando con la entrada introducción a la creación de comandos de vim, los comandos que se crean en vim pueden tener parámetros. La presencia de los mismos se indican en la definición del comando con ayuda del modificador -nargs=value.

Un ejemplo: Supongamos que se quiere definir un comando ITechtag, que reciba un parámetro y que cuando se ejecute inserte una url que sea un enlace a una etiqueta en technorati, las cuales tienen el siguiente formato:

<a href="http://www.technorati.com/tag/etiqueta" rel="tag">etiqueta</a>

La definición del comando ITechtag puede ser la siguiente:

command ‑nargs=1 ITechtag :normal o<lt>a href="http://www.technorati.com/tag/<args>" rel="tag"><args><lt>/a>

Las partes de la definición de este comando importantes son tres:
  • ‑nargs=1 Indica que el comando recibe un sólo parámetro.
  • <args> Indica en que parte del comando se va a sustituir el parámetro.
  • <lt> Sirve para representar un < en el código del comando.

Si al comando anterior se le llama con parámetro vim, ITechtag vim, insertará el siguiente texto en el editor:

<a href="http://www.technorati.com/tag/vim" rel="tag">vim</a>

El mecanismo de uso de los argumentos en los comandos no es todo lo flexible que nos pueda parecer, puesto que sólo permite especificar si no hay argumentos, ‑nargs=0; si hay un solo argumento, ‑nargs=1; si hay uno o más argumentos ‑nargs=+; si hay uno o ningún argumento, ‑nargs=? o bien si hay cualquier número de argumentos , ‑nargs=*. En este caso, lo normal es usar el comando para llamar a una función escrita en vimscript si se quiere usar cualquier número de argumentos.

A la hora de llamar a una función desde un comando con varios argumentos hay una particularidad: Debe de usarse <f-args> para representar los argumentos.

Como ejemplo de lo anterior, voy a definir una función Do_tech_tags que recibe uno o más argumentos a la cual se le llama a través del comando ITechtags que puede tener uno o más argumentos y que va a insertar cada una de las etiquetas que se le pasen como argumentos. Voy a suponer que esta función está definida en el fichero technorati.vim y que se ha cargado con ayuda del comando source

function! Do_tech_tags(...)
    let l:index = 1
    let l:cadena = '<p style="text‑align:right;font‑size:10px;">'."\n".'Tecnorati tags: '
    while l:index <= a:0
        let l:cadena = l:cadena . '<a href="http://www.technorati.com/tag/'.a:{index}.'" rel="tag">'.a:{index}.'</a>'
        let l:index = l:index + 1
        if l:index < a:0
            let l:cadena = l:cadena . ','
        endif
    endwhile
    let l:cadena = l:cadena."\n"."</p>\n"
    execute ":normal o" .l:cadena
endfunction 

Ahora se define el comando:

command -nargs=+ ITechtags :call Do_tech_tags(<f-args>)

Este comando puede llamarse como ITechtags tag1 tag2 tag3 ... . Por ejemplo, si se llama como ITechtags vim insertará el siguiente código html en el buffer actual.

<p style="text-align:right;font-size:10px;">
Technorati Tags: <a href="http://www.technorati.com/tag/vim" rel="tag">vim</a>
</p>


Technorati Tags:

No hay comentarios: