Не вдається запустити 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.

Як я можу розмежувати два файли?

Відповіді:


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

BTW - як ви можете вказати номер під-версії (наприклад, 7.4.103)?
ysap

Три способи: запуск у порожньому буфері відображає інформацію про версію, включаючи рівень патчу, :introкоманда показує той самий текст, а :versionкоманда надає інформацію в рядку "включені патчі". :versionтакож надається дуже детальний перелік включених або виключених функцій.
Бен

1
Також Bram зазвичай не випускає жодних офіційних установців після початкової другорядної версії, наприклад, 7.4.0. Але є багато місць, щоб отримати інсталятор для більш недавнього Vim, якщо ви не хочете компілювати, найчастіше цитуючи це, ймовірно, тут: sourceforge.net/projects/cream/files/Vim
Бен

1
@Ben Я вирішив проблему, це спричинило щось інше, і я неправильно зрозумів, що це MyDiff()щось для використання під час використання vim на windows, але це для чогось використання vim через cmd, я використовую vim через git bash. Дякую.
Капітан Людина
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.