2011-09-30 112 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()发现。