gap
- title
- gap
- type
- toolbox
- summary
- Нативный GUI-инструмент для side-by-side сравнения, полигон для Myers diff с линейной памятью
- tags
- cpp, diff, gui, text-editor, watchlist
- language
- C++
- license
- MIT
- created
- 2026-07-18
- updated
- 2026-07-18
- lang
- ru
- translation_of
- gap
- source_updated
- 2026-07-18
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Небольшая нативная GUI-утилита для сравнения текста. Ей можно передать два файла (или два каталога), и она отобразит различия так же, как интерфейс pull request'ов на GitHub или Azure DevOps - графическое цветное сравнение side-by-side, а не терминальный пейджер поверх unified-diff текста. Написана Кэмероном ДаКамарой (Cameron DaCamara, cdacamar), инженером компилятора MSVC, во время джема Handmade Essentials 2026.
У проекта две заявленные цели. Очевидная - простой самодостаточный просмотрщик diff'ов без сторонних зависимостей, требующий только компилятор C++. Настоящая мотивация кроется во второй: gap служит proof-of-concept для варианта алгоритма Myers diff с линейной сложностью по памяти, который автор планирует встроить в свой редактор fred. Поэтому gap - не столько законченный инструмент, сколько полигон для движка сравнения, предназначенного для другого проекта.
Что здесь даёт Myers diff с линейной памятью
Алгоритм Майерса находит кратчайший сценарий редактирования (shortest edit script) между двумя последовательностями - минимальный набор вставок и удалений, превращающий один файл в другой. Это стандартная задача построения diff'а (наибольшая общая подпоследовательность), и она отличается от поиска по расстоянию редактирования / нечёткого сопоставления в levenshtein-trie, где ищутся словарные слова в пределах N правок. В gap используется оптимизация алгоритма Майерса с линейной памятью: расход памяти остаётся пропорционален размеру входных данных, а не произведению длин двух файлов, что важно при сравнении больших файлов внутри интерактивного редактора.
Поверх построчного сравнения gap умеет вычислять внутренние diff'ы внутри похожих блоков, подсвечивая изменённые участки по словам или посимвольно.
Возможности
- Внутриблочные diff'ы по словам и по символам внутри изменившихся фрагментов.
- Смена сторон сравнения местами по одному нажатию клавиши.
- Сворачивание и разворачивание контекста вокруг изменений; отрицательное значение включает бесконечный контекст (весь файл целиком).
- Сравнение каталогов - файлы из одной директории сопоставляются с файлами из другой.
- Проводник конфигурации (общий с fred) для настройки номеров строк, цветов и отключения анимаций.
- Панель справки с переназначением горячих клавиш.
- Субпиксельный рендеринг шрифтов, включённый по умолчанию.
- На Windows - выбор между рендерерами DX11 (по умолчанию) и OpenGL.
Использование
$ gap a.txt b.txt # file diff
$ gap ./A ./B # directory diff
Или запустить приложение и перетащить мышью файлы или папки на панели. Также утилита подключается к git в качестве difftool:
$ git config difftool.gap.path "D:/git_projects/gap/build/gap.exe"
$ git config difftool.gap.cmd "D:/git_projects/gap/build/gap.exe \"\"\"$LOCAL\"\"\" \"\"\"$REMOTE\"\"\"\""
$ git config diff.tool gap
После этого git difftool будет открывать gap вместо инструмента по умолчанию, а git difftool -d запустит режим сравнения каталогов. Это та же точка интеграции, к которой со стороны терминала подключается delta: delta - это пейджер с подсветкой синтаксиса для вывода git diff, тогда как gap - отдельный оконный просмотрщик, регистрируемый как difftool.
Сборка
На Windows внешних зависимостей нет: достаточно открыть x64 Developer Command Prompt из VS2022 (или новее) и запустить build (или build release). На Linux потребуется свежий gcc (автор использовал 13.3.0) и dev-заголовки OpenGL, X11, Xext и Xrandr, после чего запустить ./build.sh.
Ограничения
- Только Windows и Linux - без macOS.
- Созданный на джеме proof-of-concept от одного автора; суть проекта - движок diff'а, а интерфейс служит лишь демонстрационной оболочкой.
- Не инструмент слияния (merge tool), не среда для ревью и не редактор - только просмотрщик для двух версий.
Проект находится в watchlist - экспериментальная разработка одного автора, чьё реальное будущее видится скорее в качестве компонента fred, а не отдельного продукта.
Репозиторий
github.com/cdacamar/gap - C++, MIT, 60 звёзд.