Vim сравнить два файла
У Вима есть очень удобный инструмент: vimdiff. Можно вызвать обычный Вим с ключом -d:
vim -d file1 file 2
Это совмещение diff с окнами, подсветкой и фолдингом вима. Есть и отдельная утилита:
vimdiff file1 file2
--- и можно сравнивать файлы в двух окнах вима, различия подсвечены разными цветами (синим текст, которого нет в другом файле, красным --- различия), крупные совпадающие блоки свернуты, чтоб не мешать. Полезные команды:
:diffupdate для обновления;
:diffget для приведения строки (на самом деле, серии различающихся строк подряд) в соответствие с другим окном; если указать диапазон, команда постарается поменять только указанные строки. Например,
.,+1diffget --- поменять лишь текущую строку и следующую. Бывает полезно!
:diffput --- то же самое, но меняется другой файл.
:set diffopt=icase,iwhite для игнора регистра символов и пробелов (хотя иногда они все равно считаются --- когда это важно).
Как игнорировать только регистр или только пробелы --- надеюсь, ясно. Не игнорировать ничего --- set diffopt=
Есть и еще опции: horizontal, чтобы окна были одно над другим, vertical, чтобы как на рисунке (по умолчанию), и еще кое-что.
Вот так это выглядит. Вверх четыре строки в фолде --- идентичны. Красным выделены различия в сходных строках, серым --- совпадающая часть этих строк. Синим --- текст, который есть в одном файле, но отсутствует в другом. Как обычно --- совпадающий текст между различающимися строками.
Вот так это выглядит. Вверх четыре строки в фолде --- идентичны. Красным выделены различия в сходных строках, серым --- совпадающая часть этих строк. Синим --- текст, который есть в одном файле, но отсутствует в другом. Как обычно --- совпадающий текст между различающимися строками.
При этом все команды для работы с окнами, фолдами и подсветкой работают как обычно. Можно открыть другие вкладки --- они никак не связаны. Можно сравнивать и сразу три файла и даже больше, но это не очень удобно.
Команды ]c и [c прыгают вниз/вверх на ближайшее различие.
Если много работаете с версиями программ, статей, глав диссертации или текстовыми данными --- освойте vimdiff! Не пожалеете!
Кроме того, существуют простые способы интеграции vim в инструменты сравнения, используемые инструментами / сайтами контроля версий (я специально думаю о git, но я уверен, что другие люди будут заинтересованы в интеграции с другими инструментами / сайтами контроля версий).
вы должны попробовать vim-fugitive, он добавляет команды, :Gdiff и :Gvdiff обе команды позволяют вам видеть различие текущего буфера, если ваш текущий буфер управляется git. Это также помогает вам разрешать конфликты в макете с тремя окнами, когда у вас есть конфликты слияния в некоторых файлах
У меня есть эта простая функция в моем bashrc, vd () < diff $@ >/dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; > и я вызываю ее с помощью vd file1 file2 . Он используется diff для определения того, отличаются ли файлы, и открывается только в том vimdiff случае, если это так. Иначе я остаюсь в скорлупе. Я также отключаю подсветку синтаксиса в Vim, потому что нахожу это отвлекающим при разнице. Работает только с двумя файлами.
В vim встроена эта функциональность (с правильным флагом командной строки).
Это открывает каждый файл в представлении и выделяет различия.
Любой идентичный код folded отсутствует, поэтому вам не нужно смотреть на идентичный код или пролистывать огромные куски идентичного кода.
Но есть также приложение-оболочка, vimdiff которое корректно вызывает vim с правильными флагами.
Если вы используете git, вы можете настроить внешний инструмент сравнения. Так что легко настроить vimdiff как инструмент diff для git.
При использовании vimdiff вы можете редактировать любую сторону, а подсветка diff будет идти в ногу, чтобы показать вам различия.
Примечание: при редактировании из git diff. Если вы попытаетесь отредактировать сохраненную в репозитории версию файла, ваши изменения будут отменены при выходе (git не доверяет вам оригинал, поэтому вы копируете копию tmp), но вы можете отредактировать локальную копию для вашего сердца и сохранить его поверх текущей версии.
Некоторые основные команды, которые полезны в vimdiff
Другие настройки vim, которые я использую для работы с выделением с помощью vimdiff
Это отключает подсветку битов кода, которые были изменены. Таким образом, измененная строка подсвечивается, чтобы я мог заметить изменения, но реальный текст, который изменился, выделяется в строке (так как он не выделен).
Я знаю, что diff mode Vim ( vimdiff ) позволяет нам сравнивать содержимое двух (или более) файлов.
Но можно сравнить содержимое нескольких файлов в разных каталогах, чтобы рекурсивно объединить два каталога (например, DiffMerge и аналогичные инструменты)?
Существует плагин DirDiff.vim ( GitHub ) для рекурсивного сравнения и слияния двух каталогов.
Он выполняет рекурсивный diff для двух каталогов и генерирует "окно" diff. На основе этого окна вы можете выполнять различные операции сравнения, такие как открытие двух файлов в режиме сравнения Vim, рекурсивное копирование файла или каталога в другой или удаление дерева каталогов из исходного каталога.
Для получения дополнительной информации / помощи: :help dirdiff
Я использую скрипт-обертку python для объединения файлов (см. Ниже). Это упрощенная версия того, что я использую, чтобы объединить мои ~/.vim каталоги и тому подобное.
Это должно работать в Python 2 и 3; но, вероятно, не в очень старых версиях Python, поставляемых с CentOS и некоторыми другими дистрибутивами.
Имейте в виду, что некоторые проверки (например, проверка двоичных файлов или одинаковые файлы) выполняются не очень быстро (считывает весь файл); Вы можете удалить их, если хотите.
Это также не сообщает, присутствует ли только в одном из каталогов .
Я хотел то же самое некоторое время. Лучшее решение, которое я нашел, было использовать vdwrap , который работает на удивление хорошо. Все это делает обертывание git difftool --dir-diff для vimdiff . Не требует никаких плагинов vim.
Все, что вам нужно сделать, это сказать, git difftool чтобы использовать vdwrap :
В следующий раз, когда вы будете использовать git difftool, он откроет Vim с отдельными вкладками Vim для каждой пары файлов.
Предостережение в том, что это Zsh-скрипт. Преобразовать его в скрипт bash должно быть довольно просто, но я не дал этого.
Если вы просто хотите использовать vimdiff, не устанавливая ничего лишнего, следующая команда откроет все различные файлы подряд, что позволит вам увидеть изменения с помощью vimdiff:
Is it possible to view two files side-by-side in Vim? If so, how can I set up my editor to do this, and is there a way to diff between the two files within Vim?
I am aware of the :next and :prev commands, but this is not what I'm after. It would really be nice to view the two files in tandem.
4 Answers 4
Open the side by side view:
Change between them:
You can then open another file for comparison in one side by entering a command such as:
Checkout the vimdiff command, part of the vim package, if you want a diff-like view, e.g.:
This does not answer the question. The question was how to compare two different files in vim. This answer describes how to split the view of a single file vertically. Which shows two views of the same file. This answer also suggests using vimdiff, which DOES provide a solution to comparing two files in a vim-like environment, however again, not what op was asking for. Question was "Is it possible to view two files side-by-side in Vim", not in vimdiff.
You can also open vim in split-screen mode, with the -O option:-
To then turn on diff mode, you need to run the :diffthis command in each pane.
Another use-case scenario, is if you've already got one file open in vim, and you want to open and compare it against another. Then you can use the following vim commands:-
You can then turn off diff mode in each pane with the vim command :diffoff .
EDIT
And the other standard one that hasn't been mentioned:-
This is equivalent to calling vimdiff directly.
Or just open the first file in VIM, then :vert diffsplit file2 :vert makes it split the screen vertically.
diffsplit does a diff, and splits the files and scrolls locks them.
Quick and simple! And works without issues when you already have vim opened. Should be the accepted answer!
While it has already been answered how to start the diff, it's also important how to stop it in all windows. For completeness, I repeat the comment from @Bernhard.
Start and Stop Diff of two files opened in 2 Windows (works in both, vertical and horizontal split):
this can be shortened to either
Be aware that opened windows for showing plugin content lead to issues. So close stuff like NERDtree, minibufexplorer++ etc before.
Custom commands: To ease up things you can add custom commands to your ~/.vimrc :
with [ClosePluginWindow |] being optional to close plugin windows you usually use. For NERDtree e.g. this would be NERDTreeClose | .
I would also like to use vim to diff files and modify the files while doing the diff to fix easy changes (rather than most diff techniques which are a cycle of diff/fix/diff/fix).
Additionally are there easy ways to integrate vim into diff tools used by source control tools/sites (I am specifically thinking of git but I am sure other people would be interested in integration with other source control tools/sites).
you should try vim-fugitive it adds the commands :Gdiff and :Gvdiff both commands lets you see the side by side diff of the current buffer if your current buffer is managed by git. It also heps you to resolve conflicts in a three window layout when you have merge conflicts on some files
I have this simple function in my bashrc vd () < diff $@ >/dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; > and I invoke it with vd file1 file2 . It uses diff to determine whether the files differ and only opens vimdiff if that is so. Otherwise, I stay in the shell. I also disable syntax highlighting in Vim because I find it distracting when diffing. Only works with two files.
11 Answers 11
vim has this functionality built in (with the correct command line flag).
This opens each file in a view and highlights the differences.
Any code that is identical is folded away so you do not need to look at identical code or scroll through huge chunks of identical code.
But there is also a wrapper application vimdiff that correctly invokes vim with the correct flags.
If you are using git you can set up an external diff tool. So it is easy to set up vimdiff to be the diff tool for git.
When using vimdiff you can edit either side and diff highlighting keeps pace to show you the differences.
Note: When editing from a git diff. If you try and edit the repository stored version of the file your changes will be discarded when you exit (git does not trust you with the original so you are diffing against a tmp copy) but you can edit the local copy to your hearts content and save it over you current version.
Some basic commands that are useful in vimdiff
Other vim settings I use to work with highliting with vimdiff
This turns off highlighting on the bits of code that are changed. So the line that is changed is highlighted so I can spot the changes, but the actual text that has changed stands out on the line (as it is not highlighted).
Читайте также: