Vimdiff и Git все сразу


5

Я использую vimdiff в качестве моего difftool с git.

Допустим, я изменил двенадцать файлов. Проблема в том, что иногда я запускаю git diffи вокруг четвертого или пятого файла я вижу что-то, что я хочу отредактировать / изменить. Иногда мне нужно сделать еще несколько изменений вне этого. Проблема в том, что я не могу просто :qaвернуться к взлому, потому что в vimdiff появилось еще шесть или семь различий. Это становится действительно утомительным для :qaвсех этих файлов, не смотря каждый раз, когда я хочу прервать git diff.

Есть ли способ установить vimdiff как difftool для git, чтобы все diff-файлы открывались в одном и том же экземпляре vim, например, в отдельных вкладках?


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

Я согласен. Единственный реальный вариант использования, который я видел для вкладок, - это когда я хочу открыть похожую группу буферов в другой конфигурации окон; то есть одна вкладка имеет заголовок и исходный файл в разделении, в то время как другая вкладка имеет исходный файл и make-файл в вертикальном разделении. Или что-то. И иногда приятно иметь «стек окон», то есть вы редактируете четыре файла в некоторых разделениях и хотите быстро отредактировать свой vimrc, :tabe ~/.vimrcпосле чего :bdследует хорошая комбинация.
So8res

Сделал это для меня stackoverflow.com/q/2428051/168034
phunehehe

Ответы:


4

Вы можете использовать плагины vim, опубликованные здесь . Тогда вам просто нужно установить difftool:

[multidiff]
  tool = vd -f

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

Смотрите скриншот здесь для примера.

В дополнение к полезному комментарию Маркоса, в качестве третьего (альтернатива вручную), если вы хотите использовать, vimdiffя бы порекомендовал следующую meldстратегию в сценарии (возможно python):

  • использовать git diff-files --name-statusи git diff-index --name-status --cached HEADдля идентификации файлов, которые необходимо изучить.
  • Получить кэшированные версии этих файлов и поместить в /tmp/
  • Откройте все эти файлы - измененные файлы и их кэшированные версии - сразу, vimdiffхотя, скорее всего, это невозможно в том смысле, в котором вы нуждаетесь - см. Ниже.

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


Это было бы лучше использовать в качестве комментария, поскольку он не отвечает на вопрос вообще.
Марко

Спасибо за ваше предложение @Marco - надеюсь, мои изменения улучшили мой ответ.
Jmetz

1
Они сделали определенно. Это не то, что я бы назвал элегантным, но, похоже, работает. Я дам ему две недели тестирования, если это практическое решение. Спасибо за то, что поделились этим «вторжением» vim, в то время как diffing всегда беспокоил меня.
Марко

4

Очень простой способ - добавить эту опцию в ваш файл ~ / .gitconfig.

[difftool]
    tool = vimdiff $LOCAL $REMOTE
    prompt = true

Таким образом, перед каждым сравнением файлов вам будет предложено пропустить файл, ответив «нет», или прервать сравнение файлов с помощью Ctrl + C.

Пример:

$ git difftool
Viewing: 'file1.js'
Launch 'vimdiff' [Y/n]: y
2 files to edit

Viewing: 'file2.js'
Launch 'vimdiff' [Y/n]: n

2

Это то, что я использую. Требуется, чтобы вы использовали vim-fugitive

[alias] dt = "!f() { vim -p $(git diff --name-only) +\"tabdo Gdiff $@\" +tabfirst; }; f"

git dtзатем откроет каждую пару различий в отдельной вкладке. Затем :tabcloseзакрыть одну пару или :qaвыйти.

источник


Будет ли это работать с несколькими ссылками вместо сравнения с рабочими файлами?
Spidey

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

Хотя это действительно понравилось. Очень умное решение. Congrats.
Spidey
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.