Vimdiff (7.4) kann unter Windows 7 nicht ausgeführt werden


29

Ich habe kürzlich die 7.4-Version von gVim auf einem Windows 7-Computer installiert. Beim Versuch, zwei Dateien aus dem Kontextmenü des Windows-Explorers zu unterscheiden, erhalte ich immer wieder die folgenden Fehlermeldungen:

E810: Temporäre Dateien können nicht gelesen oder geschrieben werden.
E97: Diffs können nicht erstellt werden

Die beiden ausgewählten Dateien werden in der gVim-Ansicht mit zwei Fenstern geöffnet, und der Editor befindet sich anscheinend im Diff-Modus, die tatsächlichen Unterschiede werden jedoch nicht hervorgehoben.

Die Umgebungsvariablen %TEMP%und %TMP%werden mit einem gültigen Verzeichnisnamen gefüllt.

Ich erhalte die gleiche Antwort, wenn ich die Dateien in einer regulären gVim-Sitzung öffne und :diffthisin die Eingabeaufforderung eingebe .

Früher funktionierte dies mit Vim 7.3 einwandfrei, aber es sah so aus, als ob etwas in Version 7.4 geändert wurde.

Wie kann ich die beiden Dateien unterscheiden?

Antworten:


45

Dieses Problem kann durch die vom Installationsprogramm unter Windows erstellte _vimrc-Standarddatei verursacht werden. Wenn Sie diese Standarddatei weiterhin verwenden oder sie irgendwann kopiert haben, überprüfen Sie die Funktion, die Sie der diffexprOption zugewiesen haben . Mit einem der Patches zwischen Vim 7.3 und 7.4 wurden neue Standard-Anführungsregeln für die cmd.exe-Shell unter Windows eingeführt. Mit diesem Patch wurde die Problemumgehung in der Funktion MyDiff () behoben, mit der dasselbe Problem behoben werden soll, das durch den Patch behoben wurde.

Die MyDiff () -Funktion wurde in Version 7.4.103 durch Beheben des Installationsprogramms behoben. Hier ist die MyDiff () -Funktion, die das neueste Installationsprogramm für Sie erstellt, wenn Sie sie nur in Ihr _vimrc kopieren möchten:

 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

Sie können Ihre Vollversion in Vim mit den sehen :versionoder :introBefehlen oder an dem Splash - Screen beim Start.

Wenn Sie ein offizielles Installationsprogramm benötigen, müssen Sie entweder bis 8.0 warten oder ein nächtliches Build installieren . Sie können Vim jedoch auch von anderen Orten aus installieren oder Ihr eigenes Vim erstellen .


Dupliziert bei Stapelüberlauf (ungewöhnlich thematisch auf beiden Sites), wenn diese Antwort aktualisiert wird, sollte auch die andere aktualisiert werden.


1
Habe dann net ein paar Lösungen gefunden, aber dies ist die einzige, die bei mir funktioniert hat!
ysap

Übrigens - wie kann man die # der Unterversion (zB 7.4.103) erkennen?
ysap

Drei Möglichkeiten: Beim Starten in einem leeren Puffer werden Versionsinformationen einschließlich Patch-Level angezeigt, der :introBefehl zeigt denselben Text an und der :versionBefehl gibt die Informationen in einer Zeile mit eingeschlossenen Patches an. :versionenthält auch eine sehr detaillierte Liste der eingeschlossenen oder ausgeschlossenen Funktionen.
Ben

1
Außerdem veröffentlicht Bram in der Regel keine offiziellen Installationsprogramme nach der ersten Nebenversion, z. B. 7.4.0. Es gibt jedoch viele Orte, an denen Sie ein Installationsprogramm für ein neueres Vim finden können, wenn Sie keine Lust zum Kompilieren haben. Das am häufigsten genannte ist wahrscheinlich hier: sourceforge.net/projects/cream/files/Vim
Ben

1
@Ben Ich habe das Problem behoben, es hat etwas anderes verursacht, und ich habe es falsch verstanden MyDiff(), wenn ich vim unter Windows verwende, aber es ist etwas für die Verwendung von vim durch cmd, ich verwende vim durch git bash. Vielen Dank.
Captain Man
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.