2011-09-30 16 views
5

में पावरहेल के साथ मैं शक्तियों के कमांड के परिणामों को वापस करने के लिए विम में एक साधारण कार्य लिखने की कोशिश कर रहा हूं। हालांकि मैं परिणामों में अस्पष्ट हो रहा हूं।सिस्टम() vim

मैं इस एन्कोडिंग समस्या हो सकती है लगता है, लेकिन आप देखेंगे के रूप में समस्या यह बाद से अजीब बात है "काम करता है की तरह"। हालांकि मुझे समस्या का कोई समाधान नहीं है।

set shell=powershell 
set shellcmdflag=-c 

निम्नलिखित समारोह को देखते हुए:

निम्नलिखित गैर-डिफ़ॉल्ट खोल विकल्पों vim में सेट के साथ

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

जब मैं चलाने (सी से: \ Windows):

:call Test() 

निम्नलिखित मेरी बफर करने के लिए लिखा है:

+०१२३५१६४१०६१
^@^@ Directory: C:\Windows^@^@^@ Mode   LastWriteTime Length Name ^@------- 
....continues 

हालांकि जब मैं निम्नलिखित कमांड चलाएँ:

:r!ls 

मैं वापस बिल्कुल मैं क्या उम्मीद करेंगे मिलता है (अर्थात ls की powershell परिणाम) इससे भी अधिक दिलचस्प है जब मैं कमांड चलाएँ:

:echo system("ls") 

परिणाम देखने के लिए सही

मैं इस प्रकार अपने मूल समारोह को संशोधित करने की कोशिश की है:

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

अभी तक मैं अभी भी निरर्थक शब्दों

देख मैं भी मीटर के लिए निम्न संशोधन की कोशिश की है - और बाहर echo'ed मान को उसी मैं क्या उम्मीद करेंगे है वाई समारोह:

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

लेकिन परिणाम बिल्कुल वही हैं (यानी। उनमें^@^@ प्रतीकों और अन्य गिब्बिश शामिल हैं)

मेरा अनुमान है कि क्या हो रहा है यह है कि शक्तियों वाले cmds जिन्हें यूटीएफ -16 आउटपुट का उपयोग करके रीडायरेक्ट किया जाता है, और vim इस से निपटने में असमर्थ है।

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

मैं भी यहां बताए अनुसार $ OutputEncoding के साथ प्रयोग करना की कोशिश की है, किसी भी सफलता नहीं मिली: http://blogs.msdn.com/b/powershell/archive/2006/12/11/outputencoding-to-the-rescue.aspx

किसी को भी मैं powershell से निम्नलिखित मिल (इस मामले में फ़ाइल gnu32 कार्यक्रम है) क्या कोई विचार है कि मैं यहां क्या गलत कर रहा हूं?

+0

क्या इस प्रश्न का उत्तर मदद करता है? http://stackoverflow.com/questions/94382/vim-with-powershell – Rynant

+0

@Rynant मैंने पोस्ट करने से पहले उस प्रश्न को देखा, लेकिन मैं वहां वास्तव में मदद करने में कुछ भी नहीं ढूंढ पाया। मैंने नेथन हार्टले के जवाब में वर्णित cmd के माध्यम से चल रहे पावरहेल के "हैक" को आजमाया, लेकिन मैं एक ही समस्या में भाग गया। मुझे लगता है कि समस्या की जड़ यह है कि> Powerhell में पुनर्निर्देशन ऑपरेटर utf-16 में एक फ़ाइल को लिखता है। अगर मुझे एएससीआई आउटपुट करने का कोई तरीका मिल सकता है, तो मुझे लगता है कि समस्या को हल करेगा – actf

+0

मुझे नहीं लगता कि यह आपके फ़ंक्शन में चलते समय यूनिकोड लौटा रहा है। यदि यह था, तो आप बहुत अधिक^@ अक्षर देखेंगे। इसके बजाय, मुझे लगता है कि आप जो देख रहे हैं वह कैरिज-रिटर्न कैरेक्टर (0x0d) का प्रतिनिधित्व है जो मानक विंडोज लाइन टर्मिनेटर (सीआर एलएफ) में शामिल हैं। जब आप पावरहेल में होते हैं, तो> रीडायरेक्टर वास्तव में आउट-फाइल के लिए शॉर्टेंड होता है, जो यूनिकोड के लिए डिफ़ॉल्ट होता है। परिणाम प्रदर्शित करने से पहले एक खाली स्ट्रिंग के साथ सीआर वर्ण (\ r) को बदलने का प्रयास करें। – Artomegus

उत्तर

2

मुझे अंत में यह पता चला है।

मेरी समारोह के लिए निम्न संशोधन करता है काफी मैं वास्तव में क्या चाहते हैं:

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

मुझे लगता है कि Artomegus सही है, तो समस्या वास्तव में गाड़ी वापसी, और नहीं कोई एन्कोडिंग समस्या है।

set shell=powershell 
set shellcmdflag=-c 

सिर्फ इन सेटिंग के साथ जब मैं भागा:

एक तरफ ध्यान दें के रूप में, मैं जब मैं केवल था मेरी .vimrc फ़ाइल में निम्न समस्याओं में भाग फोन टेस्ट() मैं एक मिलेगा विम के बारे में त्रुटि अस्थायी फ़ाइल को पढ़ने में असमर्थ है।

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

आप चाहिए shellquote होने के लिए \ "की स्थापना की और एक रिक्त स्थान होने के लिए shellxquote (यानी खाली) है क्योंकि:

इस समस्या के लिए फिक्स अपने .vimrc फ़ाइल में निम्न को जोड़ने के लिए है विंडोज़ पर डिफ़ॉल्ट रूप से, shellxquote \ "पर सेट होता है जो शेलक्वाट के मान को ओवरराइड करता है। सिस्टम फ़ंक्शन का उपयोग करते समय यह समस्याग्रस्त है, जो दृश्यों के पीछे vimrun.exe प्रोग्राम चलाता है।

उम्मीद है कि इस किसी और मदद करता है। मैं इस पर लंबे समय से फंस गया हूं, लेकिन अब शक्तियां मेरे लिए पूरी तरह से काम करती हैं।

1

बजाय set shellcmdflag=\ -c

स्पष्टीकरण का प्रयास करें:

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

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

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

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

 संबंधित मुद्दे