Я использую Vim. Я открываю файл. Я редактирую его и хочу посмотреть, что я отредактировал, прежде чем сохранить его.
Как я могу сделать это в Vim?
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Вот функция и команда, чтобы увидеть разницу между текущим отредактированным файлом и его неизмененной версией в файловой системе. Просто поместите это в ваш vimrc или в каталог плагинов, откройте файл, внесите некоторые изменения, не сохраняя их, и сделайте
:DiffSaved
.function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
Чтобы выйти из режима просмотра различий, вы можете использовать
:diffoff
команду.Ниже приведена аналогичная функция, адаптированная для имитации
'cvs diff'
команды ...
:w !diff % -
превосходной, когда вы используете vim для постоянно меняющегося и большого количества ящиков, для которых вы не можете легко изменить .vimrc? (При условии, что у них установлен diff.)источник
diff
.%
ссылается на текущий открытый путь к файлу. Почему все это аргумент:w
команды? Кроме того, как-
присваивается содержимое рабочего буфера? Является ли это автоматическим в vim, что содержимое буфера (или, возможно, определенный диапазон в буфере) назначается stdin для команд оболочки?:w
потому что мы записываем файл в команду (onstdin
). В команде,-
говорит это читатьstdin
.:w !git diff % -
для раскрашенной версии, если у вас установлен git!fatal: bad flag '-' used after filename
при запуске:w !git diff % -
.Потому что некоторые люди спрашивали об объяснении команды
Вот моя попытка написать более подробный ответ:
Я предполагаю , что вы работаете в системе с
cat
иecho
установлен (например , практически любой GNU / Linux, Mac OS, BSD и других UNIX-подобных систем).Вышеприведенная команда работает следующим образом:
Синтаксис для сохранения файла в vim:
Синтаксис для выполнения команды оболочки в vim:
Внутри оболочки, выдаваемой vim
%
, указывается на текущее имя файла. Вы можете убедиться в этом, выполнив следующее:Это должно вывести имя файла (или ошибку, если vim был запущен без имени файла).
Используя cat, мы также можем вывести содержимое файла:
Это должно вернуть содержимое файла в его последнее сохраненное состояние или сообщение об ошибке, если оно никогда не было сохранено.
Программа diff умеет читать со стандартного ввода (stdin). На его странице руководства говорится следующее:
Выполнение команды save без имени файла, а скорее команды оболочки позади него, приводит к тому, что vim записывает содержимое файла на стандартный ввод оболочки вместо сохранения его в физическом файле. Вы можете проверить это, выполнив
Это должно всегда печатать файлы текущего содержимого (которые были бы записаны в файл вместо этого).
Собираем его вместе (или tl; dr): файл "сохраняется" в stdin, diff запускается с именем файла и stdin в качестве ввода.
Зная это, можно также сравнить файлы с vimdiff, выполняющим что-то вроде этого - это просто идея, которую вы не хотите делать следующим образом:
(Затем откройте readonly и закройте vimdiff, используя
:qall
)источник
vim - -c ":vnew $1 |windo diffthis"
, сделать его исполняемым, сохранить его в PATH, например,vimdiffWithStdin
и затем сравнить со следующей командой в vim::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Я не знаю, существует ли подобная уловка для окон.Мне всегда нравятся различия - красиво, просто, работает.
источник
:DiffChangesDiffToggle
.из vimrc_example.vim:
источник
w !diff % -
том , что она работает над удаленными источниками тоже (например:vim sftp://example.com/foo.txt
)Исходя из следующего и используйте: DIFF команда
источник
Не совсем то, что вы ищете, но SCMDiff.vim действительно классный. Одно нажатие клавиши, и она выделяет ваш текущий файл с ревизией головы в репозитории с исходным кодом. Он предназначен для работы со многими SCMS. Я использую это с исполнением.
источник
Здесь есть плагин, основанный на разных ответах: https://github.com/gangleri/vim-diffsaved
Это обеспечивает
:w !diff % -
метод и более вовлеченныйdiffthis
.Кроме того, это не разрешено и для недопустимого дерева , но также и для гораздо большего (различия между различными контрольными точками отмены). Похоже на Gundo .
источник
Я могу порекомендовать плагин Histwin .
Хотя он не отличается от текущей сохраненной версии файла (как и другие ответы), он может изменять изменения с момента начала редактирования и даже воспроизводить изменения по порядку. Разница показывает, сохраняете ли вы промежуточно.
Кроме того, он отображает список всех ветвей истории отмены и позволяет вам переключаться между ними.
PS: хотя плагин не отслеживает автоматически моменты в истории редактирования с момента каждого изменения файла, вы можете явно «пометить» момент, когда вы сохраните файл, чтобы позже вы могли с ним vimdiff, если хотите. Может быть, это может быть автоматизировано?
источник
Если вы хотите использовать vim для сравнения, как в vimdiff, вы можете сделать что-то вроде этого:
Отредактируйте ваш .vimrc и добавьте:
Оттуда вы увидите ваши изменения и можете выйти из
qall
режима сравнения, используя, как в vimdiff, нажав F8 в командном режиме. Замените F8 на любую понравившуюся клавишу.Редактировать: Добавлена опция -M, чтобы запретить любые изменения, потому что они не сохраняются.
источник
Vim: Error reading input, exiting...
какие-либо идеи, что здесь происходит не так?git поддерживает следующую команду
:w !git diff --no-index -- % -
сопоставьте его с командой, добавив следующее в ваш ~ / .vimrc
command GitDiff execute "w !git diff --no-index -- % -"
Теперь выполнение
:GitDiff
становится удобной маленькой командой для быстрого отображения различий перед каждым сохранением.источник
Вы можете сделать Vim создать последнюю резервную копию и оригинальную резервную копию с:
После этого вы можете открыть их в сплит:
И оттуда сделать:
Если вы не имеете никаких остатков, но хотите vimdiff, вы также можете сделать:
а затем сделайте: diffthis на каждом разделении
источник
Изменения, которые вы только что отредактировали [ буфер ], то есть те, которые отличаются от последней сохраненной версии (в рабочем каталоге), могут отличаться от последней версии индекса ( Git ). Я сопоставил оба:
Пример vimdiff против Gdiff.
Кроме того, чтобы легко
vimdiff
найти файл омонима по другому пути:источник
Gdiff
если возможно, и иначе (например, не проект Git), затем выполните a:vimdiff
. Сtry-catch-endtry
. Но этот путь:DiffWithSaved
в Git-проекте отсутствует.Следуйте вышесказанному, я предлагаю использовать git diff, который мне очень нравится:
источник