2012-02-19 43 views
8

Tôi có một tập lệnh Vim gọi một kịch bản lệnh ngoài và đọc đầu ra vào bộ đệm hiện tại. Nó hoạt động tốt trong các hệ thống Unix. Tôi đang cố gắng làm cho kịch bản OS-thuyết bất khả tri, vì vậy tôi muốn nó làm việc cho người dùng Windows. Đây là dòng có liên quan từ tập lệnh:Làm thế nào để sử dụng các biến môi trường Windows trong kịch bản Vim?

:exe ":0r !$HOME/bin/shell_script" 

Theo tài liệu của Vim, $HOME cũng nên dịch tốt cho người dùng Windows. Sử dụng gvim trên Win XP ở chế độ lệnh, làm

:echo $HOME 

thực sự sản xuất "C: \ Documents and Settings \ my_user".

Tuy nhiên, kịch bản Vim của tôi (điều chỉnh cho gạch chéo ngược) không thành công trên các máy tính Windows với một thông điệp trong cửa sổ cmd.exe DOS nói

$ HOME \ bin \ shell_script" không tìm thấy.

Nói cách khác, Vim dường như không được mở rộng giá trị của $HOME trước khi đi qua nó để cmd.exe.

tôi không thể sử dụng %APPDATA% hoặc vì Vim dịch % như curre nt tệp và trước/nối thêm tên tệp vào APPDATA. Thật lạ khi Vim làm mở rộng % nhưng không mở rộng $HOME.

Làm cách nào để nhận được $HOME được mở rộng chính xác? Có phải vì tôi đang sử dụng exe trong tập lệnh vim không?

Trả lời

0

Ở đây bạn có một số thông tin về dấu gạch chéo và backslashes trong vim:

http://vimdoc.sourceforge.net/htmldoc/os_dos.html

Khi bạn thích sử dụng phía trước dấu gạch chéo, thiết lập các tùy chọn 'shellslash'. Vim sau đó sẽ thay thế dấu gạch chéo ngược bằng dấu gạch chéo về phía trước khi mở rộng tên tệp. Điều này đặc biệt hữu ích khi sử dụng một 'shell' giống Unix.

+0

Câu hỏi này không phải là về (dấu gạch chéo).Vấn đề ở đây là trình bao đơn giản không hiểu '$ HOME' – doubleDown

6

Bạn không cần ! để đọc tệp.

:exe ":0r $HOME/bin/shell_script" 

Hoặc đọc type lệnh trong cửa sổ (như cat trong linux):

:exe '0r !type "'. $HOME . '\bin\shell_script"' 

Lưu ý:

  • các type được thực hiện trong các cửa sổ shell, vì vậy bạn cần \ (dấu gạch chéo ngược) trong đường dẫn
  • nếu $HOME chứa space s, bạn cần " (double-quote) để bảo tồn giá trị văn chương của space s
+1

Để làm rõ, tôi muốn thực thi kịch bản bên ngoài và chèn đầu ra vào bộ đệm. –

+0

@NickColeman Chỉ cần xóa 'loại' và chạy lại. – kev

+0

Tôi đã bỏ lỡ rằng bạn đã chuyển $ HOME ra ngoài dấu ngoặc kép. Điều đó đã sửa nó. Cảm ơn vi đa trả lơi. –

4

Để làm rõ câu trả lời được đưa ra bởi kev:

Trên cửa sổ biến $ HOME không mở rộng đúng khi bạn thoát khỏi bảng điều khiển. Ví dụ: hãy xem xét mã này:

:e $HOME/myscript 

Điều này làm việc vì vim mở rộng $ HOME như bình thường. Mặt khác, điều này sẽ không hoạt động:

:%! $HOME/myscript 

Tại sao? Bởi vì vim chuyển tất cả mọi thứ sau ! đến vỏ bên dưới, trên Windows là cmd.exe mà biến môi trường %LIKE_THIS%. Nếu bạn cố gắng sử dụng ký hiệu đó, vim sẽ nhảy vào và mở rộng % vào tên của tệp hiện tại - con số đi.

Cách khám phá? Sử dụng exe keyword:

:exe "%! ".$HOME."\myscript" 

Hãy phân tích:

  • :exe là một lệnh mà phải mất một chuỗi và đánh giá nó (nghĩ eval trong hầu hết các ngôn ngữ)
  • "!% " thoát lệnh shell. Lưu ý rằng nó được trích dẫn để exe có thể đánh giá nó. Cũng lưu ý làm thế nào có một không gian thêm có để khi chúng tôi nối thêm var nhà nó không, nhưng phải chống lại nó
  • .$HOME dấu chấm là một biểu tượng nối chuỗi. Các $HOME nằm ngoài các dấu ngoặc kép nhưng nối để vim mà có thể mở rộng nó đúng
  • ."/myscript" đường dẫn đến kịch bản và có thể lập luận (cũng trích dẫn)

    Điều quan trọng ở đây là giữ $HOME bên ngoài của dấu ngoặc kép, nếu không nó có thể không được mở rộng đúng cách trên Windows.

1

Có thể bạn cần một chức năng như chức năng expand. Ví dụ:

:echo expand("$HOME/hello") 
/home/amir/hello 

Bạn có thể tìm hiểu thêm về mở rộng() với :help expand.

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