roo*_*oot 5 windows vim powershell vimdiff windows-10
我无法vimdiff在Windows 10计算机上工作。我正在Powershell中运行vim。Powershell也被声明$myvimrc为我的选择外壳:
set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe
Run Code Online (Sandbox Code Playgroud)
我尝试比较的文档未保存为文件。我打开两个垂直拆分,在每个拆分中输入文本,然后运行:windo diffthis。输出为E97: Cannot create diffs。
本文说我可能需要下载并使用不同于diff.exegvim所安装的软件。我已经下载了推荐的“ 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
Run Code Online (Sandbox Code Playgroud)
我通过运行来研究此错误,该错误: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”样式diff。我没有在中设置其他与外壳相关的参数(shelltype,shellpipe等)$myvimrc,但是执行其他命令:!完全没有问题。
中没有其他信息:messages,只有E97错误。
编辑:
如果我set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe从中删除$myvimrc,则默认将外壳恢复为cmd.exe,diffthis则按预期工作。似乎其他人在使用Powershell时也遇到了这个问题。
以下是在diffthis两个shell上运行时弹出的命令窗口的捕获。使用的命令几乎相同。
我曾推测,这种尝试在Powershell版本中出现的正斜杠是有问题的,但是我能够准确地运行此命令(使用伪文件代替.tmp文件),并且它输出的文件似乎足以满足与差异一起使用。我也尝试过将substitute正斜杠添加到反斜杠无济于事。
问题归结为 vim/Powershell 如何 A) 将命令封装在引号中以及 B) 处理路径名中的空格。
我可以通过以下更改绕过此问题$myvimrc:
set shell=powershell
set shellcmdflag=-c
set shellquote="
set shellxquote=
Run Code Online (Sandbox Code Playgroud)
MyDiff()还对默认函数进行了更改,if将路径设置为cmd变量中的 diff:
" below is the default
" let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
let cmd = "C:/diff"
Run Code Online (Sandbox Code Playgroud)
为了简单起见,此方法依赖于将diff.exevim 附带的文件复制到路径中不包含空格的目录 (C:\diff.exe)。
执行的结果命令是:
powershell -c C:/diff -a --binary C:/<redacted>/a.tmp C:/<redacted>/b.tmp > C:/<redacted>/c.tmp
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |