在Windows 7上无法运行Vimdiff(7.4)


29

我最近在Windows 7计算机上安装了7.4版本的gVim。尝试从Windows资源管理器的上下文相关菜单中区分两个文件,我不断收到错误消息:

E810:无法读取或写入临时文件
E97:无法创建差异

在两个窗格的gVim视图中打开了两个选定的文件,并且编辑器似乎处于diff模式,但未突出显示实际差异。

%TEMP%%TMP%环境变量会以一个有效的目录名。

在常规gVim会话中打开文件并:diffthis在命令提示符下键入时,我得到相同的响应。

以前可以在Vim 7.3上正常使用,但是好像在v7.4中有所更改。

如何区分两个文件?

Answers:


45

此问题可能是由Windows上的安装程序创建的默认_vimrc文件引起的。如果您仍在使用该默认文件,或者在某个时候复制了该文件,请检查已分配给该diffexpr选项的功能。Vim 7.3和7.4之间的补丁之一为Windows上的cmd.exe shell引入了新的默认引用规则。此修补程序破坏了MyDiff()函数中的解决方法,该功能旨在解决该修补程序解决的相同问题。

通过修复安装程序,7.4.103版修复了MyDiff()函数。这是MyDiff()函数,如果您只想将其复制到_vimrc,最新的安装程序将为您创建:

 function MyDiff()
   let opt = '-a --binary '
   if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
   if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
   let arg1 = v:fname_in
   if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
   let arg2 = v:fname_new
   if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
   let arg3 = v:fname_out
   if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
   if $VIMRUNTIME =~ ' '
     if &sh =~ '\<cmd'
       if empty(&shellxquote)
         let l:shxq_sav = ''
         set shellxquote&
       endif
       let cmd = '"' . $VIMRUNTIME . '\diff"'
     else
       let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
     endif
   else
     let cmd = $VIMRUNTIME . '\diff'
   endif
   silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
   if exists('l:shxq_sav')
     let &shellxquote=l:shxq_sav
   endif
 endfunction

您可以使用:version:intro命令在Vim中查看完整版本,也可以在启动时在启动屏幕上查看完整版本。

不幸的是,如果您需要正式的安装程序,则将需要等到8.0或安装每夜构建一次。但是,您可以从其他地方安装Vim构建自己的Vim


如果此答案已更新,则在堆栈溢出(通常在两个站点上都是专题)上重复


1
在网上找到了一些解决方案,但这是唯一对我有用的解决方案!
ysap 2014年

顺便说一句-您如何分辨子版本号(例如7.4.103)?
ysap 2014年

三种方式:在空缓冲区中启动会显示版本信息(包括补丁程序级别),:intro命令会显示相同的文本,:version命令会在“包含的补丁程序”行中提供信息。:version还给出了包含或排除功能的非常详细的列表。
2014年

1
另外,在最初的次要版本(例如7.4.0)之后,Bram通常不会发布任何官方安装程序。但也有很多地方可以得到一个更近的Vim的安装程序,如果你不喜欢编译时,最经常提到的可能是在这里:sourceforge.net/projects/cream/files/Vim

1
@Ben我已经解决了这个问题,这是导致此问题的其他原因,并且我误解MyDiff()了在Windows上使用vim时要使用的东西,但这是为了通过cmd使用vim,而我是通过git bash使用vim。谢谢。
曼队长
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.