GitHub - nvim-mini/mini.diff: Work with diff hunks. Part of 'mini.nvim' library. (original) (raw)

mini.diff

Work with diff hunks

See more details in Features and Documentation.


Note

This was previously hosted at a personal echasnovski GitHub account. It was transferred to a dedicated organization to improve long term project stability. See more details here.

⦿ This is a part of mini.nvim library. Please use this link if you want to mention this module.

⦿ All contributions (issues, pull requests, discussions, etc.) are done inside of 'mini.nvim'.

⦿ See whole library documentation to learn about general design principles, disable/configuration recipes, and more.

⦿ See MiniMax for a full config example that uses this module.


If you want to help this project grow but don't know where to start, check out contributing guides of 'mini.nvim' or leave a Github star for 'mini.nvim' project and/or any its standalone Git repositories.

Demo

demo-diff.mp4

Features

What it doesn't do:

For more information see these parts of help:

Overview

Diffs and hunks

The "diff" (short for "difference") is a result of computing how two text strings differ from one another. This is done on per line basis, i.e. the goal is to compute sequences of lines common to both files, interspersed with groups of differing lines (called "hunks").

Although computing diff is a general concept (used on its own, in Git, etc.), this module computes difference between current text in a buffer and some reference text which is kept up to date specifically for that buffer. For example, default reference text is computed as file content in Git index. This can be customized in config.source.

Life cycle

Notes:

Overlay

Along with basic visualization, there is a special view called "overlay". Although it is meant for temporary overview of diff details and can be manually toggled via MiniDiff.toggle_overlay(), text can be changed with overlay reacting accordingly.

It shows more diff details inside text area:

Mappings

This module provides mappings for common actions with diffs, like:

Examples:

Mappings for some functionality are assumed to be done manually. See :h MiniDiff.operator().

Buffer-local variables

Each enabled buffer has the following buffer-local variables which can be used in custom statusline to show an overview of hunks in current buffer:

Installation

This plugin can be installed as part of 'mini.nvim' library (recommended) or as a standalone Git repository.

There are two branches to install from:

Here are code snippets for some common installation methods (use only one):

(Recommended) With vim.pack (on Neovim 0.12 and newer)

Full library

Follow 'mini.nvim' installation.

Standalone plugin

Main branch:

vim.pack.add({ 'https://github.com/nvim-mini/mini.diff' })

Stable branch:

vim.pack.add({ { src = 'https://github.com/nvim-mini/mini.diff', version = 'stable' }, })

With mini.deps (before Neovim 0.12)

Full library

Follow recommended 'mini.deps' installation.

Standalone plugin:

Main branch:

add('nvim-mini/mini.diff')

Stable branch:

add({ source = 'nvim-mini/mini.diff', checkout = 'stable' })

With folke/lazy.nvim

Full library

Follow 'mini.nvim' installation.

Standalone plugin

Main branch:

{ 'nvim-mini/mini.diff', version = false },

Stable branch:

{ 'nvim-mini/mini.diff', version = '*' },

Important: don't forget to call require('mini.diff').setup() to enable its functionality.

Note: if you are on Windows, there might be problems with too long file paths (like error: unable to create file <some file name>: Filename too long). Try doing one of the following:

Default config

-- No need to copy this inside setup(). Will be used automatically. { -- Options for how hunks are visualized view = { -- Visualization style. Possible values are 'sign' and 'number'. -- Default: 'number' if line numbers are enabled, 'sign' otherwise. style = vim.go.number and 'number' or 'sign',

-- Signs used for hunks with 'sign' view
signs = { add = '▒', change = '▒', delete = '▒' },

-- Priority of used visualization extmarks
priority = 199,

},

-- Source(s) for how reference text is computed/updated/etc -- Uses content from Git index by default source = nil,

-- Delays (in ms) defining asynchronous processes delay = { -- How much to wait before update following every text change text_change = 200, },

-- Module mappings. Use '' (empty string) to disable one. mappings = { -- Apply hunks inside a visual/operator region apply = 'gh',

-- Reset hunks inside a visual/operator region
reset = 'gH',

-- Hunk range textobject to be used inside operator
-- Works also in Visual mode if mapping differs from apply and reset
textobject = 'gh',

-- Go to hunk range in corresponding direction
goto_first = '[H',
goto_prev = '[h',
goto_next = ']h',
goto_last = ']H',

},

-- Various options options = { -- Diff algorithm (see :h vim.text.diff()) algorithm = 'histogram',

-- Whether to use "indent heuristic" (see `:h vim.text.diff()`)
indent_heuristic = true,

-- The amount of second-stage diff to align lines
linematch = 60,

-- Whether to wrap around edges during hunk navigation
wrap_goto = false,

}, }

Similar plugins