2011-09-30 23 views
5

Tôi đang cố viết một hàm đơn giản trong Vim để trả về kết quả của lệnh powershell. Tôi tiếp tục nhận được vô nghĩa trong kết quả mặc dù.system() với powershell trong vim

Tôi nghĩ rằng đây có thể là sự cố mã hóa, nhưng vì bạn sẽ thấy vấn đề lạ vì nó "sắp xếp công việc". Tôi không có bất kỳ giải pháp cho vấn đề mặc dù.

Với các tùy chọn vỏ không mặc định sau đặt trong vim:

set shell=powershell 
set shellcmdflag=-c 

Với chức năng sau:

function! Test() 
    let result = system("ls") 
    call setline(1, result) 
endfunction 

Khi tôi chạy (từ C: \ Windows):

:call Test() 

Phần sau được ghi vào bộ đệm của tôi:

^@^@ Directory: C:\Windows^@^@^@ Mode   LastWriteTime Length Name ^@------- 
....continues 

Tuy nhiên khi tôi chạy lệnh sau:

:r!ls 

tôi nhận được lại chính xác những gì tôi mong đợi (ví dụ: kết quả powershell của ls) Thậm chí thú vị hơn là khi tôi chạy lệnh:

:echo system("ls") 

Các kết quả tìm kiếm chính xác

tôi đã cố gắng thay đổi chức năng ban đầu của tôi như sau:

function! Test() 
    let result = system("ls") 
    echo result 
    call setline(1, result) 
endfunction 

và giá trị echo'ed ra là chính xác những gì tôi mong đợi - nhưng tôi vẫn thấy gibberish

Tôi cũng đã thử sửa đổi sau đây thành m y function:

function! Test() 
    let result = system("ls") 
    let conv = iconv(result, "utf-8", &enc) 
    call setline(1, conv) 
endfunction 

Nhưng kết quả hoàn toàn giống nhau (tức là chúng bao gồm các ký hiệu^@^@ và các ngữ pháp khác)

Tôi đoán là điều đang xảy ra là các cmd được chuyển hướng bằng cách sử dụng> tạo ra đầu ra utf-16 và vim không thể xử lý điều này. Tôi nhận được như sau từ PowerShell (file trong trường hợp này là chương trình gnu32):

PS> ls > test 
PS> file test 
test; Little-endian UTF-16 Unicode text, with CRLF, CR line terminator 

Tôi cũng đã thử chơi xung quanh với $ OutputEncoding, mà không cần bất kỳ thành công, như mô tả ở đây: http://blogs.msdn.com/b/powershell/archive/2006/12/11/outputencoding-to-the-rescue.aspx

Bất cứ ai có bất kỳ ý tưởng những gì tôi đang làm sai ở đây?

+0

Câu trả lời cho câu hỏi này có hữu ích không? http://stackoverflow.com/questions/94382/vim-with-powershell – Rynant

+0

@Rynant Tôi đã xem qua câu hỏi đó trước khi đăng bài, nhưng tôi không thể tìm thấy bất cứ điều gì trong đó thực sự giúp đỡ. Tôi đã thử "hack" của chạy PowerShell thông qua cmd như mô tả trong câu trả lời của Nathan Hartley, nhưng tôi chạy vào cùng một vấn đề chính xác. Tôi nghĩ rằng gốc của vấn đề là các nhà điều hành chuyển hướng trong PowerShell ghi vào một tập tin trong utf-16. Nếu tôi có thể tìm một cách để có được> để sản xuất ascii, thay vào đó, tôi nghĩ rằng sẽ giải quyết vấn đề – actf

+0

Tôi không nghĩ rằng nó là trở về unicode khi chạy trong chức năng của bạn. Nếu có, bạn sẽ thấy nhiều hơn^@ ký tự. Thay vào đó, những gì tôi nghĩ bạn đang thấy là các biểu diễn của ký tự trả về (0x0d) được bao gồm trong trình tiêu chuẩn dòng Windows (CR LF). Đối với khi bạn đang ở trong powershell chính nó, các> redirector thực sự là viết tắt cho Out-File, mà mặc định unicode. Hãy thử thay thế các ký tự CR (\ r) bằng một chuỗi rỗng trước khi hiển thị kết quả. – Artomegus

Trả lời

2

Cuối cùng tôi đã tìm ra điều này.

Việc sửa đổi sau đây để chức năng của tôi làm khá nhiều chính xác những gì tôi muốn:

function! Test() 
    let @r = system("ls") 
    put! r 
endfunction 

Tôi nghĩ Artomegus là đúng, vấn đề thực sự là vận chuyển trở lại, và không phải là một vấn đề mã hóa.

Như một mặt lưu ý, tôi chạy vào vấn đề khi tôi đã có chỉ sau đây trong tập tin vimrc của tôi:

set shell=powershell 
set shellcmdflag=-c 

Chỉ với các thiết lập này khi tôi chạy: gọi Test() tôi sẽ nhận được một lỗi về Vim không thể đọc tập tin tạm thời.

Việc sửa chữa cho vấn đề này là để thêm dòng sau vào tập tin vimrc của bạn:

set shell=powershell 
set shellcmdflag=-c 
set shellquote=\" 
set shellxquote= 

Bạn phải thiết lập shellquote là \" và shellxquote trở thành một không gian trống (tức là trống) vì theo mặc định trên cửa sổ, shellxquote được đặt thành \ "ghi đè giá trị của shellquote. Đây là vấn đề khi sử dụng chức năng hệ thống, chạy chương trình vimrun.exe đằng sau hậu trường.

Hy vọng điều này sẽ giúp người khác. Tôi đã bị mắc kẹt trong điều này trong một thời gian dài, nhưng bây giờ powershell hoạt động hoàn hảo cho tôi với Vim.

1

Hãy thử thay set shellcmdflag=\ -c

Giải thích:

Vim sử dụng tempname() để tạo ra một đường dẫn tập tin tạm thời hệ thống() đọc.

Nếu & vỏ chứa 'sh' và & shellcmdflag bắt đầu bằng '-' thì tempname() tạo đường dẫn tệp tạm thời bằng dấu gạch chéo.

Do đó, nếu set shell=powershell set shellcmdflag=-c thì Vim sẽ cố gắng đọc tệp tạm thời có dấu gạch chéo là không thể tìm thấy.

Một phương thuốc là để thiết lập thay vì set shellcmdflag=\ -c có nghĩa là, thêm một khoảng trắng để & shellcmdflag để các ký tự đầu tiên không còn '-' và tempname() tạo ra một đường dẫn tập tin tạm thời với lạc hậu dấu gạch chéo có thể được được tìm thấy bởi hệ thống().