2008-09-18 24 views
54

Tôi đang sử dụng gvim trên Windows.Vim với Powershell

Trong _vimrc của tôi, tôi đã thêm:

set shell=powershell.exe 
set shellcmdflag=-c 
set shellpipe=> 
set shellredir=> 

function! Test() 
    echo system("dir -name") 
endfunction 

command! -nargs=0 Test :call Test() 

Nếu tôi thực hiện chức năng này (: Test) Tôi thấy các ký tự vô nghĩa (ký tự không phải số/thư ASCII).

Nếu tôi sử dụng cmd làm trình bao, nó hoạt động (không có tên), do đó, vấn đề dường như là nhận được kết xuất từ ​​powershell vào vim.

Điều thú vị là, này hoạt động tuyệt vời:

:!dir -name 

Như thực hiện điều này:

:r !dir -name 

UPDATE: hành vi xác nhận đề cập bởi David

Nếu bạn thực hiện các lệnh bộ nêu trên trong _vimrc,: Kiểm tra kết quả đầu ra vô nghĩa. Tuy nhiên, nếu bạn thực hiện chúng trực tiếp trong vim thay vì trong _vimrc,: Kiểm tra hoạt động như mong đợi.

Ngoài ra, tôi đã cố gắng sử dụng iconv trong trường hợp nó là một vấn đề mã hóa:

:echo iconv(system("dir -name"), "unicode", &enc) 

Nhưng điều này đã không thực hiện bất kỳ sự khác biệt. Tôi có thể sử dụng các loại mã hóa sai mặc dù.

Bất kỳ ai biết cách thực hiện công việc này?

+1

Tôi chỉ nghĩ rằng nó sẽ rất tuyệt. Hãy tưởng tượng sức mạnh/tính linh hoạt! –

+1

Có thể đó là sự cố mã hóa không? Powershell sử dụng Unicode nếu nó cho rằng đích là một tập tin. Hãy thử ASCII mã hóa như là một chuyển đổi để powershell. – nickd

+0

Bất kỳ ý tưởng làm thế nào tôi có thể vượt qua chuyển đổi đó thông qua Vim? –

Trả lời

23

Đó là một chút của một hack, nhưng các công trình sau đây trong Vim 7.2. Chú ý, tôi đang chạy Powershell trong một phiên CMD.

if has("win32") 
    set shell=cmd.exe 
    set shellcmdflag=/c\ powershell.exe\ -NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned 
    set shellpipe=| 
    set shellredir=> 
endif 

function! Test() 
    echo system("dir -name") 
endfunction 

Thử nghiệm với những điều sau đây ...

  • :!dir -name
  • :call Test()
3

Hãy thử thay thế

"dir \*vim\*" 

với

" -command { dir \*vim\* }" 

EDIT: Hãy thử sử dụng cmd.exe như vỏ và đặt "powershell.exe" trước khi "-Command"

-2

tôi không sử dụng VIM nhưng đầu ra mặc định của Powershell là Unicode. Notepad có thể đọc unicode, bạn có thể sử dụng nó để xem bạn có nhận được kết quả mong đợi hay không.

+1

Đây là ảnh chụp trong bóng tối và không thực sự giải quyết vấn đề. Vim hoạt động tốt với Unicode. –

2

Câu hỏi thú vị - đây là điều gì đó khác để thêm vào sự nhầm lẫn. Nếu không thực hiện bất kỳ thay đổi nào đối với tệp .vimrc của tôi, nếu tôi chạy các lệnh sau trong gvim:

:set shell=powershell.exe 
:set shellcmdflag=-noprofile 
:echo system("dir -name") 

Nó hoạt động như mong đợi!

Nếu tôi thực hiện các thay đổi tương tự đối với tệp .vimrc của mình, mặc dù (tùy chọn shell và shellcmdflag), chạy: echo system ("dir -name") trả về các ký tự vô nghĩa!

0

Tôi đề xuất giải pháp hackish. Nó không thực sự giải quyết vấn đề, nhưng nó có được công việc làm bằng cách nào đó.

Điều này Vim plugin tự động tạo tệp tập lệnh tạm thời, gọi PowerShell thông qua cmd.exe và dán kết quả. Nó không phải là tốt đẹp như một quyền hạn xử lý đúng đắn của vim, nhưng nó hoạt động.

5

Tôi nghi ngờ rằng vấn đề là Powershell sử dụng mã hóa chuỗi gốc cho .NET, là UTF-16 cộng với dấu thứ tự byte.

Khi đối tượng đường ống giữa các lệnh, nó không phải là vấn đề. Đó là một tổng PITA cho các chương trình bên ngoài mặc dù.

Bạn có thể tạo đầu ra thông qua tệp ngoài, không hỗ trợ thay đổi mã hóa nhưng vẫn định dạng đầu ra cho thiết bị đầu cuối theo mặc định (arrgh!), Vì vậy những thứ như "Get-Process" sẽ cắt ngắn hình elip, vv Bạn có thể chỉ định chiều rộng của thiết bị đầu cuối ảo mà Out-File sử dụng.

Không chắc chắn thông tin này hữu ích như thế nào, nhưng nó sẽ làm sáng tỏ vấn đề hơn một chút.

2

Mã ví dụ ban đầu hoạt động tốt cho tôi khi tôi quét nó trong vimrc.

Vì vậy, bây giờ tôi đang cố gắng tìm ra những gì trong vimrc của tôi là làm cho nó hoạt động. Có thể:

set encoding=utf8 

Sửa: Yep, xuất hiện để làm điều đó. Bạn có thể muốn VIM mặc định là unicode anyway, những ngày này ...

15

Tôi chạy vào một vấn đề tương tự được mô tả bởi nhiều người ở đây.

Cụ thể, gọi

:set shell=powershell 

bằng tay từ bên trong vim sẽ gây PowerShell để làm việc tốt, nhưng ngay sau khi tôi nói thêm:

set shell=powershell 

đến file vimrc của tôi, tôi sẽ nhận được lỗi "Unable để mở tệp tạm thời .... "

Vấn đề là theo mặc định khi vỏ được sửa đổi, vim tự động đặt shellxquote thành" có nghĩa là lệnh shell sẽ xem ke sau:

powershell -c "cmd > tmpfile" 

Trong trường hợp như lệnh này cần phải giống như thế này, để cho vim để đọc các tập tin tạm thời:

powershell -c "cmd" > tmpfile 

Thiết shellquote để "trong tập tin vimrc của tôi và shellxquote unset (I Eđặt nó vào một không gian trống) dường như để sửa chữa tất cả các vấn đề của tôi:

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

Tôi cũng đã thử dùng này hơn nữa và kịch bản vim một chút sử dụng hệ thống() gọi: system() with powershell in vim

0

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().


Tôi đã nhận xét trên danh sách gửi thư vim_dev (https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0) rằng tài liệu này xứng đáng hơn.

2

Không có câu trả lời nào trên trang này làm việc cho tôi cho đến khi tôi tìm thấy gợi ý này từ https://github.com/dougireton/mirror_pond/blob/master/vimrc - đặt shellxquote = [ký tự khoảng trắng] là phần bị thiếu.

if has("win32") || has("gui_win32") 
    if executable("PowerShell") 
     " Set PowerShell as the shell for running external ! commands 
     " http://stackoverflow.com/questions/7605917/system-with-powershell-in-vim  
     set shell=PowerShell 
     set shellcmdflag=-ExecutionPolicy\ RemoteSigned\ -Command 
     set shellquote=\" 
     " shellxquote must be a literal space character. 
     set shellxquote= 
    endif 
endif 
+0

"Công việc" có ý nghĩa gì ở đây? Bạn có thể chọn dòng và 'sắp xếp đối tượng' chúng (thay thế các dòng có các dòng được sắp xếp) không? – Alan

0

actf câu trả lời làm việc cho tôi, nhưng vì Powershell xây dựng trong DIFF (đó là khác biệt so với Linux một), bạn phải thêm dòng này vào hồ sơ của Powershell của bạn để có diff hoạt động trở lại trong VIM:

Remove-Item Alias:diff -force