Vim与Powershell

Vim与Powershell

Vim with Powershell

我正在Windows上使用gvim。

在我的_vimrc中,我添加了:

1
2
3
4
5
6
7
8
9
10
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的输出中。

有趣的是,这很好用:

1
:!dir -name

这样做:

1
:r !dir -name

更新:确认David

提到的行为

如果在_vimrc中执行上述设置命令,则:Test输出无意义。但是,如果直接在vim中而不是在_vimrc中执行它们,:Test将按预期工作。

此外,我尝试使用iconv来解决编码问题:

1
:echo iconv( system("dir -name"),"unicode", &enc )

但这没什么区别。我可能使用了错误的编码类型。

有人知道怎么做吗?


有点黑,但是以下内容在Vim 7.2中有效。注意,我正在CMD会话中运行Powershell。

1
2
3
4
5
6
7
8
9
10
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()

我遇到了许多人在这里描述的类似问题。

具体来说,调用

1
:set shell=powershell

手动从vim内执行将使powershell正常工作,但是只要我添加:

1
set shell=powershell

到我的vimrc文件,我将收到错误"无法打开临时文件...。"

问题在于,默认情况下,在修改shell时,vim会自动将shellxquote设置为",这意味着shell命令将如下所示:

1
 powershell -c"cmd > tmpfile"

此命令需要如下所示,以便vim读取临时文件:

1
 powershell -c"cmd"> tmpfile

在我的vimrc文件中将shellquote设置为"并取消设置shellxquote(即将其设置为空白)似乎可以解决我的所有问题:

1
2
3
4
set shell=powershell
set shellcmdflag=-c
set shellquote="
set shellxquote=

我还尝试了进一步的工作,并使用system()调用对vim进行了脚本化:
在vim

中具有powershell的system()


我怀疑问题是Powershell为.NET使用了本机String编码,它是UTF-16加上字节顺序标记。

当在命令之间传递对象时,这不是问题。不过,这是外部程序的总PITA。

您可以通过输出文件通过管道传输输出,该文件确实支持更改编码,但是默认情况下仍格式化其所在终端的输出(arrgh!),因此类似" Get-Process ""将以椭圆形等截断。您可以指定Out-File使用的虚拟终端的宽度。

不确定此信息有多有用,但确实可以更清楚地说明问题。


尝试替换

1
"dir \\*vim\\*"

1
" -command { dir \\*vim\\* }"

编辑:尝试使用cmd.exe作为外壳,并将" powershell.exe "放在"-command "

之前


当我将其放入vimrc中时,初始示例代码对我来说工作正常。

所以现在我想弄清楚vimrc中的功能是什么。可能:

1
set encoding=utf8

编辑:是的,看来可以做到。这些天,您可能还是想让VIM默认使用unicode进行编码...


有趣的问题-这里还有一些其他问题。如果不对我的.vimrc文件进行任何更改,则如果我随后在gvim中运行以下命令:

1
2
3
:set shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")

它的行为符合预期!

如果我对.vimrc文件进行了相同的更改(shell和shellcmdflag选项),则运行:echo system(" dir -name ")将返回无意义的字符!


n


n


n


n


试试看

set shellcmdflag=\\ -c

说明:

Vim使用tempname()生成system()读取的临时文件路径。

如果


我提出了一种骇人听闻的解决方案。它并不能真正解决问题,但是可以通过某种方式完成工作。

此Vim插件可自动创建临时脚本文件,通过cmd.exe进行powershell调用并粘贴结果。它不如vim正确处理powershell很好,但是它可以工作。


我不使用VIM,但Powershell的默认输出是Unicode。记事本可以读取unicode,您可以使用它来查看是否获得期望的输出。


推荐阅读