Hàm gọi shell script với các đối số


8

Tôi đang thực hiện chức năng của riêng mình để gọi một tập lệnh bash biên dịch và chạy chương trình của tôi.

Đây là mã tôi đã thử.

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

Vấn đề duy nhất là nó dường như phân tích a:gamethay vì giá trị.

Làm thế nào tôi sẽ nhận được a:game, a:major, a:minorđể phân tích giá trị của họ đến chức năng?

Câu trả lời:


11

Sử dụng :execute

Tất cả các đối số lệnh trong Vim được diễn giải theo nghĩa đen trừ khi được thiết kế để được đánh giá. Để xây dựng một lệnh động, bạn có thể sử dụng :execute. Mỗi đối số :executeđược ước tính và tất cả chúng được nối bởi một khoảng trắng để tạo lệnh cuối cùng.

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

Kết hợp shellescape()

Đó là một ý tưởng tốt để thoát khỏi các đối số được truyền vào shell bằng cách sử dụng shellescape(). Nó nhận một chuỗi và thoát nó để sử dụng trong lệnh shell.

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

Tại sao tôi cần ''cho !_compilecác đối số khác?
nn0p

1
:executeĐối số là các biểu thức VimScript nên đánh giá theo chuỗi. Nếu bạn vượt qua nhiều đối số, chúng sẽ được nối với khoảng trắng. Vì đối số đầu tiên chỉ là một chuỗi ký tự, nên chúng tôi đặt nó trong dấu ngoặc kép.
tommcdo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.