我在Windows上使用gvim。
在我的_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()
如果我执行这个函数(:Test),我看到的是无意义的字符(非数字/字母ASCII字符)。
如果我使用cmd作为外壳程序,它就可以工作(没有-name),所以问题似乎出在将powershell输出到vim中。
有趣的是,这很有效:
:!dir -name
如下所示:
:r !dir -name
更新:确认David提到的行为
如果在_vimrc中执行上面提到的set命令,:Test将输出无意义的输出。但是,如果您直接在vim中执行它们,而不是在_vimrc中执行,:Test就会按预期工作。
此外,我还尝试使用iconv,以防出现编码问题:
:echo iconv( system("dir -name"), "unicode", &enc )
但这并没有什么不同。我可能使用了错误的编码类型。
有人知道怎么做吗?
发布于 2010-08-06 05:39:00
这是一个小技巧,但是下面的代码在Vim 7.2中是有效的。请注意,我在CMD会话中运行Powershell。
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()
发布于 2011-10-20 11:16:19
我在这里遇到了许多人描述的类似问题。
具体地说,调用
:set shell=powershell
在vim中手动操作将导致powershell正常工作,但只要我添加:
set shell=powershell
对于我的vimrc文件,我会收到错误消息"Unable to open temp file.“
问题是,在默认情况下,当shell被修改时,vim会自动将shellxquote设置为“这意味着shell命令将如下所示:
powershell -c "cmd > tmpfile"
其中,为了让vim读取临时文件,此命令需要如下所示:
powershell -c "cmd" > tmpfile
在我的vimrc文件中,将shellquote设置为“,并取消设置shellxquote (即,将其设置为空白)似乎可以解决我的所有问题:
set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=
我还尝试了更进一步,并使用system()调用编写了一点vim脚本:system() with powershell in vim
发布于 2010-01-04 21:20:58
我怀疑问题在于Powershell对.NET使用了原生字符串编码,即UTF-16加上一个字节顺序标记。
当它在命令之间传输对象时,这不是问题。不过,对于外部程序来说,这完全是一种PITA。
你可以通过out-file来输出,它确实支持改变编码,但是仍然格式化输出到默认的终端(啊!),所以像"Get-Process“这样的东西会用省略号等截断。你可以指定Out-File使用的虚拟终端的宽度。
我不确定这些信息有多有用,但它确实更好地说明了这个问题。
https://stackoverflow.com/questions/94382
复制相似问题