Powershell 中的 vimdiff E97
vimdiff E97 in Powershell
我无法让 vimdiff
在 Windows 10 机器上工作。我是来自 Powershell 的 运行ning 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
。我已经下载了推荐的 "GnuWin32 diff" 包并将安装目录添加到我的 Windows 路径 ($env:path
)。继续遵循这些指示,我已经注释掉了默认的 diffexpr
声明,但仍然得到 E97.
我也试过调用我自己的函数无济于事。在这次尝试中,我确保转义反斜杠,并将下载的 diff.exe
复制到我确信我拥有完全权限的目录。为了帮助排除故障,我暂时保存了我希望比较的两个文件,并明确指定了它们的完整路径,而不是使用 vim 的 v:fname_in
和 v: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
我通过 运行ning :h E97
研究了这个错误,其中 returns 以下信息:
Vim will do a test if the diff output looks alright. If it doesn't,
you will get an error message. Possible causes:
- The "diff" program cannot be executed.
- The "diff" program doesn't produce normal "ed" style diffs (see above).
- The 'shell' and associated options are not set correctly. Try if filtering works with a command like ":!sort".
- You are using 'diffexpr' and it doesn't work. If it's not clear what the problem is set the 'verbose' option to one or more to see
more messages.
The self-installing Vim for MS-Windows includes a diff program. If
you don't have it you might want to download a diff.exe. For example
from 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.exe
,diffthis
将按预期工作。好像others have also had this problem when using Powershell.
下面是命令 windows 的捕获,当 运行ning diffthis
与两个 shell 时弹出。使用的命令几乎相同。
我推测此尝试的 Powershell 版本中明显的正斜杠是有问题的,但我能够 运行 这个命令完全正确(用虚拟文件代替 . tmp 文件),它输出的文件似乎足以与 diff 一起使用。我也试过在反斜杠中添加 substitute
的正斜杠,但无济于事。
问题归结为 vim/Powershell 如何 A) 将命令封装在引号中和 B) 在路径名中处理白色 space。
我可以通过对 $myvimrc
进行以下更改来绕过这个问题:
set shell=powershell
set shellcmdflag=-c
set shellquote="
set shellxquote=
if
中的默认 MyDiff()
函数也发生了变化,它在 cmd
变量中设置 diff 的路径:
" below is the default
" let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
let cmd = "C:/diff"
为了简单起见,此方法依赖于将 vim 附带的 diff.exe
复制到路径中不包含 space 的目录(C:\diff.exe).
执行的结果命令是:
powershell -c C:/diff -a --binary C:/<redacted>/a.tmp C:/<redacted>/b.tmp > C:/<redacted>/c.tmp
我无法让 vimdiff
在 Windows 10 机器上工作。我是来自 Powershell 的 运行ning 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
。我已经下载了推荐的 "GnuWin32 diff" 包并将安装目录添加到我的 Windows 路径 ($env:path
)。继续遵循这些指示,我已经注释掉了默认的 diffexpr
声明,但仍然得到 E97.
我也试过调用我自己的函数无济于事。在这次尝试中,我确保转义反斜杠,并将下载的 diff.exe
复制到我确信我拥有完全权限的目录。为了帮助排除故障,我暂时保存了我希望比较的两个文件,并明确指定了它们的完整路径,而不是使用 vim 的 v:fname_in
和 v: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
我通过 运行ning :h E97
研究了这个错误,其中 returns 以下信息:
Vim will do a test if the diff output looks alright. If it doesn't, you will get an error message. Possible causes:
- The "diff" program cannot be executed.
- The "diff" program doesn't produce normal "ed" style diffs (see above).
- The 'shell' and associated options are not set correctly. Try if filtering works with a command like ":!sort".
- You are using 'diffexpr' and it doesn't work. If it's not clear what the problem is set the 'verbose' option to one or more to see more messages.
The self-installing Vim for MS-Windows includes a diff program. If you don't have it you might want to download a diff.exe. For example from 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.exe
,diffthis
将按预期工作。好像others have also had this problem when using Powershell.
下面是命令 windows 的捕获,当 运行ning diffthis
与两个 shell 时弹出。使用的命令几乎相同。
我推测此尝试的 Powershell 版本中明显的正斜杠是有问题的,但我能够 运行 这个命令完全正确(用虚拟文件代替 . tmp 文件),它输出的文件似乎足以与 diff 一起使用。我也试过在反斜杠中添加 substitute
的正斜杠,但无济于事。
问题归结为 vim/Powershell 如何 A) 将命令封装在引号中和 B) 在路径名中处理白色 space。
我可以通过对 $myvimrc
进行以下更改来绕过这个问题:
set shell=powershell
set shellcmdflag=-c
set shellquote="
set shellxquote=
if
中的默认 MyDiff()
函数也发生了变化,它在 cmd
变量中设置 diff 的路径:
" below is the default
" let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
let cmd = "C:/diff"
为了简单起见,此方法依赖于将 vim 附带的 diff.exe
复制到路径中不包含 space 的目录(C:\diff.exe).
执行的结果命令是:
powershell -c C:/diff -a --binary C:/<redacted>/a.tmp C:/<redacted>/b.tmp > C:/<redacted>/c.tmp