56

我在 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 中执行上面提到的 set 命令,:Test 会输出废话。但是,如果您直接在 vim 中而不是在 _vimrc 中执行它们, :Test 将按预期工作。

另外,我尝试使用 iconv 以防它是编码问题:

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

但这没有任何区别。不过,我可能使用了错误的编码类型。

任何人都知道如何使这项工作?

4

13 回答 13

25

这有点 hack,但以下在 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()
于 2010-08-05T21:38:59.793 回答
17

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

具体来说,调用

:set shell=powershell

从 vim 中手动操作会导致 powershell 正常工作,但只要我添加:

set shell=powershell

在我的 vimrc 文件中,我会收到错误“无法打开临时文件....”

问题是,默认情况下,当修改 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

于 2011-10-20T03:16:18.917 回答
4

我怀疑问题在于 Powershell 使用 .NET 的本机字符串编码,即 UTF-16 加上字节顺序标记。

当它在命令之间传递对象时,这不是问题。不过,对于外部程序来说,这是一个完整的 PITA。

您可以通过输出文件通过管道输出输出,该输出文件支持更改编码,但仍会为默认情况下所在的终端格式化输出(啊!),因此“Get-Process”之类的内容将用省略号等截断。您可以指定 Out-File 使用的虚拟终端的宽度。

不确定这些信息有多大用处,但它确实更能说明问题。

于 2010-01-04T13:20:57.547 回答
3

尝试更换

"dir \*vim\*"

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

编辑:尝试使用 cmd.exe 作为 shell 并将“powershell.exe”放在“-command”之前

于 2008-09-18T17:29:43.803 回答
2

有趣的问题 - 这里还有一些东西会增加混乱。如果我在 gvim 中运行以下命令,则无需对我的 .vimrc 文件进行任何更改:

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

它的行为符合预期!

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

于 2008-09-19T13:19:10.830 回答
2

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

所以现在我想弄清楚我的 vimrc 是什么使它起作用。可能:

set encoding=utf8

编辑:是的,这似乎做到了。无论如何,这些天你可能希望 VIM 默认为 unicode ......

于 2010-03-29T17:31:22.777 回答
1

在我从https://github.com/dougireton/mirror_pond/blob/master/vimrc找到这个提示之前,此页面上的所有答案都没有为我工作- set shellxquote= [space character] 是缺失的部分。

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 
于 2015-11-16T22:08:16.077 回答
1

结合这个和相关线程中的答案,将以下内容添加到您从巧克力$profile安装的假设中:diffutils

Remove-Item Alias:diff -force

并将以下内容添加到您的~/.vimrc

if (has('win32') || has('gui_win32')) && executable('pwsh')
    set shell=pwsh
    set shellcmdflag=\ -ExecutionPolicy\ RemoteSigned\ -NoProfile\ -Nologo\ -NonInteractive\ -Command
endif

确保shellcmdflag完全如图所示

这些解决方案的所有功劳归功于各自的贡献者,这只是一个汇总帖子。

于 2020-01-23T01:05:51.977 回答
0

我提出了一个骇人听闻的解决方案。它并没有真正解决问题,但它以某种方式完成了工作。

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

于 2009-11-03T21:14:12.707 回答
0

试试吧 set shellcmdflag=\ -c


解释:

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

如果 &shell 包含 'sh' 并且 &shellcmdflag 以 '-' 开头,则 tempname() 生成带有正斜杠的临时文件路径。

因此,如果这样, set shell=powershell set shellcmdflag=-c Vim 将尝试读取一个带有无法找到的正斜杠的临时文件。

一个补救措施是改为设置 set shellcmdflag=\ -c ,即在 &shellcmdflag 中添加一个空格,以便第一个字符不再是“-”,并且 tempname() 会生成一个带有反斜杠的临时文件路径,该路径可以由 system() 找到。


我在 vim_dev 邮件列表 ( https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0 ) 上评论说,这值得更好的文档。

于 2014-12-16T07:58:42.090 回答
0

actf answer 对我有用,但由于 Powershell 内置 DIFF(与 Linux 不同),您必须将此行添加到您的 Powershell 配置文件中,以使 diff 在 VIM 中再次工作:

Remove-Item Alias:diff -force
于 2017-02-01T12:40:23.907 回答
0

我正在运行 GVim v8.2 (Windows)。

使用可执行文件的完整路径对我有用:

set shell=C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe
于 2021-02-18T13:32:23.473 回答
-2

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

于 2008-09-18T18:02:24.787 回答