Могу ли я увидеть изменения до того, как сохраню свой файл в Vim?
Вопрос
Я использую 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 % -
Потому что некоторые люди спрашивали об объяснении команды
:w !diff % -
Вот моя попытка написать более подробный ответ:
Я предполагаю, что вы работаете над системой с cat
и echo
установленный (например,практически любая GNU/Linux, Mac OS, BSD и другие UNIX-подобные системы).
Приведенная выше команда работает следующим образом:
Синтаксис для сохранения файла в vim следующий:
:w <filename>
Синтаксис для выполнения команды оболочки в vim следующий:
:!<command>
Внутри среды оболочки , выпущенной vim
%
случается, что указывает на текущее имя файла.Вы можете убедиться в этом, выполнив следующее::!echo %
При этом должно быть выведено имя файла (или ошибка, если vim был запущен без имени файла).
Используя cat, мы также можем вывести содержимое файла:
:!cat %
Это должно вернуть содержимое файлов в его последнем сохраненном состоянии или выдать сообщение об ошибке, если оно никогда не было сохранено.
Программа diff способна считывать данные со стандартного ввода (stdin).На его справочной странице указано следующее:
[...] Если ФАЙЛ имеет значение '-', прочитайте стандартный ввод.[...]
Выполнение команды сохранения без имени файла, а скорее команды командной строки, стоящей за ней, приводит к тому, что vim записывает содержимое файлов в stdin командной строки вместо сохранения его в физическом файле.Вы можете убедиться в этом, выполнив
:w !cat
При этом всегда должно выводиться текущее содержимое файлов (которое вместо этого было бы записано в файл).
Собираем это воедино (или tl; dr):Файл "сохраняется" в stdin, diff запускается с именем файла и stdin в качестве входных данных.
Зная это, можно также сравнить файлы с vimdiff, делая что-то подобное - это просто идея, которую вы не хотите делать:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(Затем откройте только для чтения и закройте vimdiff, используя :qall
)
Мне всегда нравилось различия в изменениях - красиво, просто, работает.
из vimrc_example.vim:
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
Исходите из следующего и используйте команду :DIFF
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
Не совсем то, что вы ищете, но SCMDiff.vim это действительно круто.Одно нажатие клавиши, и он выделяет ваш текущий файл с редакцией head в репозитории управления версиями.Он предназначен для работы со многими SCM.Я использую его волей-неволей.
Здесь есть плагин, основанный на разных ответах: https://github.com/gangleri/vim-diffsaved
Это обеспечивает :w !diff % -
метод и тем более вовлеченные diffthis
один.
Помимо этого недеревянный позволяет не только это, но и многое другое (различия между различными контрольными точками отмены).Похожий на Гандо.
Я могу порекомендовать хиствин плагин.
Хотя это не отличается от сохраненный ток версию файла (как и другие ответы), он может vimdiff изменился с тех пор, как вы начали редактировать, и даже повтор ваши изменения по порядку.Разница проявляется, если вы экономите промежуточно.
Кроме того, он отображает список все ветви истории отмены и позволяет вам переключаться или проводить различие между ними.
PS:Хотя плагин не отслеживает автоматически моменты в истории редактирования с момента каждого изменения файла, вы можете явно "пометить" момент сохранения файла, чтобы позже использовать его в vimdiff, если захотите.Может быть, это можно было бы автоматизировать?
Если вы хотите использовать vim для сравнения, как в vimdiff, вы могли бы сделать что-то вроде этого:
Отредактируйте свой файл .vimrc и добавьте:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
С этого момента вы увидите свои изменения и сможете выйти из режима diff view, используя qall
как в vimdiff, нажав клавишу F8 в командном режиме.Замените F8 любой клавишей, которая вам нравится.
Редактировать:Добавлен параметр -M для запрета любых изменений, поскольку это не сохранение.
Следуйте приведенным выше советам, я использую git diff, который мне очень нравится:
:w !git diff % -