Vim与Powershell

时间:2020-03-06 14:22:21  来源:igfitidea点击:

我在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()