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


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

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

11 113

11 ответов:

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 view вы можете использовать .

ниже аналогичная функция, адаптированная для имитации ...

:w !diff % -

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

:w !diff % -

вот моя попытка написать более подробный ответ:

Я предполагаю, что вы работаете на системе с cat и echo установлен (например, почти любые GNU/Linux, Mac OS, BSD и другие UNIX-подобные системы).

приведенная выше команда работает следующим образом:

  1. синтаксис для сохранения файла в vim это:

    :w <filename>
    
  2. синтаксис для выполнения команды оболочки в vim:

    :!<command>
    
  3. в среде оболочки, выпущенной vim % указывает на текущее имя файла. Вы можете проверить это, выполнив следующие действия:

    :!echo %
    

    это должно вывести имя файла (или ошибку, если vim был запущен без имени файла).

    используя кота мы можем также вывести наружу содержание файл:

    :!cat %
    

    это должно вернуть содержимое файлов в его последнее сохраненное состояние или ошибку, если оно никогда не было сохранено.

  4. программа diff может читать со стандартного входа (stdin). На его справочной странице указано следующее:

    [...] Если файл имеет значение '-', прочитайте стандартный ввод. [...]

  5. выполнение команды save без имени файла, а скорее команды оболочки за ним приводит к тому, что vim запишите содержимое файлов в stdin оболочки вместо сохранения его в физическом файле. Вы можете проверить это, выполнив

    :w !cat
    

    это всегда должно печатать текущее содержимое файлов (которое было бы записано в файл вместо этого).

Putting it together (или tl;dr): файл "сохраняется" в stdin, diff запускается с именем файла и stdin в качестве входных данных.

зная это можно сравнить файлы с vimdiff делать что-то вроде это - это просто идея, которую вы не хотите делать:

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile

(затем откройте только для чтения и закройте vimdiff с помощью :qall)

Мне всегда нравится diffchanges - хороший, простой, работает.

из vimrc_example.ВИМ:

" 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 command

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.ВИМ это действительно круто. Одно нажатие клавиши, и это diff-выделяет ваш текущий файл с редакцией head в репозитории управления версиями. Он предназначен для работы со многими SCMS. Я использую его волей-неволей.

и histwin плагин.

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

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

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

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

редактировать .vimrc и добавить:

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

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

Edit: добавлено -M, чтобы запретить любые изменения, потому что это не сохранить.

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

обеспечивает :w !diff % - метод и тем более участие diffthis один.

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

следуйте выше предлагает мне использовать git diff, что мне очень нравится:

:w !git diff  % -