Я использую Vim. Я открываю файл. Я редактирую его, и я хочу посмотреть, что я редактировал, прежде чем я его сохраню.
Как я могу сделать это в 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()
Чтобы выйти из представления diff, вы можете использовать команду
: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). На странице руководства пользователя указано следующее:
[...] Если FILE - '-', прочитайте стандартный ввод. [...]
Выполнение команды сохранения без имени файла, а скорее команды оболочки за ней, заставляет vim записывать содержимое файлов в stdin оболочки вместо сохранения в физическом файле. Вы можете проверить это, выполнив
:w !cat
Это всегда должно печатать текущее содержимое файлов (которое было бы записано в файл вместо этого).
Объединение (или tl; dr): файл "сохраняется" на stdin, diff запускается с именем файла и stdin в качестве входных данных.
Зная это, можно также сравнить файлы с vimdiff, делая что-то вроде этого - это просто идея, которую вы не хотите делать:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(Затем откройте readonly и закройте vimdiff, используя :qall
)
Мне всегда нравилось diffchanges - приятно, просто, работает.
из 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 действительно круто. Одно нажатие клавиши, и это diff-подчеркивает ваш текущий файл с пересмотром главы в репозитории управления версиями. Он предназначен для работы со многими SCMS. Я использую его с perforce.
Я могу порекомендовать плагин histwin.
Пока он не отличается от текущей сохраненной версии файла (как и другие ответы), он может изменять vimdiff с тех пор, как вы начали редактировать и даже повторить ваши изменения в порядке. Разница показывает, если вы сохраняете промежуточный.
Кроме того, он отображает список всех ветвей истории отмены и позволяет вам переключаться или различаться между ними.
PS: В то время как плагин не автоматически отслеживает моменты в истории редактирования, так как каждое изменение файла, вы можете явно "пометить" момент, когда вы сохраняете файл, чтобы вы могли впоследствии vimdiff с ним, если хотите. Может быть, это может быть автоматизировано?
Если вы хотите использовать vim для сравнения, например, в vimdiff, вы можете сделать что-то вроде этого:
Измените свой .vimrc и добавьте:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
Оттуда вы увидите свои изменения и можете выйти из представления diff с помощью qall
, как в vimdiff, нажав F8 в командном режиме. Замените F8 любой клавишей, которая вам нравится.
Изменить: Добавлено -M, чтобы запретить любую модификацию, потому что она не сохраняется.
Существует плагин, основанный на разных ответах здесь: https://github.com/gangleri/vim-diffsaved
Он предоставляет метод :w !diff % -
и более вовлеченный diffthis
один.
Помимо этого undotree позволяет это также, но также и многое другое (различие между различными контрольными точками отмены). Аналогично Gundo.
Следуйте приведенным выше предложениям. Я использую git diff, который мне очень нравится:
:w !git diff % -