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

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

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

Ответы [ 11 ]

142 голосов
/ 15 апреля 2009
:w !diff % -
85 голосов
/ 12 марта 2014

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

:w !diff % -

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

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

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

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

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

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

    :!echo %
    

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

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

    :!cat %
    

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

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

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

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

    :w !cat
    

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

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

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

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

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

51 голосов
/ 15 апреля 2009

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

10 голосов
/ 15 апреля 2009

Мне всегда нравятся различия - красиво, просто, работает.

9 голосов
/ 06 сентября 2009

из 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
2 голосов
/ 19 января 2010

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

2 голосов
/ 15 апреля 2009

Введите следующее и используйте: 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()
1 голос
/ 18 декабря 2014

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

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

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

1 голос
/ 12 марта 2014

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

Отредактируйте ваш .vimrc и добавьте:

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

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

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

1 голос
/ 23 сентября 2010

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

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

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

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

...