Vim与Powershell
我在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作为shell,它可以工作(不带-name),因此问题似乎出在从powershell到vim的输出中。
有趣的是,这很好用:
:!dir -name
就像这样:
:r !dir -name
更新:确认大卫提到的行为
如果在_vimrc中执行上述设置命令,:Test将输出无意义。但是,如果直接在vim中而不是在_vimrc中执行它们,:Test将按预期工作。
另外,我尝试使用iconv来防止出现编码问题:
:echo iconv( system("dir -name"), "unicode", &enc )
但这没有任何区别。我可能使用了错误的编码类型。
有人知道如何进行这项工作吗?
解决方案
尝试更换
"dir \*vim\*"
和
" -command { dir \*vim\* }"
编辑:尝试使用cmd.exe作为外壳,并将" powershell.exe"放在" -command"之前
我不使用VIM,但Powershell的默认输出是Unicode。记事本可以读取unicode,我们可以使用它来查看是否获得期望的输出。
这里有趣的问题是使混乱增加的其他东西。如果不对我的.vimrc文件进行任何更改,则如果我随后在gvim中运行以下命令:
:set shell=powershell.exe :set shellcmdflag=-noprofile :echo system("dir -name")
它的行为符合预期!
但是,如果对.vimrc文件进行了相同的更改(shell和shellcmdflag选项),则运行:echo system(" dir -name")将返回无意义的字符!
我提出了一个棘手的解决方案。它并不能真正解决问题,但是可以通过某种方式完成工作。
该Vim插件可自动创建临时脚本文件,通过cmd.exe进行powershell调用并粘贴结果。它不如vim正确处理powershell那样好,但是它可以工作。
我怀疑问题在于Powershell为.NET使用了本机String编码,这是UTF-16加上字节顺序标记。
当在命令之间传递对象时,这不是问题。不过,这是外部程序的总PITA。
我们可以通过输出文件通过管道输出,该文件确实支持更改编码,但是默认情况下仍格式化其所在终端的输出(arrgh!),因此" Get-Process"之类的内容将用省略号等截断。但是,我们可以指定输出文件使用的虚拟终端的宽度。
不确定此信息有多有用,但确实可以更清楚地说明问题。
当我将其放入vimrc中时,初始示例代码对我来说工作正常。
所以现在我想弄清楚vimrc中的功能是什么。可能:
set encoding=utf8
编辑:是的,这似乎可以做到。这些天,我们可能还是想让VIM默认使用unicode。
这有点骇人听闻,但以下内容在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()