Nie można uruchomić Vimdiff (7.4) w systemie Windows 7


29

Niedawno zainstalowałem wersję 7.4 gVim na komputerze z systemem Windows 7. Próbując różnicować dwa pliki z menu kontekstowego w Eksploratorze Windows, wciąż otrzymuję komunikaty o błędach:

E810: Nie można odczytać ani zapisać plików tymczasowych
E97: Nie można utworzyć różnic

Dwa wybrane pliki są otwierane w dwupanelowym widoku gVim, a edytor wydaje się być w trybie różnicowym, ale rzeczywiste różnice nie są podświetlone.

Te %TEMP%i %TMP%zmienne środowiskowe są wypełniane z poprawną nazwą katalogu.

Otrzymuję tę samą odpowiedź podczas otwierania plików podczas zwykłej sesji gVim i pisania :diffthisw wierszu polecenia.

Kiedyś działało to poprawnie z Vimem 7.3, ale wyglądało na to, że coś zostało zmienione w wersji 7.4.

Jak mogę różnicować oba pliki?

Odpowiedzi:


45

Przyczyną tego problemu może być domyślny plik _vimrc utworzony przez instalatora w systemie Windows. Jeśli nadal korzystasz z tego domyślnego pliku lub w którymś momencie go skopiowałeś, sprawdź funkcję przypisaną do diffexpropcji. Jedna z łatek między Vimem 7.3 a 7.4 wprowadziła nowe domyślne reguły cytowania dla powłoki cmd.exe w systemie Windows. Ta łatka złamała obejście funkcji MyDiff () zaprojektowanej w celu rozwiązania tego samego problemu rozwiązanego przez łatkę.

Funkcja MyDiff () została naprawiona w wersji 7.4.103 przez naprawienie instalatora. Oto funkcja MyDiff (), którą utworzy dla ciebie najnowszy instalator, jeśli chcesz po prostu skopiować go do _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

Można zobaczyć pełną wersję w vim przy użyciu :versionlub :intropoleceń, lub na ekran powitalny przy uruchamianiu.

Niestety, jeśli chcesz oficjalnego instalatora, musisz poczekać do 8.0 lub zainstalować kompilację nocną . Niemniej jednak możesz zainstalować Vima z innych miejsc lub zbudować własnego Vima .


Zduplikowane przy przepełnieniu stosu (niezwykle, na temat w obu witrynach), jeśli ta odpowiedź zostanie zaktualizowana, druga powinna również.


1
Znalazłem kilka rozwiązań w sieci wtedy, ale to jedyne, które działało dla mnie!
ysap

BTW - jak rozpoznać numer pod-wersji (np. 7.4.103)?
ysap

Trzy sposoby: uruchomienie przy pustym buforze pokazuje informacje o wersji, w tym poziom łaty, :intropolecenie wyświetla ten sam tekst, a :versionpolecenie podaje informacje w wierszu „uwzględnione łaty”. :versiondaje również bardzo szczegółową listę włączonych lub wyłączonych funkcji.
Ben

1
Ponadto Bram zwykle nie publikuje żadnych oficjalnych instalatorów po początkowej wersji dodatkowej, np. 7.4.0. Ale istnieje wiele miejsc, w których można uzyskać instalator najnowszego Vima, jeśli nie masz ochoty na kompilację, najczęściej cytowany prawdopodobnie tutaj: sourceforge.net/projects/cream/files/Vim
Ben

1
@Ben Naprawiłem problem, przyczyną tego było coś innego i źle zrozumiałem, że MyDiff()jest to coś, co można wykorzystać podczas korzystania z vima w systemie Windows, ale jest to coś do używania vim przez cmd, używam vim przez git bash. Dziękuję Ci.
Captain Man,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.