Могу ли я увидеть изменения перед сохранением файла в Vim?
Я использую Vim. Я открываю файл. Я редактирую его, и я хочу увидеть, что я редактировал, прежде чем сохранить его.
Как я могу сделать это в Vim?
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 % -
вот моя попытка написать более подробный ответ:
Я предполагаю, что вы работаете на системе с
cat
иecho
установлен (например, почти любые GNU/Linux, Mac OS, BSD и другие UNIX-подобные системы).приведенная выше команда работает следующим образом:
синтаксис для сохранения файла в vim это:
:w <filename>
синтаксис для выполнения команды оболочки в vim:
:!<command>
в среде оболочки, выпущенной vim
%
указывает на текущее имя файла. Вы можете проверить это, выполнив следующие действия::!echo %
это должно вывести имя файла (или ошибку, если vim был запущен без имени файла).
используя кота мы можем также вывести наружу содержание файл:
:!cat %
это должно вернуть содержимое файлов в его последнее сохраненное состояние или ошибку, если оно никогда не было сохранено.
программа diff может читать со стандартного входа (stdin). На его справочной странице указано следующее:
[...] Если файл имеет значение '-', прочитайте стандартный ввод. [...]
выполнение команды 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 позволяет это также, но и гораздо больше (различия между различными контрольными точками отмены). Похоже на Гундо.