No se puede ejecutar Vimdiff (7.4) en Windows 7

29

Recientemente instalé la versión 7.4 de gVim en una máquina con Windows 7. Intento diferenciar dos archivos del menú contextual en el Explorador de Windows, sigo recibiendo los mensajes de error:

E810: no se pueden leer ni escribir archivos temporales
E97: no se pueden crear diferencias

Los dos archivos seleccionados se abren en la vista gVim de dos paneles, y el editor parece estar en modo diff, pero las diferencias reales no se resaltan.

Las variables de entorno %TEMP%y %TMP%se rellenan con un nombre de directorio válido.

Recibo la misma respuesta cuando abro los archivos en una sesión normal de gVim y escribo :diffthisen el símbolo del sistema.

Esto solía funcionar correctamente con Vim 7.3, pero parecía que algo había cambiado en v7.4.

¿Cómo puedo diferenciar los dos archivos?

ysap
fuente

Respuestas:

45

Este problema puede deberse al archivo _vimrc predeterminado creado por el instalador en Windows. Si todavía está usando ese archivo predeterminado, o si lo copió en algún momento, verifique la función que ha asignado a la diffexpropción. Uno de los parches entre Vim 7.3 y 7.4 introdujo nuevas reglas de cotización predeterminadas para el shell cmd.exe en Windows. Este parche rompió la solución en la función MyDiff () diseñada para solucionar el mismo problema resuelto por el parche.

La función MyDiff () se corrigió con la versión 7.4.103 arreglando el instalador. Aquí está la función MyDiff () que el último instalador creará para usted si solo desea copiarla en su _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

Puede ver su versión completa en Vim usando los :versiono :introcomandos, o en la pantalla de bienvenida al inicio.

Lamentablemente, si desea un instalador oficial, deberá esperar hasta 8.0 o instalar una compilación nocturna . Sin embargo, puede instalar Vim desde otros lugares o construir su propio Vim .


Duplicado en el desbordamiento de pila (inusualmente, sobre el tema en ambos sitios), si esta respuesta se actualiza, también debería hacerlo la otra.

Ben
fuente
1
¡Encontré algunas soluciones en la red, pero esta es la única que funcionó para mí!
ysap
Por cierto, ¿cómo puede saber el número de la sub-versión (por ejemplo, 7.4.103)?
ysap
Tres formas: el inicio en un búfer vacío muestra información de la versión, incluido el nivel de parche, el :introcomando muestra el mismo texto y el :versioncomando proporciona la información en una línea de "parches incluidos". :versionTambién ofrece una lista muy detallada de características incluidas o excluidas.
Ben
1
Además, Bram no suele lanzar instaladores oficiales después de la versión menor inicial, por ejemplo, 7.4.0. Pero hay muchos lugares para obtener un instalador para un Vim más reciente si no tiene ganas de compilar, el más citado probablemente esté aquí: sourceforge.net/projects/cream/files/Vim
Ben
1
@Ben he solucionado el problema, era algo más que causaba esto, y entendí mal MyDiff()que era algo para usar cuando usaba vim en Windows, pero es para usar vim a través de cmd, estoy usando vim a través de git bash. Gracias.
Capitán Man