2011-09-30 76 views
5

我想在Vim中編寫一個簡單的函數來返回powershell命令的結果。儘管如此,我仍然對結果不屑一顧。系統()與vim中的powershell

我認爲這可能是一個編碼問題,但正如你會看到這個問題很奇怪,因爲它「有點作品」。雖然我沒有任何解決方案。

隨着VIM設置以下非默認的shell選項:

set shell=powershell 
set shellcmdflag=-c 

鑑於以下功能:

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

當我運行(從C:\ 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了正是我所期望的 - 但我仍然看到胡言亂語

我也試過以下修改m y功能:

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

但結果是完全一樣的(即,他們包括^ @^@符號和其他亂碼)

我的猜測是發生了什麼事情是,使用>生成utf-16輸出重定向的powershell cmds,而vim無法處理這個問題。我從PowerShell中的以下(在這種情況下,文件是gnu32程序):

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

任何人有什麼想法我在這裏做錯了嗎?

+0

這個問題的答案是否有幫助? http://stackoverflow.com/questions/94382/vim-with-powershell – Rynant

+0

@Rynant在發佈之前,我確實查看了這個問題,但是我找不到真正有幫助的東西。正如Nathan Hartley的回答中所描述的那樣,我嘗試了通過cmd運行powershell的「黑客攻擊」,但我遇到了完全相同的問題。 我認爲問題的根源在於powershell中的>重定向操作符在utf-16中寫入文件。如果我能找到一種方法來獲得>輸出ascii,相反,我認爲這將解決問題 – actf

+0

我不認爲它在運行時返回unicode。如果是這樣,你會看到更多的^ @字符。相反,我認爲你所看到的是包含在標準Windows行結束符(CR LF)中的回車符(0x0d)的表示。至於當你處於powershell本身時,>重定向器實際上是Out-File的縮寫,它默認爲unicode。嘗試在顯示結果之前用空字符串替換CR字符(\ r)。 – Artomegus

回答

2

我終於明白了這一點。

下修改我的功能確實非常正是我想要的:

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

我覺得Artomegus是正確的,問題是真正的回車符,而不是編碼的問題。

作爲一個方面說明,我遇到了問題,當我有在我的.vimrc文件中的以下內容:

set shell=powershell 
set shellcmdflag=-c 

只需這些設置,當我跑:調用測試()我會得到一個有關Vim無法讀取臨時文件的錯誤。

此問題的解決方法是以下添加到您的.vimrc文件:

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

必須設置shellquote是\」和shellxquote是一個空白空間(即空的),因爲默認情況下在windows上,shellxquote被設置爲\「,它覆蓋了shellquote的值。當使用系統功能時,這會在後臺運行vimrun.exe程序時出現問題。

希望這可以幫助別人。我一直堅持這個很長一段時間,但現在powershell完全適合我與Vim。

1

嘗試,而不是 set shellcmdflag=\ -c

說明:

Vim使用tempname()來生成一個臨時文件路徑系統()讀取。

如果&殼含有「SH」和& shellcmdflag開頭「 - 」 然後tempname()與正斜槓生成一個臨時文件的路徑。

因此,如果 set shell=powershell set shellcmdflag=-c 然後Vim會試圖讀取與前一個臨時文件斜槓是 無法找到。

甲補救辦法是設置代替 set shellcmdflag=\ -c 即,空白添加到& shellcmdflag使得第一字符 不再「 - 」和tempname()產生具有向後 斜線,可以是一個臨時文件路徑由system()發現。