vimdiff E97 в Powershell - PullRequest
       49

vimdiff E97 в Powershell

4 голосов
/ 05 июня 2019

У меня проблемы с получением 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 в каталог, к которому, я уверен, у меня есть полные разрешения. Чтобы помочь с устранением неполадок, я временно сохранил два файла, которые хочу сравнить, и указал их полные пути в явном виде вместо использования vim v:fname_in и v:fname_newv:fname_out).

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".
  • Вы используете 'difxpr', и он не работает. Если не ясно, в чем проблема, установите параметр «verbose» на один или несколько, чтобы увидеть больше сообщений.

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

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

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

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

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

cmd

powershell

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

1 Ответ

1 голос
/ 13 июня 2019

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

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

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

Также изменение функции MyDiff() по умолчанию в if, которая задает путь к разнице в переменной 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
...