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

如果我执行这个function(:testing),我看到无意义的字符(非数字/字母ASCII字符)。

如果我使用cmd作为shell,它可以工作(没有-name),所以问题似乎是从powershell输出到vim。

有趣的是,这个工程很好:

 :!dir -name 

如下所示:

 :r !dir -name 

更新:确认大卫提到的行为

如果你在_vimrc中执行上面提到的set命令,那么:Test将会输出无意义的结果。 但是,如果您直接在vim中而不是在_vimrc中执行它们,则:Test将按预期工作。

另外,我试过使用iconv,以防万一它是一个编码问题:

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

但是这没有什么区别。 我可能会使用错误的编码types。

任何人都知道如何做这个工作?

这是一个黑客,但在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 

testing以下…

  • :!dir -name
  • :call Test()

我在这里遇到了很多类似的问题。

具体来讲,

 :set shell=powershell 

手动从VIM内会导致PowerShell工作正常,但只要我补充说:

 set shell=powershell 

我的vimrc文件我会得到错误“无法打开临时文件….”

问题是,默认情况下,当shell被修改时,vim自动将shellxquote设置为“这意味着shell命令将如下所示:

  powershell -c "cmd > tmpfile" 

在这个命令需要看起来像这样,为了让vim读取临时文件:

  powershell -c "cmd" > tmpfile 

将shellquote设置为“在我的vimrc文件中,并取消设置shellxquote(即将其设置为空格)似乎解决了我所有的问题:

 set shell=powershell set shellcmdflag=-c set shellquote=\" set shellxquote= 

我也尝试了进一步和脚本VIM一点使用system()调用: 系统()与PowerShell的VIM

我怀疑问题是,Powershell使用.NET的本地string编码,即UTF-16加上字节顺序标记。

当它是命令之间的pipe道对象,这不是一个问题。 这是一个外部程序总PITA虽然。

你可以通过out-filepipe道输出,它支持改变编码,但仍然默认格式化terminal的输出(arrgh!),所以诸如“Get-Process”之类的东西将会被省略等。您可以指定Out-File使用的虚拟terminal的宽度。

不知道这个信息是多么有用,但它确实照亮了这个问题。

尝试更换

 "dir \*vim\*" 

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

编辑:尝试使用cmd.exe作为shell,并把“powershell.exe”之前“ – 命令”

有趣的问题 – 这是另外一个添加到混乱。 不用对我的.vimrc文件做任何修改,如果我在gvim中运行下面的命令:

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

它的行为如预期!

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

当我把它放在vimrc中时,最初的示例代码对我来说工作的很好。

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

 set encoding=utf8 

编辑 :是的,似乎这样做。 无论如何,你可能想要VIM默认unicode,这几天…

在这个页面上的答案都没有为我工作,直到我从https://github.com/dougireton/mirror_pond/blob/master/vimrc发现这个提示; – set shellxquote = [空格字符]是缺less的一块。

 if has("win32") || has("gui_win32") if executable("PowerShell") " Set PowerShell as the shell for running external ! commands " http://stackoverflow.com/questions/7605917/system-with-powershell-in-vim set shell=PowerShell set shellcmdflag=-ExecutionPolicy\ RemoteSigned\ -Command set shellquote=\" " shellxquote must be a literal space character. set shellxquote= endif endif 

我提出一个骇人听闻的解决scheme。 这并不能真正解决这个问题,但它却能以某种方式完成工作。

这个Vim插件自动创build一个临时脚本文件,通过cmd.exe调用powershell并粘贴结果。 它不如vim处理适当的powershell,但它的工作原理。

尝试改为set shellcmdflag=\ -c


说明:

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

如果&shell包含“sh”,&shellcmdflag以“ – ”开头,那么tempname()会生成一个带有正斜杠的临时文件path。

因此,如果set shell=powershell set shellcmdflag=-c那么Vim将尝试读取无法find正斜杠的临时文件。

补救措施是set shellcmdflag=\ -c ,即为&shellcmdflag添加一个空格,以便第一个字符不再是' – ',而tempname()生成一个临时文件path,可以通过系统find反斜线)。


我在vim_dev邮件列表( https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0 )中评论说这应该有更好的文档。

actf答案适用于我,但由于Powershell内置DIFF(与Linux不同),您必须将此行添加到您的Powershellconfiguration文件,以便在VIM中再次执行diff操作:

 Remove-Item Alias:diff -force 

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