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

15661
ysap

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

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

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

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

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

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

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

29

1 ответ на вопрос

45
Ben

Эта проблема может быть вызвана файлом _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 .


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

Нашел несколько решений в сети, но это единственное, что сработало для меня! ysap 10 лет назад 1
Кстати, как вы можете сказать # субверсии (например, 7.4.103)? ysap 10 лет назад 0
Три способа: запуск в пустом буфере показывает информацию о версии, включая уровень патча, команда `: intro` показывает тот же текст, а команда`: версия` выдает информацию в строке «включенные патчи». `: версия` также дает очень подробный список включенных или исключенных функций. Ben 10 лет назад 0
Кроме того, Брэм обычно не выпускает никаких официальных установщиков после начальной минорной версии, например, 7.4.0. Но есть много мест, где можно найти установщик для более свежего Vim, если вы не хотите компилировать, наиболее часто упоминаемое здесь: http://sourceforge.net/projects/cream/files/Vim/ Ben 10 лет назад 1
Ну, экран запуска и `: intro` показывают мне одну и ту же информацию (то есть, просто" 7.4 "). `: версия` показывает" 7.4 "и уточняет время компиляции. Нет номера версии патча. Ваш второй комментарий может объяснить, почему это так. Он составлен с помощью `mool (at) tororo`, что, как я полагаю, относится к мистеру Мулнеру. ysap 10 лет назад 0
Да, если уровень патча не указан, у вас есть 7.4.0. Ben 10 лет назад 0
Я помещаю `MyDiff ()` и `set difxpr = MyDiff ()` в мой `.vimrc`, и все равно получаю ошибку. Я использую Git для Windows 'vim / vimdif (`: версия` дает 7.4, патчи: 1-872). Я пропускаю шаг? Captain Man 9 лет назад 0
Другой причиной ошибок diff является несуществующий каталог TMP или TEMP. Повторяйте значения $ TMP и $ TEMP в Vim, указывают ли они на доступные для записи существующие местоположения? Ben 9 лет назад 0
@Ben это то, где вещи стали немного странными. `: echo $ TMP` и`: echo $ TEMP` были оба `/ tmp`. После выполнения `cd / tmp` в git bash и выполнения` ls` для исследования выясняется, что он сопоставлен с `C: \ Windows \ Temp`, я щелкнул правой кнопкой мыши и сделал папку * не * доступной только для чтения, но все еще продолжаю похоже, понял эту проблему. Я снова посмотрел на папку, и, похоже, Windows снова сделала ее доступной только для чтения, почему, я не знаю, но, похоже, она каждый раз сбрасывает ее обратно. Мне нужно найти способ, чтобы он всегда * не * был доступен только для чтения или отображал этот `/ tmp` в другую папку. Captain Man 9 лет назад 0
@ Установите для них `/ c / temp` и запустите` cacls C: \ temp / E / G each: F` (который, как я понимаю, должен предоставить всем полный доступ), все равно приводит к тем же ошибкам. (Я также попробовал это на `C: \ Windows \ Temp`, как предложено [здесь] (http://answers.microsoft.com/en-us/windows/forum/windows_xp-security/user-profile-does-not- разрешение-записи к / 6d107e09-9127-4255-a8b0-1c76a0be9683? AUTH = 1)). Captain Man 9 лет назад 0
C: \ Temp существует в вашей системе? Это не по умолчанию в Windows в эти дни. Я не ожидаю, что что-то в C: \ Windows когда-либо будет работать; эти папки всегда нуждаются в правах администратора для доступа по уважительным причинам, я не могу себе представить, кто считал, что это хорошее расположение TMP. На что установлена ​​ваша оболочка? Различный вариант действительно предназначен для стандартной установки cmd.exe. Ben 9 лет назад 0
@Ben Я исправил проблему, это было вызвано чем-то другим, и я неправильно понял, что `MyDiff ()` используется для использования vim на окнах, но это для чего-то для использования vim через cmd, я использую vim через Git Bash. Спасибо. Captain Man 9 лет назад 1
Если это может ударить других, не стесняйтесь добавить еще один ответ. В функции MyDiff есть место для других оболочек, но я не уверен, насколько хорошо это работает. Ben 9 лет назад 0
Только что обнаружил, что предлагаемое исправление (которое отлично работает в течение нескольких лет после переноса между системами) завершается неудачно при попытке vimdiff с терминала Cygwin. По-видимому, блок, если он принимает неправильную ветку b / c, неправильно идентифицирует командную оболочку. ysap 8 лет назад 0
Сообщаемое `& sh` является` / bin / bash`, а не `cmd.exe`, но фактическая оболочка, конечно же,` cmd.exe`, поэтому схема цитирования не работает. ysap 8 лет назад 0
Я не думаю, что я следую за вами правильно. Если вы запускаете Vim в cygwin с оболочкой, настроенной на cygwin bash, почему вы ожидаете использовать правила цитирования cmd.exe? Ben 8 лет назад 0
Бен, я ничего не ожидаю ... просто сообщаю о том, что вижу. После публикации этого комментария я понял, что на самом деле есть два проблемных случая - один использует difftool в Git для просмотра файловых различий (в этом случае он использует оболочку `bash` из установки Git), а второй - при запуске` gvim -d `из командной строки Cygwin bash. ysap 8 лет назад 0
В функции `MyDiff ()`, которую вы опубликовали, я удалил `silent`, чтобы увидеть фактическую командную строку. Команда Git создает: `C: / Program Files (x86) / Git / bin / bash -c" c: \ Program "Files (x86) \ Vim \ vim74 \ diff" -a --binary C: / cygwin64 / tmp /VIoEA21.tmp C: /cygwin64/tmp/VInEA22.tmp> C: /cygwin64/tmp/VIdEA23.tmp "`. ysap 8 лет назад 0
Команда Cygwin выдала: `/ bin / bash -c" "C: \ Program Files (x86) \ Vim \ vim74 \ diff" -a --binary C: /cygwin64/tmp/VIo6893.tmp C: / cygwin64 / tmp /VIn6894.tmp> C: /cygwin64/tmp/VId6895.tmp "`. Вы можете видеть, что сгенерированные команды отличаются, и кавычки установлены в неправильном месте. ysap 8 лет назад 0
Во всяком случае, я немного поиграл (не так уж мало на самом деле ...) с функцией, но не смог заставить ее работать. Я получил это для генерации следующей команды: `/ bin / bash -c" C: / Program \ Files \ \ (x86 \) / Vim / vim74 / diff -a --binary C: /cygwin64/tmp/VIo6C5B.tmp C: /cygwin64/tmp/VIn6C5C.tmp> C: /cygwin64/tmp/VId6C5D.tmp "` но по какой-то неопознанной причине он по-прежнему не открывает редактор должным образом. Однако при использовании той же строки вручную из командной строки bash - это на самом деле работает. Итак, проблема заключается в шаге `gvim -d`. ysap 8 лет назад 0
Я не знаю достаточно о Vim в cygwin, чтобы решить эту проблему очень хорошо. Я знаю, что у cygwin есть пакет Vim, который будет по-настоящему понимать пути cygdrive и тому подобное. Я также уверен, что обычный Windows Vim, вероятно, может работать с оболочкой и инструментами cygwin, но вам нужно будет тщательно настроить все параметры, связанные с оболочкой, в частности, shellquote и shellxquote. Разобраться в этой конфигурации, вероятно, стоит другого ответа. Ben 8 лет назад 0
В cygwin / vim скомпилировано очень мало функций, поэтому лучше взять официальную сборку gvim для windows, если все функции будут включены и протестированы. Если вы используете cygwin64, установите shell = c: / cygwin64 / bin / bash для решения вышеуказанной проблемы, это также влияет на все плагины, которые запускают команды оболочки, такие как fugitive.vim. mosh 7 лет назад 0