len()
, filter()
, map()
, etc.) y las funciones personalizadas. En este capítulo, vas a profundizar en aprender cómo funcionan las funciones.function
y termina con endfunction
. A continuación veremos un ejemplo de una función válida:s:
), puedes declararla con una letra minúscula . function s:sabrosa()
es un nombre válido. La razón de porque Vim necesita que se utilice un nombre con la letra inicial en mayúscula es para prevenir una confusión con las funciones propias de Vim (que son todas en minúsculas).1Sabrosa()
no es un nombre de función válido, pero Sabrosa1()
si lo es. Una función tampoco puede contener caracteres no alfanuméricos menos _
. Sabrosa-comida()
, Sabrosa&comida()
o Sabrosa.comida()
todos estos son ejemplos de nombres no válidos para nombres de funciones. Sabrosa_comida()
si lo es.Sabrosa
ya existe. Para sobrescribir la función previa con el mismo nombre, añade un símbolo !
después de la palabra clave function
.:function
. Para ver el contenido de la función Sabrosa
, puedes ejecutar :function Sabrosa
.:function /patrón
, de manera similar a la navegación de búsqueda con Vim (/patrón
). Para buscar todas las funciones que contengan la palabra "map", ejecuta :function /map
. Si utilizas complementos externos, Vim mostrará las funciones definidas en esos complementos.:verbose
junto con el comando :function
. Para buscar dónde se originan todas las funciones que contienen la palabra "map", ejecuta:fzf#vim#maps
una función de autoload (vuelve a echar un vistazo al capítulo 23) está escrita dentro del archivo ~/.vim/plugged/fzf.vim/autoload/fzf/vim.vim
, en la línea 1263. Esto es muy útil a la hora de depurar errores.:delfunction {Nombre_de_funcion}
. Para eliminar Sabrosa
, ejecuta :delfunction Sabrosa
.return
. De otra manera, Vim automáticamente devuelve de manera implícita un valor 0.return
vacío es equivalente a un valor 0.:echo Sabrosa()
utilizando la función anterior, después de que Vim muestre la palabra "Sabrosa", devolverá un 0, el valor implícito de retorno. Para hacer que la función Sabrosa()
devuelva el valor "Sabrosa", puedes hacer lo siguiente::echo Sabrosa()
, esta función devuelve la cadena "Sabrosa".:echo Sabrosa() . " comida."
mostrará "Sabrosa comida."comida
a tu función Sabrosa
, puedes hacerlo de la siguiente manera:a:
es uno de los ámbitos de las variables mencionados en el capítulo anterior. Es el de variable de parámetro formal. Es la manera de Vim para obtener un parámetro formal en una función. Sin este, Vim mostrará un error:l:
).sitio
es lo mismo que l:sitio
. Cuando defines una variable en una función, es variable es local a esa función. Cuando un usuario ve sitio
, podría fácilmente caer en el error de que se trata de una variable global. Por eso prefiero no escatimar en información y siempre añadir l:
para indicar que es una variable propia de la función.l:count
al declarar una variable propia de una función es que Vim tiene unas variables especiales con alias que son similares a una variable normal. v:count
es un ejemplo. Esta variable tiene un alias count
. En Vim, llamar a count
es lo mismo que que llamar a v:count
. Es muy sencillo llamar de manera accidental a una de esas variables especiales.let count = "count"
de manera implícita trata de redefinir una variable especial de Vim v:count
. Recuerda que las variables especiales (v:
) son de solo lectura. No las puedes cambiar. Para solucionar esto, utiliza l:count
::call
para llamar a una función.call
no muestra el valor de retorno. Vamos a llamar a la función combinando los comandos call
y echo
.call
anterior es un comando de la línea de comandos (:call
). El comando echo
anterior es también un comando para la línea de comandos (:echo
). No puedes llamar a un comando para la línea de comandos con otro comando para la línea de comandos. Vamos a utilizar otra opción con el comando call
:call
diferentes: el comando :call
para la línea de comandos y la función call()
. La función call()
acepta como su primer argumento el nombre de la función (una cadena) y su segundo argumento los parámetros formales (una lista).:call
y call()
, echa un vistazo :h call()
y :h :call
.=
. Si llamas a la función Desayuno
con solo un argumento, el argumento bebida
usará el valor predeterminado "leche"....
). Un argumento de variable es útil cuando no sabes cuantas variables dará un usuario.echo Buffet("Fideos")
, entonces mostrará "Fideos". Vim utiliza a:1
para mostrar el primer argumento que se le pasa a la función hasta ...
, más de 20 (a:1
es el primer argumento, a:2
es el segundo argumento, etc). Si ejecutas echo Buffet("Fideos", "Sushi")
, mostrará solo "Fideos", vamos a actualizar la función:echo Buffet("Fideos")
(con solo una variables), Vim se quejará de que tiene una variable no definida en a:2
. ¿Cómo podemos hacerlo lo suficientemente flexible para mostrar exactamente lo que el usuario le de a la función?a:0
para mostrar la longitud del argumento pasado en ...
.a:{l:contador_comida}
es una interpolación de una cadena, utiliza el valor del contador contador_comida
para llamar a los argumentos del parámetro formal a:1
, a:2
, a:3
, etc.a:000
. Tiene el valor de todos los argumentos de variable en un formato de lista.for
:range
al final de la definición de la función. Un rango de función tiene disponibles dos variables especiales a:firstline
y a:lastline
.call Desayuno()
, mostrará 100 tanto para firstline
como para lastline
. Si visualmente resaltas (mediante v
, V
, o Ctrl-V
) las líneas de la 101 a la 105 y ejecutas call Desayuno()
, firstline
mostrará 101 y lastline
mostrará 105. firstline
y lastline
muestran el rango mínimo y máximo de la función que es llamada.:call
y pasarle un rango. Si ejecutas :11,20call Desayuno()
, mostrará 11 para firstline
y 20 para lastline
.line(".")
? ¿No hará eso lo mismo?":11,20call Desayuno()
ejecuta la función Desayuno
10 veces (una por cada línea del rango). Compara eso con la diferencia de si hubieras pasado el argumento del rango range
:11,20call Desayuno()
esto ejecuta la función Desayuno
una vez.range
y le pasas un rango numérico (como 11,20
) en la llamada call
, Vim solo ejecutará esa función una vez. Si no pasas un rango range
y le pasas un rango numérico (como 11,20
) en la llamada call
, Vim ejecuta esa función un número N de veces dependiendo del rango (en el caso del ejemplo, N = 10).dict
cuando definas la función.SegundoDesayuno
que devuelve cualquier elemento desayuno
que tengas:comidas
:dict
, la variable clave self
se refiere al diccionario donde la función está almacenada (en este caso, el diccionario comidas
). La expresión self.desayuno
es equivalente a comidas.desayuno
.comida.arroz
comida.sopa
bebida.agua
bebida.cerveza
dict
.function("SegundoDesayuno")
anterior es un ejemplo de funcref. Vim tiene una función propia function()
que devuelve un funcref cuando le pasas el nombre de una función (cadena).let MiVariable = MiFuncion
. Necesutas utilizar la función function()
, así let MiVariable = function("MiFuncion")
.->
. Ten en mente que ->
debe ir seguido por un nombre de método sin espacios en blanco.cena_items->ListaMayuscula()->sort()->join(", ")
y saber exactamente qué va a suceder.appetizer
está definido dentro de la función Almuerzo
, que devuelve la funcref SegundoAlmuerzo
. Ten en cuenta que SegundoAlmuerzo
utiliza appetizer
, pero en Vimscript, esta no tiene acceso a esa variable. Si intentas ejecutar echo Desayuno()()
, Vim mostrará un error de variable no definida.closure
. Volvamos a escribir el código:echo Desayuno()()
, Vim devolverá "camarón".range
, dict
y closure
para modificar el comportamiento de una función. También has aprendido cómo utilizar lambda y cómo encadenar múltiples funciones. Las funciones son importantes para crear abstracciones complejas.