Não é possível executar o Vimdiff (7.4) no Windows 7


29

Eu instalei recentemente a versão 7.4 do gVim em uma máquina com Windows 7. Tentando diferenciar dois arquivos do menu sensível ao contexto no Windows Explorer, continuo recebendo as mensagens de erro:

E810: Não é possível ler ou gravar arquivos temporários.
E97: Não é possível criar diferenças

Os dois arquivos selecionados são abertos na visualização gVim em dois painéis e o editor parece estar no modo diff, mas as diferenças reais não são destacadas.

As variáveis ​​de ambiente %TEMP%e %TMP%são preenchidas com um nome de diretório válido.

Recebo a mesma resposta ao abrir os arquivos em uma sessão normal do gVim e digitar :diffthisno prompt de comando.

Isso costumava funcionar corretamente com o Vim 7.3, mas parecia que algo havia mudado na v7.4.

Como posso diferenciar os dois arquivos?

Respostas:


45

Esse problema pode ser causado pelo arquivo _vimrc padrão criado pelo instalador no Windows. Se você ainda estiver usando esse arquivo padrão, ou se você o copiou em algum momento, verifique a função que você atribuiu à diffexpropção. Um dos patches entre o Vim 7.3 e 7.4 introduziu novas regras de cotação padrão para o shell cmd.exe no Windows. Esse patch quebrou a solução alternativa na função MyDiff () projetada para corrigir o mesmo problema resolvido pelo patch.

A função MyDiff () foi corrigida pela versão 7.4.103, corrigindo o instalador. Aqui está a função MyDiff () que o instalador mais recente criará para você, se você quiser apenas copiá-la para o seu _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

Você pode ver a sua versão completa no Vim usando as :versionou :introcomandos, ou na tela inicial na inicialização.

Infelizmente, se você deseja um instalador oficial, precisará esperar até 8.0 ou instalar uma compilação noturna . No entanto, você pode instalar o Vim de outros lugares ou criar seu próprio Vim .


Duplicado no estouro de pilha (incomumente, no tópico nos dois sites), se essa resposta for atualizada, a outra deverá ser a mesma.


1
Encontrei algumas soluções na net, mas essa é a única que funcionou para mim!
ysap

BTW - como você pode dizer o número da sub-versão (por exemplo, 7.4.103)?
ysap

Três maneiras: a inicialização em um buffer vazio mostra as informações da versão, incluindo o nível do patch, o :introcomando mostra o mesmo texto e o :versioncomando fornece as informações em uma linha "patches incluídos". :versiontambém fornece uma lista muito detalhada dos recursos incluídos ou excluídos.
Ben

1
Além disso, o Bram geralmente não libera instaladores oficiais após a versão menor inicial, por exemplo, 7.4.0. Mas há muitos lugares para obter um instalador para um Vim mais recente, se você não quiser compilar, o mais citado provavelmente está aqui: sourceforge.net/projects/cream/files/Vim
Ben

1
@Ben corrigi o problema, era algo que estava causando isso, e eu entendi errado que isso MyDiff()é algo para usar ao usar o vim no Windows, mas é para algo para usar o vim através do cmd, estou usando o vim através do git bash. Obrigado.
Captain Man
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.