Не могу запустить Vimdiff (7.4) в Windows 7

29

Я недавно установил версию 7.4 gVim на машине с Windows 7. Пытаясь различать два файла из контекстного меню в проводнике Windows, я получаю сообщения об ошибках:

E810: не удается прочитать или записать временные файлы E97: не удается
создать diff

Два выбранных файла открываются в двухпанельном представлении gVim, и редактор, кажется, находится в режиме сравнения, но фактические различия не выделяются.

В %TEMP%и %TMP%переменные окружения заполняются с действительным именем каталога.

Я получаю тот же ответ при открытии файлов в обычном сеансе gVim и вводе :diffthisв командной строке.

Раньше это правильно работало с Vim 7.3, но, похоже, что-то изменилось в v7.4.

Как я могу различить два файла?

ysap
источник

Ответы:

45

Эта проблема может быть вызвана файлом _vimrc по умолчанию, созданным установщиком в Windows. Если вы по-прежнему используете этот файл по умолчанию или скопировали его в какой-то момент, проверьте функцию, назначенную этой diffexprопции. В одном из патчей между Vim 7.3 и 7.4 были введены новые правила цитирования по умолчанию для оболочки cmd.exe в Windows. Этот патч преодолел обходной путь в функции MyDiff (), предназначенной для устранения той же проблемы, решаемой патчем.

Функция MyDiff () была исправлена ​​в версии 7.4.103 путем исправления установщика. Вот функция MyDiff (), которую последняя версия установщика создаст для вас, если вы просто захотите скопировать ее в _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

Вы можете увидеть вашу полную версию в Vim с помощью :versionили :introкоманд, или на экране заставки при запуске.

К сожалению, если вам нужен официальный установщик, вам придется подождать до 8.0 или установить ночную сборку . Тем не менее, вы можете установить Vim из других мест или создать свой собственный Vim .


Дублируется при переполнении стека (необычно, по теме на обоих сайтах), если этот ответ обновляется, то же самое следует делать и с другим.

Бен
источник
1
Нашел несколько решений в сети, но это единственное, что сработало для меня!
ysap
Кстати, как вы можете сказать # субверсии (например, 7.4.103)?
ysap
Три способа: запуск в пустом буфере показывает информацию о версии, включая уровень патча, :introкоманда показывает тот же текст, а :versionкоманда выдает информацию в строке «включенные патчи». :versionтакже дает очень подробный список включенных или исключенных функций.
Бен
1
Кроме того, Брэм обычно не выпускает никаких официальных инсталляторов после начальной минорной версии, например, 7.4.0. Но есть много мест, где можно найти установщик для более свежего Vim, если вы не хотите компилировать, наиболее часто упоминаемое здесь: sourceforge.net/projects/cream/files/Vim
Ben
1
@Ben Я исправил проблему, это было вызвано чем-то другим, и я неправильно понял, что это MyDiff()то, что нужно использовать при использовании vim на окнах, но это для чего-то для использования vim через cmd, я использую vim через git bash. Спасибо.
Капитан Мэн