Потому что некоторые люди спрашивали об объяснении команды
:w !diff % -
Вот моя попытка написать более подробный ответ:
Я предполагаю, что вы работаете в системе с установленными cat
и echo
(например, почти с любыми GNU / Linux, Mac OS, BSD и другими UNIX-подобными системами).
Вышеприведенная команда работает следующим образом:
Синтаксис для сохранения файла в vim:
:w <filename>
Синтаксис для выполнения команды оболочки в vim:
:!<command>
Внутри оболочки, выданной vim, %
указывает на текущее имя файла. Вы можете проверить это, выполнив следующее:
:!echo %
Это должно вывести имя файла (или ошибку, если vim был запущен без имени файла).
Используя cat, мы также можем вывести содержимое файла:
:!cat %
Это должно вернуть содержимое файла в его последнем сохраненном состоянии или сообщение об ошибке, если оно никогда не было сохранено.
Программа diff может читать со стандартного ввода (стандартный ввод). На его странице руководства указано следующее:
[...] Если FILE равен '-', прочитайте стандартный ввод. [...]
Выполнение команды сохранения без имени файла, а скорее команды оболочки позади него, приводит к тому, что vim записывает содержимое файла в стандартный поток оболочки вместо сохранения его в физическом файле. Вы можете проверить это, выполнив
:w !cat
Это всегда должно печатать текущее содержимое файла (которое было бы записано в файл вместо этого).
Собираем его вместе (или tl; dr): файл "сохраняется" в stdin, diff запускается с именем файла и stdin в качестве ввода.
Зная это, можно также сравнить файлы с vimdiff, выполняющим что-то вроде этого - это просто идея, которую вы не хотите делать:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(затем откройте только для чтения и закройте vimdiff, используя :qall
)