【问题标题】:vimdiff E97 in PowershellPowershell 中的 vimdiff E97
【发布时间】:2019-06-05 14:31:10
【问题描述】:

我无法让vimdiff 在 Windows 10 机器上工作。我正在从 Powershell 运行 vim。 Powershell 也在$myvimrc 中声明为我选择的shell:

set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe

我尝试比较的文档未保存为文件。我打开两个垂直拆分,在每个拆分中输入文本,然后运行:windo diffthis。输出为E97: Cannot create diffs

This article 说我可能需要下载并使用与 gvim 安装的diff.exe 不同的diff.exe。我已经下载了推荐的“GnuWin32 diff”包并将安装目录添加到我的 Windows 路径 ($env:path)。继续按照这些指示,我已经注释掉了默认的 diffexpr 声明,但仍然得到 E97。

我也尝试调用我自己的函数,但无济于事。在这次尝试中,我确保避免使用反斜杠,并将下载的diff.exe 复制到我确信我拥有完全权限的目录中。为了帮助进行故障排除,我暂时保存了我希望比较的两个文件,并明确指定了它们的完整路径,而不是使用 vim 的 v:fname_inv:fname_new(和 v:fname_out)。

set diffexpr=TestDiff()
function TestDiff()
       silent execute "!& " . "C:\\diff.exe" . " -a --binary " "C:\\a.edi" . " " . "C:\\b.edi" . " > " . "C:\\tmp.txt"
endfunction

我通过运行:h E97 研究了这个错误,它返回以下信息:

如果 diff 输出看起来没问题,Vim 会做一个测试。如果没有, 您将收到一条错误消息。可能的原因:

  • “diff”程序无法执行。
  • “diff”程序不会产生正常的“ed”风格差异(见上文)。
  • 'shell' 和相关选项设置不正确。尝试过滤是否适用于“:!sort”之类的命令。
  • 您正在使用“diffexpr”,但它不起作用。如果不清楚问题出在哪里,请将“详细”选项设置为一个或多个以查看 更多消息。

用于 MS-Windows 的自安装 Vim 包含一个 diff 程序。如果 你没有它,你可能想下载一个 diff.exe。例如 来自http://gnuwin32.sourceforge.net/packages/diffutils.htm

我相信我通过了这些要求中的前两个,因为生成了tmp.txt 并遵循帮助文件中提供的示例“ed”样式差异。我没有在$myvimrc 中设置其他与shell 相关的参数(shelltype、shellpipe 等),但使用:! 执行其他命令完全没有问题。

:messages中没有其他信息,只有E97错误。

编辑: 如果我从$myvimrc 中删除set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe,则将shell 默认设置为cmd.exediffthis 按预期工作。好像是others have also had this problem when using Powershell

以下是使用两个 shell 运行 diffthis 时弹出的命令窗口的截图。使用的命令几乎相同。

我推测此尝试的 Powershell 版本中明显的正斜杠是有问题的,但我能够准确地运行此命令(使用虚拟文件代替 .tmp 文件)并输出似乎是用于 diff 的足够文件。我还尝试将正斜杠的substitute 添加到反斜杠无济于事。

【问题讨论】:

  • 不管怎样,我已经在我的 Windows 10 机器上安装了 gvim,使用 gvim 的 Windows 安装程序,当我从可点击的图标启动 gvim 时,:diffthis 命令对我来说效果很好。当我从 PowerShell 运行它时,它也运行良好。我不必设置任何变量或任何东西。你有任何可能与 vim 冲突的自定义配置吗?
  • 当前 vim 自带 diff 功能,你不再需要外部 diff 命令。只需确保您的 diffopt 设置包含 internal
  • 我已经用其他信息更新了原始帖子。问题源于将我的 shell 定义为 Powershell。

标签: windows powershell vim windows-10 vimdiff


【解决方案1】:

问题归结为 vim/Powershell 是如何 A) 将命令封装在引号中和 B) 处理路径名中的空格。

我可以通过对$myvimrc 进行以下更改来绕过这个问题:

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

还更改了if 中的默认MyDiff() 函数,该函数将路径设置为cmd 变量中的差异:

  " below is the default
  " let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
  let cmd = "C:/diff"

此方法依赖于将 vim 附带的 diff.exe 复制到一个不包含空格的目录(C:\diff.exe)。

执行的结果命令是:

powershell -c C:/diff -a --binary C:/<redacted>/a.tmp C:/<redacted>/b.tmp > C:/<redacted>/c.tmp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多