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

StackOverflow https://stackoverflow.com/questions/749297

  •  09-09-2019
  •  | 
  •  

Вопрос

Я использую 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-подобные системы).

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

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

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

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

    :!echo %
    

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

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

    :!cat %
    

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

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

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

  5. Выполнение команды сохранения без имени файла, а скорее команды командной строки, стоящей за ней, приводит к тому, что 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  % -
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top