vimdiff E97 в Powershell

У меня возникли проблемы с запуском vimdiff на компьютере с Windows 10. Я запускаю vim из Powershell. Powershell также объявлен в $myvimrc как моя предпочтительная оболочка:

set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe

Документы, которые я пытаюсь сравнить, не сохраняются в виде файлов. Я открываю два вертикальных разделения, ввожу текст в каждое и запускаю :windo diffthis. Выход E97: Cannot create diffs.

В В этой статье говорится, что мне может потребоваться загрузить и использовать другой diff.exe, чем тот, который установлен с gvim. Я загрузил рекомендуемый пакет "GnuWin32 diff" и добавил каталог установки в свой путь к Windows ($env:path). Продолжая следовать этим указаниям, я закомментировал объявление по умолчанию diffexpr, но все равно получил E97.

Я также пытался вызвать свою собственную функцию безрезультатно. В этой попытке я постарался избежать обратной косой черты, а также скопировал загруженный diff.exe в каталог, на который, как я уверен, у меня есть полные права. Чтобы помочь в устранении неполадок, я временно сохранил два файла, которые хочу сравнить, и явно указал их полные пути, а не использовал v:fname_in и v:fname_newv:fname_out) vim.

set diffexpr=TestDiff()
function TestDiff()
       silent execute "!& " . "C:\\diff.exe" . " -a --binary " "C:\\a.edi" . " " . "C:\\b.edi" . " > " . "C:\\tmp.txt"
endfunction

Я исследовал эту ошибку, запустив :h E97, которая возвращает следующую информацию:

Vim выполнит тест, если вывод diff выглядит нормально. Если это не так, вы получите сообщение об ошибке. Возможные причины:

  • Программа "diff" не может быть выполнена.
  • Программа "diff" не производит нормальных различий в стиле "ed" (см. выше).
  • «Оболочка» и связанные с ней параметры установлены неправильно. Попробуйте, работает ли фильтрация с командой вроде ":!sort".
  • Вы используете «diffexpr», и это не работает. Если неясно, в чем проблема, установите для параметра «Подробный» значение одно или несколько, чтобы увидеть больше сообщений.

Самоустанавливающийся Vim для MS-Windows включает в себя программу сравнения. Если у вас его нет, вы можете скачать diff.exe. Например, из http://gnuwin32.sourceforge.net/packages/diffutils.htm .

Я полагаю, что удовлетворяю первые два из этих требований, поскольку tmp.txt генерируется и соответствует примеру различий в стиле "ed", приведенному в файле справки. Я не устанавливал другие параметры, связанные с оболочкой (shelltype, shellpipe и т. д.) в $myvimrc, но выполнение других команд с :! завершается без проблем.

В :messages никакой дополнительной информации нет, только ошибка Е97.

Изменить: если я удалю set shell=C:\WINDOWS\system32\WindowsPowershell\v1.0\powershell.exe из $myvimrc, вернув оболочке значение cmd.exe по умолчанию, diffthis будет работать как положено. Похоже, что у других также возникла эта проблема при использовании Powershell. .

Ниже приведены снимки командных окон, которые появляются при запуске diffthis с обеими оболочками. Используемые команды почти идентичны.

команд

powershell

Я предположил, что косая черта, очевидная в версии Powershell этой попытки, была проблематичной, но я могу точно запустить эту команду (с фиктивными файлами вместо файлов .tmp), и она выводит то, что кажется подходящим файлом для использовать с диф. Я также пытался добавить substitute косой черты к обратной косой черте, но безрезультатно.


person root    schedule 05.06.2019    source источник
comment
Что бы это ни стоило, я установил gvim на свой компьютер с Windows 10, используя установщик Windows для gvim, и команда :diffthis отлично работала для меня, когда я запускал gvim из интерактивных значков. Он также отлично работал, когда я запускал его из PowerShell. Мне не нужно было устанавливать какие-либо переменные или что-то еще. Есть ли у вас какая-либо пользовательская конфигурация, которая может конфликтовать с vim?   -  person joanis    schedule 11.06.2019
comment
текущий vim поставляется с включенной функцией diff, вам больше не нужна внешняя команда diff. Просто убедитесь, что ваша настройка diffopt включает internal   -  person Christian Brabandt    schedule 12.06.2019
comment
Я обновил исходный пост дополнительной информацией. Проблема связана с определением моего shell как Powershell.   -  person root    schedule 13.06.2019


Ответы (1)


Проблема сводится к тому, как vim/Powershell: а) инкапсулируют команду в кавычки и б) обрабатывают пробелы в именах путей.

Я могу обойти эту проблему, внеся следующие изменения в $myvimrc:

set shell=powershell
set shellcmdflag=-c
set shellquote="
set shellxquote=

Также изменена функция MyDiff() по умолчанию в if, которая устанавливает путь к diff в переменной cmd:

  " below is the default
  " let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
  let cmd = "C:/diff"

Этот подход зависит от копирования diff.exe, поставляемого с vim, в каталог, который для простоты не содержит пробелов в пути (C:\diff.exe).

В результате выполняется следующая команда:

powershell -c C:/diff -a --binary C:/<redacted>/a.tmp C:/<redacted>/b.tmp > C:/<redacted>/c.tmp
person root    schedule 13.06.2019