berfungsi untuk memanggil skrip shell dengan argumen

8

Saya membuat fungsi saya sendiri untuk memanggil skrip bash yang mengkompilasi dan menjalankan program saya.

Ini kode yang sudah saya coba.

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

Satu-satunya masalah adalah sepertinya mem-parsing a:gamebukan nilai.

Bagaimana saya akan mendapatkan a:game, a:major, a:minoruntuk mengurai nilai mereka ke fungsi?

iProgram
sumber

Jawaban:

11

Menggunakan :execute

Semua argumen perintah dalam Vim diartikan secara literal kecuali dirancang untuk dievaluasi. Untuk membangun perintah secara dinamis, Anda bisa menggunakan :execute. Setiap argumen untuk :executedievaluasi, dan mereka semua bergabung dengan spasi untuk menghasilkan perintah terakhir.

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

Menggabungkan shellescape()

Merupakan ide bagus untuk menghindari argumen yang diteruskan ke shell menggunakan shellescape(). Dibutuhkan sebuah string dan meloloskannya untuk digunakan dalam perintah shell.

function Compile_and_run(game, major, minor)
    execute '!_compile' shellescape(a:game) shellescape(a:major) shellescape(a:minor)
endfunction
tommcdo
sumber
Mengapa saya harus ''untuk !_compileselain argumen lain?
nn0p
1
:executeArgumen adalah ekspresi VimScript yang harus dievaluasi menjadi string. Jika Anda melewati beberapa argumen, argumen tersebut akan digabung dengan spasi. Karena argumen pertama hanyalah string literal, kami menyertakannya dalam tanda kutip.
tommcdo