29

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

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

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

Переменные среды %TEMP% и %TMP% заполняются допустимым именем каталога.

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

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

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

1 ответ1

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.


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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .