Как использовать Vim в качестве инструмента сравнения?

102

Я использую vim в качестве основного редактора.

Я также хотел бы использовать vim для сравнения файлов и изменения файлов при выполнении сравнения, чтобы исправить простые изменения (а не большинство методов сравнения, представляющих собой цикл diff / fix / diff / fix).

Кроме того, существуют простые способы интеграции vim в инструменты сравнения, используемые инструментами / сайтами контроля версий (я специально думаю о git, но я уверен, что другие люди будут заинтересованы в интеграции с другими инструментами / сайтами контроля версий).

Мартин Йорк
источник
1
вы должны попробовать vim-fugitive, он добавляет команды, :Gdiffи :Gvdiffобе команды позволяют вам видеть различие текущего буфера, если ваш текущий буфер управляется git. Это также помогает вам разрешать конфликты в макете с тремя окнами, когда у вас есть конфликты слияния в некоторых файлах
rbernabe
У меня есть эта простая функция в моем bashrc, vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }и я вызываю ее с помощью vd file1 file2. Он используется diffдля определения того, отличаются ли файлы, и открывается только в том vimdiffслучае, если это так. Иначе я остаюсь в скорлупе. Я также отключаю подсветку синтаксиса в Vim, потому что нахожу это отвлекающим при разнице. Работает только с двумя файлами.
Рольф

Ответы:

122

В vim встроена эта функциональность (с правильным флагом командной строки).

vim -d <file1> <file2>

Это открывает каждый файл в представлении и выделяет различия.
Любой идентичный код foldedотсутствует, поэтому вам не нужно смотреть на идентичный код или пролистывать огромные куски идентичного кода.

Но есть также приложение-оболочка, vimdiffкоторое корректно вызывает vim с правильными флагами.

vimdiff source1.cpp source2.cpp

Если вы используете git, вы можете настроить внешний инструмент сравнения. Так что легко настроить vimdiff как инструмент diff для git.

git config --global diff.tool vimdiff

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

Примечание: при редактировании из git diff. Если вы попытаетесь отредактировать сохраненную в репозитории версию файла, ваши изменения будут отменены при выходе (git не доверяет вам оригинал, поэтому вы копируете копию tmp), но вы можете отредактировать локальную копию для вашего сердца и сохранить его поверх текущей версии.

Некоторые основные команды, которые полезны в vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

Другие настройки vim, которые я использую для работы с выделением с помощью vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Это отключает подсветку битов кода, которые были изменены. Таким образом, измененная строка подсвечивается, чтобы я мог заметить изменения, но реальный текст, который изменился, выделяется в строке (так как он не выделен).

Мартин Йорк
источник
Также обрабатывает до 4 буферов, что делает его отличным для сравнения конфигурационных файлов
Izkata
34
Вы также можете использовать :diffthisкоманду для запуска diff, когда Vim уже запущен.
Богатый
11
И: diffoff, чтобы выключить его. Я думаю, что ссылка на документацию vim была бы полезной: vimdoc.sourceforge.net/htmldoc/diff.html
опрос Коди
1
Для меня даже после того git config --global diff.tool vimdiff, как git diffвсе показывает, как будто я ничего не меняю.
Привет, Ангел,
2
попробуйgit difftool
Мартин Йорк
13

Если вы редактируете открытый файл и хотите сравнить его с другим файлом, не закрывая текущий:

Откройте новый файл на разделенном экране:

Для вертикального разделения:

:vs otherFile

или горизонтальное разделение:

:split otherFile

Переключить курсоры на другой разделенный экран:

ctrl+w ctrl+w

Вызвать «режим сравнения» в файле:

:diffthis

Переключитесь на другой файл и вызовите «режим сравнения»:

:diffthis

Чтобы отключить «режим сравнения»:

:diffoff
брат-било
источник
5
Для того, чтобы избежать переключений между буферами , которые можно использовать :windo diffthisтоже
statox
4

Вы можете поместить нижеуказанную настройку в .gitconfigфайл, найденный в %homepath%(или %userprofile%) каталоге текущего зарегистрированного пользователя:

[diff]
    tool = vimdiff

Это позволит инструменту git bash начать использовать vimdiff в качестве внешнего инструмента сравнения.

RBT
источник
2

Я вижу только три ситуации, чтобы использовать vim в качестве difftool. Они кратко описаны ниже:

  • Для git difftool добавьте в свой файл следующее ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Чтобы открыть vim как diff-инструмент для двух файлов, вы можете сделать следующее:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Чтобы получить представление diff для буферов, которые в данный момент активны, то есть для всех буферов, которым назначено окно на текущей активной вкладке, вы можете сделать следующее:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

Для получения дополнительной информации см. :h diff

клаус
источник
1

вот что я делаю:

  • откройте окно с первым файлом (или текстовым содержимым, если вы вставляете данные)
  • откройте следующий файл / окно, используя :vnew(чтобы оба окна располагались рядом) или :new(чтобы окна были сверху и снизу). если у вас есть определенный файл, который нужно открыть во втором окне, вы можете указать путь следующим образом::vnew /path/to/secondfile.txt
  • используйте F8 для переключения пользовательской функции, которая включает и выключает режим сравнения

вот пользовательская функция, которая есть в моем ~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction
Каан
источник
Вы можете использовать команду, :diffthisи diffoff!вам не нужно устанавливать все параметры diff самостоятельно (например, для курсора также устанавливается diffmode)
Кристиан Брабандт