2013-03-13 20 views
6

Nói rằng tôi có vimscript này là "/tmp/example.vim":Thoát "%" trong Vim khi kích hoạt, vì vậy nó không được mở rộng thành tên tệp?

let g:input = "START; % END" 
exec("! clear && echo " . shellescape(g:input)) 

Nếu tôi mở tập tin đó và chạy nó với :so %, sản lượng sẽ

START; /tmp/example.vim END 

vì "% "được mở rộng đến tên bộ đệm. Tôi muốn đầu ra là

START; % END 

Tôi có thể sử dụng phương pháp chung escape() để thoát khỏi các dấu hiệu phần trăm nói riêng. Công trình này:

let g:input = "START; % END" 
exec("! clear && echo " . escape(shellescape(g:input), "%")) 

Nhưng đó thực sự là cách tốt nhất? Tôi chắc rằng có nhiều nhân vật hơn tôi nên trốn thoát. Có chức năng thoát cụ thể nào cho mục đích này không? Hoặc một cách tốt hơn để loại bỏ?

Trả lời

6

Để sử dụng với lệnh :!, bạn cần phải vượt qua tùy chọn {special} lập luận để shellescape():

Khi đối số {special} là hiện tại và đó là một tổ chức phi zero- số hoặc một chuỗi không rỗng (| không phải zero-arg |), sau đó đặc biệt các mục như !, %, #<cword> sẽ đứng trước dấu gạch chéo ngược. Dấu gạch chéo ngược này sẽ bị xóa lần nữa bởi | :! | lệnh.

:exec("! clear && echo " . shellescape(g:input, 1)) 
+0

Rất tốt, cảm ơn bạn! –

3

Bạn cần thoát đúng cách '%'. Vì vậy, nó nên là:

let g:input = "START; \\% END" 
+0

Nội dung nhập trong tập lệnh thực của tôi không được sửa. Tôi có thể sử dụng 'escape()' để thoát khỏi mọi "%", nhưng hãy xem kết thúc câu hỏi. –

0

Điều này dường như làm điều đó:

let g:input = "START; % END" 
echo system("echo " . shellescape(g:input)) 

Cần lưu ý tôi không thực sự quan tâm về đầu ra; Tôi sẽ sử dụng điều này với silent trong tập lệnh lớn hơn.

+0

Nếu bạn bỏ qua văn bản được lặp lại, bạn có thể sử dụng 'cuộc gọi'. – echristopherson

+0

@echristopherson Vâng, đó chỉ là để xem đầu ra trong kịch bản ví dụ. –

Các vấn đề liên quan