Могу ли я увидеть изменения до того, как я сохраню свой файл в Vim?

Я использую Vim. Я открываю файл. Я редактирую его, и я хочу посмотреть, что я редактировал, прежде чем я его сохраню.

Как я могу сделать это в Vim?

Ответ 1

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'...

Ответ 2

:w !diff % -

Ответ 3

Потому что некоторые люди спрашивали об объяснении команды

: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)

Ответ 4

Мне всегда нравилось diffchanges - приятно, просто, работает.

Ответ 5

из 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

Ответ 6

Выполните следующие действия и используйте команду: 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()

Ответ 7

Не совсем то, что вы ищете, но SCMDiff.vim действительно круто. Одно нажатие клавиши, и это diff-подчеркивает ваш текущий файл с пересмотром главы в репозитории управления версиями. Он предназначен для работы со многими SCMS. Я использую его с perforce.

Ответ 8

Я могу порекомендовать плагин histwin.

Пока он не отличается от текущей сохраненной версии файла (как и другие ответы), он может изменять vimdiff с тех пор, как вы начали редактировать и даже повторить ваши изменения в порядке. Разница показывает, если вы сохраняете промежуточный.

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

PS: В то время как плагин не автоматически отслеживает моменты в истории редактирования, так как каждое изменение файла, вы можете явно "пометить" момент, когда вы сохраняете файл, чтобы вы могли впоследствии vimdiff с ним, если хотите. Может быть, это может быть автоматизировано?

Ответ 9

Если вы хотите использовать vim для сравнения, например, в vimdiff, вы можете сделать что-то вроде этого:

Измените свой .vimrc и добавьте:

nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>

Оттуда вы увидите свои изменения и можете выйти из представления diff с помощью qall, как в vimdiff, нажав F8 в командном режиме. Замените F8 любой клавишей, которая вам нравится.

Изменить: Добавлено -M, чтобы запретить любую модификацию, потому что она не сохраняется.

Ответ 10

Существует плагин, основанный на разных ответах здесь: https://github.com/gangleri/vim-diffsaved

Он предоставляет метод :w !diff % - и более вовлеченный diffthis один.

Помимо этого undotree позволяет это также, но также и многое другое (различие между различными контрольными точками отмены). Аналогично Gundo.

Ответ 11

Следуйте приведенным выше предложениям. Я использую git diff, который мне очень нравится:

:w !git diff  % -