Quiero hacer una función que tenga argumentos opcionales.
En python haría algo como esto:
def functionName(arg1,arg2=false,arg3=false):
if arg2:
#Do stuff with arguments
else:
#Do stuff without arguments
He intentado hacerlo function FunctionName(arg1,arg2=false,arg3=false)
, pero me da un error que dice argumento no válido.
¿Cómo haría esto en vimscript?
let a:arg=
más en vim. Debes usar algo comolet l:arg=
o sololet arg=
. Ver github.com/vim/vim/commit/…Este patrón le permitirá asignar nombres significativos a cada argumento y proporcionará un valor predeterminado para los argumentos que no se proporcionaron:
Como señaló Boris Brodski:
condition ? result_if_true : result_if_false
es la expresión condicional (ternaria), que se evalúa al segundo o tercer término dependiendo de si el primer término era verdadero o no.Entonces, si no se proporciona un tercer argumento,
baz
tomará el valor predeterminado de0
.Una preocupación con el ejemplo anterior es que
a:foo
puede solamente puede acceder con ela:
prefijo, mientras quebar
ybaz
puede estar sin un prefijo. Como esto no es muy consistente, puede preferir extraer todos los argumentos en variables locales, de esta manera:(Técnicamente, puede usar el
l:
prefijo para referirse a variables locales dentro de una función, por ejemplol:baz
, pero esto es redundante, por lo que no lo recomendaría).Pero le recomiendo que use este formulario siempre que sea posible:
El le
!
permite redefinir su función en tiempo de ejecución (por ejemplo, volviendo a cargar el script), ys:
limita la función al alcance del script. Eso evita contaminar el espacio de nombres global (y arriesgarse a una colisión) si solo se hace referencia a su función desde otro lugar dentro del script. Generalmente es la forma preferida de definir funciones cuando no es necesario que sean visibles globalmente. ;-)fuente
a:0
no incluye los parámetros fijos con nombre.a:1
es el primer parámetro dentro de...
(Recién probado con VIM 8.0)No estoy bien versado en vimscript, pero así es como lo haría:
A continuación
call Func("Hello", "World")
, puede ver que imprime "Hola", "Mundo", "Baz no especificado".Esto está utilizando la función varargs de las funciones vim, que le permite pasar un número arbitrario de argumentos adicionales a la función. Los argumentos se almacenan en variables que, dependiendo de
a:0
(la longitud de la lista de argumentos adicionales), se configuran en su argumento correspondiente o en un valor predeterminado.fuente
Desde Vim 8.1.1310, Vim también admite argumentos de funciones opcionales reales.
Sin embargo, eso significa que la mayoría de las instalaciones de vim aún no lo admiten. Además, neovim no ofrece esa característica también.
Ejemplo de
:help optional-function-argument
:fuente