Impossibile eseguire Vimdiff (7.4) su Windows 7


29

Di recente ho installato la versione 7.4 di gVim su un computer Windows 7. Cercando di diffondere due file dal menu sensibile al contesto su Windows Explorer, continuo a ricevere i messaggi di errore:

E810: Impossibile leggere o scrivere file temporanei
E97: Impossibile creare differenze

I due file selezionati vengono aperti nella vista gVim a due riquadri e l'editor sembra essere in modalità diff, ma le differenze effettive non vengono evidenziate.

Le variabili di ambiente %TEMP%e %TMP%sono popolate con un nome di directory valido.

Ottengo la stessa risposta aprendo i file in una normale sessione gVim e digitando :diffthisil prompt dei comandi.

Funzionava correttamente con Vim 7.3, ma sembrava che qualcosa fosse cambiato in v7.4.

Come posso diff i due file?

Risposte:


45

Questo problema può essere causato dal file _vimrc predefinito creato dal programma di installazione su Windows. Se stai ancora utilizzando quel file predefinito o se lo hai copiato ad un certo punto, controlla la funzione che hai assegnato diffexprall'opzione. Una delle patch tra Vim 7.3 e 7.4 ha introdotto nuove regole di quotazione predefinite per la shell cmd.exe su Windows. Questa patch ha risolto il problema con la funzione MyDiff () progettata per risolvere lo stesso problema risolto dalla patch.

La funzione MyDiff () è stata corretta dalla versione 7.4.103 correggendo il programma di installazione. Ecco la funzione MyDiff () che l'ultimo installer creerà per te se vuoi solo copiarlo sul tuo _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

È possibile visualizzare la versione completa in Vim utilizzando i :versiono :introcomandi, o la schermata iniziale all'avvio.

Sfortunatamente, se vuoi un programma di installazione ufficiale, dovrai aspettare fino alla 8.0 o installare una build notturna . Tuttavia, è possibile installare Vim da altri luoghi o creare il proprio Vim .


Duplicato su Stack Overflow (insolitamente, in argomento su entrambi i siti), se questa risposta viene aggiornata, così dovrebbe fare l'altro.


1
Ho trovato alcune soluzioni su Net, ma questa è l'unica che ha funzionato per me!

A proposito: come si può dire il # della sotto-versione (es. 7.4.103)?

Tre modi: l'avvio su un buffer vuoto mostra le informazioni sulla versione incluso il livello di patch, il :introcomando mostra lo stesso testo e il :versioncomando fornisce le informazioni su una riga "patch incluse". :versionfornisce anche un elenco molto dettagliato di funzionalità incluse o escluse.
Ben

1
Inoltre, Bram di solito non rilascia alcun programma di installazione ufficiale dopo la versione secondaria iniziale, ad esempio 7.4.0. Ma ci sono molti posti dove trovare un installer per un Vim più recente se non hai voglia di compilare, il più spesso citato probabilmente è qui: sourceforge.net/projects/cream/files/Vim
Ben

1
@Ben Ho risolto il problema, è stato qualcos'altro che lo ha causato, e ho capito male che si trattava di qualcosa MyDiff()da usare quando si utilizza VIM su Windows, ma è per qualcosa per usare VIM tramite CMD, sto usando VIM tramite Git Bash. Grazie.
Captain Man,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.