Vimdiff失败了“无法读取或写入临时文件”

时间:2014-02-18 18:31:48

标签: vim

我在Windows 7上使用Vim 7.4。

我有一个自定义_vimrc文件,但Vim和gVim都可以正常工作。当我尝试运行vimdiff .\xxxxx .\yyyyy时,会出现错误

  

无法读取或写入临时文件

7 个答案:

答案 0 :(得分:52)

此问题可能是由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中查看完整版本,也可以在启动时在启动画面中查看。

官方Vim 8.0安装程序现已推出,您也可以安装nightly buildinstall Vim from other placesbuild your own Vim。如果你想获取这个函数的最新版本,使用这些方法中的任何一个安装应该会获得最新的默认vimrc文件。

Copied from my answer到此same question on Super User

答案 1 :(得分:7)

添加:

设置shell = c:\ cygwin64 \ bin \ bash.exe

到我的_vimrc为我工作。

答案 2 :(得分:4)

我收到了这个确切的错误,无意中摆弄了set backupdir的权限。

但后来我记得我最近更改为Windows 7并使用Cygwin 64而忘记重新命名以下设置。

set shell=c:\\cygwin64\\bin\\zsh.exe shellcmdflag=-c shellxquote=\"

嘿presto错误消失了,现在有以下情况:

gvim -d v1.php v2.php

所以这个错误真正说的是我找不到你的shell或cmd!

答案 3 :(得分:1)

我也收到了消息

  

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

但是我的_vimrc文件很好。

问题是C:\Program Files\Vim\vim74不在PATH环境变量中,因此Vim无法启动diff.exe

答案 4 :(得分:1)

我在Windows 7上安装了Vim 8.0。将包含vim的目录添加到我的PATH变量“diffthis”之后,如果从CMD命令行调用,则开箱即用。但是从cygwin bash调用gvim会导致错误“E97:无法创建差异”。

以下_vimrc(受the Mozilla documentationthis启发)解决了cygwin的问题,它也适用于Windows命令行:

runtime vimrc_example.vim
" Change path to bash with your workstation specific path
set shell=C:\Programme\cygwin\bin\bash
" Override value of TMP from cygwin (normally set to /tmp)
let $TMP="c:/tmp"

请注意,使用上面的_vimrc会丢失gvim的Windows特定行为,例如使用CTRL-V进行粘贴等(无论如何都可以使用SHIFT-Ins)。但是,如果启用了Windows特定的行为(例如在安装期间生成的_vimrc),gvim无法使用“E97:...”错误执行“diffthis”。

答案 5 :(得分:0)

您是否已将vim shell设置为powershell?如果这样,this answer可能会起作用。经过艰苦的搜索,我的问题得以解决。

至少要查看您正在使用的shell,或尝试将vim shell设置为其他shell(如果已安装),例如set shell=/path/to/bash.exe,可能会有所启发。

答案 6 :(得分:0)

Vim 8.1

我遇到了这个问题,this answer为我解决了这个问题。

将此添加到您的〜/ .vimrc

set shell=$COMSPEC

对于在Windows中使用git的我来说,该值为:C:\WINDOWS\system32\cmd.exe

还要注意,在该线程every answer other than the top answer relates to changing your shell variable中。因此,如果您是偶然发现此答案的人,请尝试一下。