2008-09-18 6 views
54

के साथ विम मैं विंडोज पर जीवीआईएम का उपयोग कर रहा हूं।पावरहेल

मेरी _vimrc में मैं जोड़ दिया है:

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

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

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

अगर मैं इस समारोह को अंजाम (: टेस्ट) मैं बकवास वर्ण (गैर संख्या/अक्षर ASCII वर्ण) देखें।

यदि मैं खोल के रूप में cmd ​​का उपयोग करता हूं, तो यह (नाम के बिना) काम करता है, इसलिए समस्या शक्तियों से आउटपुट प्राप्त करने के साथ होती है।

दिलचस्प है, इस महान काम करता है:

:!dir -name 

करता है के रूप में:

:r !dir -name 

अद्यतन: की पुष्टि व्यवहार से David

उल्लेख आप सेट आदेशों में ऊपर उल्लेख किया है पर अमल करते हैं _vimrc,: टेस्ट आउटपुट बकवास। हालांकि, अगर आप उन्हें _vimrc की बजाय सीधे vim में निष्पादित करते हैं, तो परीक्षण अपेक्षित कार्य करता है।

इसके अलावा, मैं इस मामले में iconv का उपयोग कर की कोशिश की है यह एक एन्कोडिंग समस्या थी:

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

लेकिन यह कोई फर्क नहीं किया। हालांकि मैं गलत एन्कोडिंग प्रकार का उपयोग कर सकता था।

कोई भी यह काम कैसे जानता है?

+1

मैंने सोचा कि यह बहुत अच्छा होगा। शक्ति/लचीलापन की कल्पना करो! –

+1

क्या यह एक एन्कोडिंग समस्या हो सकती है? पावरहेल यूनिकोड का उपयोग करता है अगर ऐसा लगता है कि लक्ष्य एक फ़ाइल है। Powerhell पर स्विच के रूप में ASCII को एन्कोड करने का प्रयास करें। – nickd

+0

कोई विचार है कि मैं विम के माध्यम से स्विच कैसे कर सकता हूं? –

उत्तर

23

यह एक हैक का एक सा है, लेकिन विम 7.2 में निम्नलिखित काम करता है। ध्यान दें, मैं एक सीएमडी सत्र के भीतर पावरहेल चला रहा हूं।

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 

निम्नलिखित के साथ परीक्षण किया गया ...

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

साथ

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

संपादित

"dir \*vim\*" 

की जगह का प्रयास करें: शेल के रूप में उपयोग करने का प्रयास cmd.exe और इससे पहले कि "-command"

-2

मैं "PowerShell.exe" डाल वीआईएम का उपयोग न करें लेकिन पावरहेल का डिफ़ॉल्ट आउटपुट यूनिकोड है। नोटपैड यूनिकोड पढ़ सकता है, आप यह देखने के लिए इसका उपयोग कर सकते हैं कि आप आउटपुट प्राप्त कर रहे हैं या नहीं।

+1

यह अंधेरे में एक शॉट है, और वास्तव में इस मुद्दे को संबोधित नहीं करता है। विम यूनिकोड के साथ ठीक काम करता है। –

2

दिलचस्प सवाल - यहां भ्रम में जोड़ने के लिए कुछ और है। मेरी .vimrc फ़ाइल में कोई बदलाव किए बिना, अगर मैं तो जाँचने में निम्न कमांड चलाएँ:

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

यह उम्मीद के रूप में व्यवहार!

यदि मैं अपने .vimrc फ़ाइल में वही परिवर्तन करता हूं, हालांकि (खोल और shellcmdflag विकल्प) चल रहा है: गूंज प्रणाली ("dir -name") बकवास अक्षर देता है!

0

मैं एक हैकिश समाधान का प्रस्ताव करता हूं। यह वास्तव में समस्या को हल नहीं करता है, लेकिन यह नौकरी किसी भी तरह से किया जाता है।

यह Vim plugin एक अस्थायी स्क्रिप्ट फ़ाइल के निर्माण को स्वचालित करें, powerhell cmd.exe के माध्यम से कॉल करें और परिणाम का पेस्ट करें। यह विम द्वारा संभालने योग्य उचित शक्ति के रूप में उतना अच्छा नहीं है, लेकिन यह काम करता है।

5

मुझे लगता है कि समस्या यह है कि Powershell नेट, जो UTF-16 के साथ साथ एक बाइट-आदेश-चिह्न है के लिए देशी स्ट्रिंग एन्कोडिंग का उपयोग करता है।

जब यह आदेशों के बीच ऑब्जेक्ट पाइप कर रहा है तो यह कोई समस्या नहीं है। हालांकि यह बाहरी कार्यक्रमों के लिए कुल पिटा है।

आप आउट-फाइल के माध्यम से आउटपुट पाइप कर सकते हैं, जो एन्कोडिंग को बदलने में समर्थन करता है, लेकिन फिर भी टर्मिनल के लिए आउटपुट को डिफ़ॉल्ट रूप से प्रारूपित करता है (arrgh!), इसलिए "गेट-प्रोसेस" जैसी चीजें कम हो जाएंगी इलिप्स, इत्यादि। आप आभासी टर्मिनल की चौड़ाई निर्दिष्ट कर सकते हैं जो आउट-फाइल का उपयोग करता है।

सुनिश्चित नहीं हैं कि इस जानकारी कितनी उपयोगी है, लेकिन यह समस्या में थोड़ा और अधिक उजागर करता है।

2

प्रारंभिक उदाहरण कोड मेरे लिए ठीक काम करता है जब मैं vimrc में यह खटखटाने।

तो अब मैं यह पता लगाने की क्या मेरी vimrc में यह समारोह बना रही है कोशिश कर रहा हूँ। संभवत:

set encoding=utf8 

संपादित: हाँ, कि यह करने के लिए प्रकट होता है। आप शायद विम वैसे भी यूनिकोड को दोषी करना चाहते हैं, इन दिनों ...

15

मैं एक ऐसी ही समस्या यहाँ कई द्वारा वर्णित में फंस गयी।

विशेष रूप से,

:set shell=powershell 

vim के भीतर से मैन्युअल रूप से बुला powershell ठीक से काम कर सकता है, लेकिन जैसे ही मैं कहा:

set shell=powershell 
मेरी vimrc फ़ाइल के लिए

"असमर्थ मैं त्रुटि मिलती हैं अस्थायी फ़ाइल खोलने के लिए .... कि खोल आदेशों ली दिखेगा जिसका अर्थ है "

समस्या यह है कि डिफ़ॉल्ट शेल संशोधित किया गया है द्वारा, vim स्वचालित रूप से shellxquote करने के लिए सेट है" ke निम्नलिखित:

powershell -c "cmd > tmpfile" 

कहाँ के रूप में इस आदेश को इस तरह देखने के लिए, vim के लिए अस्थायी फ़ाइल को पढ़ने की जरूरत है क्रम में: shellquote स्थापना

powershell -c "cmd" > tmpfile 

"मेरी vimrc फ़ाइल और unsetting shellxquote में (अर्थातएक रिक्त स्थान के लिए स्थापित) अपने सभी समस्याओं को ठीक करने लगते:

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

मैं भी प्रणाली का उपयोग कर इस आगे और पटकथा vim एक सा लेने की कोशिश की है() कॉल: system() with powershell in vim

0

बजाय प्रयास करें set shellcmdflag=\ -c


स्पष्टीकरण:

विम tempname() का उपयोग करता है एक अस्थायी फ़ाइल पथ उत्पन्न करने के लिए वह प्रणाली() पढ़ती है।

तो & खोल 'श' होता है और & shellcmdflag साथ शुरू होता है '-' तो tempname() एक अस्थायी फ़ाइल पथ आगे साथ स्लैश उत्पन्न करता है।

इस प्रकार, यदि set shell=powershell set shellcmdflag=-c तो विम आगे के साथ एक अस्थायी फ़ाइल को पढ़ने की कोशिश करेंगे स्लैश कि नहीं पाया जा सकता है। '-' और tempname() पिछड़े स्लैश कि हो सकता है के साथ एक अस्थायी फ़ाइल पथ का उत्पादन

एक उपाय के बजाय set shellcmdflag=\ -c है कि स्थापित करने के लिए, & shellcmdflag करने के लिए एक खाली स्थान के जोड़ सकते हैं ताकि पहला वर्ण अब है सिस्टम() द्वारा पाया गया।


मैं vim_dev मेलिंग सूची (https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0) है कि इस बेहतर प्रलेखन हकदार की चर्चा की।

2

इस पृष्ठ पर कोई भी जवाब मेरे लिए काम नहीं कर रहा था जब तक मुझे https://github.com/dougireton/mirror_pond/blob/master/vimrc से यह संकेत नहीं मिला - सेट shellxquote = [स्पेस कैरेक्टर] गायब टुकड़ा था।

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

"काम" का अर्थ यहां क्या है? क्या आप लाइनों का चयन कर सकते हैं और '! सॉर्ट-ऑब्जेक्ट' उन्हें (सॉर्ट लाइनों के साथ लाइनों को बदलना)? – Alan

0

actf जवाब मेरे लिए काम करता है, लेकिन Powershell की वजह से DIFF (जो लिनक्स से अलग है) आप विम में फिर से काम diff के लिए अपने Powershell प्रोफ़ाइल की इस लाइन को जोड़ना होगा में बनाया गया:

Remove-Item Alias:diff -force