Insertar salida de función con variable en búfer
Estoy tratando de crear una función vim que tome una variable y la use como parte de un comando de shell y la inserte en el búfer actual.
Intenté usar read pero eso solo interpreta la var como una cadena.
Por ejemplo, como ejemplo
function MyFunc(var1)
read !ls a:var1
end function
Esto busca un directorio llamado a: var1. ¿Hay alguna forma de hacer lo que pido?
Respuestas
Estás cerca. Cuando desee usar una variable en un comando Ex, debe usar :execute. Este comando toma una expresión de Vim como argumentos, evalúa la expresión y ejecuta la cadena resultante como un comando Ex. Durante este proceso, las variables se resuelven en sus valores.
Antes de la evaluación, todos los argumentos se concatenan juntos. :executeinserta espacios entre los argumentos. También puede hacer la concatenación usted mismo y pasar un único argumento de cadena. (Es posible que desee hacer esto si no desea la separación de espacios que se acaba de señalar).
Para su caso, tiene un texto fijo / estático ( "read !ls") y una variable. Para el enfoque de argumentos múltiples, puede usar cualquiera de estos:
exe "r !ls" a:var1
exe "r" "!ls" a:var1
El enfoque de argumento de cadena única se vería así:
exe "r !ls " . a:var1
Observe cómo el .operador (string concat) une la cadena de comando con la variable. En este caso, la variable se resuelve en su valor antes de pasarla, :exepero el resultado final es el mismo.
También puede utilizar la system()función para ejecutar un comando externo y capturar su salida. En ese caso, es más natural usar contenido variable, ya que la función ya toma una cadena, por lo que no es necesario usarla :executepara interpolar el contenido variable en el comando.
Para poner el resultado de la expresión en el búfer actual, puede usar el :putcomando, que puede tomar un =seguido de una expresión:
:put =system('ls '.a:var1)