función para llamar script de shell con argumentos

8

Estoy haciendo mi propia función para llamar a un script bash que compila y ejecuta mi programa.

Aquí está el código que he probado.

function Compile_and_run(game, major, minor)
    !_compile a:game a:major a:minor
endfunction

El único problema es que parece analizar en a:gamelugar del valor.

¿Cómo voy a conseguir a:game, a:major, a:minorpara analizar su valor para la función?

iProgram
fuente

Respuestas:

11

Utilizando :execute

Todos los argumentos de comando en Vim se interpretan literalmente a menos que estén diseñados para ser evaluados. Para construir un comando dinámicamente, puede usar :execute. Cada argumento de :executese evalúa, y todos están unidos por un espacio para producir el comando final.

function Compile_and_run(game, major, minor)
    execute '!_compile' a:game a:major a:minor
endfunction

Incorporando shellescape()

Es una buena idea escapar de los argumentos que se pasan al shell usando shellescape(). Toma una cadena y la escapa para usarla en un comando de shell.

function Compile_and_run(game, major, minor)
    execute '!_compile' shellescape(a:game) shellescape(a:major) shellescape(a:minor)
endfunction
tommcdo
fuente
¿Por qué necesito ''para !_compileque no sean otros argumentos?
nn0p
1
:executeLos argumentos son expresiones de VimScript que deberían evaluarse en cadenas. Si pasa varios argumentos, se unirán con espacios. Como el primer argumento es solo una cadena literal, lo encerramos entre comillas.
tommcdo