mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	refactor(lua): rename vim.diff => vim.text.diff #34864
Problem: `vim.diff()` was introduced before we had the `vim.text` module, where it obviously belongs. Solution: Move it.
This commit is contained in:
		@@ -38,7 +38,7 @@ LSP
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
LUA
 | 
					LUA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
• todo
 | 
					• *vim.diff()*				Renamed to |vim.text.diff()|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VIMSCRIPT
 | 
					VIMSCRIPT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -581,7 +581,7 @@ A subset of the `vim.*` stdlib is available in threads, including:
 | 
				
			|||||||
- `vim.mpack` and `vim.json` (useful for serializing messages between threads)
 | 
					- `vim.mpack` and `vim.json` (useful for serializing messages between threads)
 | 
				
			||||||
- `require` in threads can use Lua packages from the global |package.path|
 | 
					- `require` in threads can use Lua packages from the global |package.path|
 | 
				
			||||||
- `print()` and `vim.inspect`
 | 
					- `print()` and `vim.inspect`
 | 
				
			||||||
- `vim.diff`
 | 
					- `vim.text.diff`
 | 
				
			||||||
- Most utility functions in `vim.*` that work with pure Lua values, like
 | 
					- Most utility functions in `vim.*` that work with pure Lua values, like
 | 
				
			||||||
  `vim.split`, `vim.tbl_*`, `vim.list_*`, etc.
 | 
					  `vim.split`, `vim.tbl_*`, `vim.list_*`, etc.
 | 
				
			||||||
- `vim.is_thread()` returns true from a non-main thread.
 | 
					- `vim.is_thread()` returns true from a non-main thread.
 | 
				
			||||||
@@ -647,74 +647,6 @@ vim.hl.range({bufnr}, {ns}, {higroup}, {start}, {finish}, {opts})
 | 
				
			|||||||
        manually. nil is returned if timeout is not specified
 | 
					        manually. nil is returned if timeout is not specified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
==============================================================================
 | 
					 | 
				
			||||||
VIM.DIFF                                                            *vim.diff*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
vim.diff({a}, {b}, {opts})                                        *vim.diff()*
 | 
					 | 
				
			||||||
    Run diff on strings {a} and {b}. Any indices returned by this function,
 | 
					 | 
				
			||||||
    either directly or via callback arguments, are 1-based.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Examples: >lua
 | 
					 | 
				
			||||||
        vim.diff('a\n', 'b\nc\n')
 | 
					 | 
				
			||||||
        -- =>
 | 
					 | 
				
			||||||
        -- @@ -1 +1,2 @@
 | 
					 | 
				
			||||||
        -- -a
 | 
					 | 
				
			||||||
        -- +b
 | 
					 | 
				
			||||||
        -- +c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        vim.diff('a\n', 'b\nc\n', {result_type = 'indices'})
 | 
					 | 
				
			||||||
        -- =>
 | 
					 | 
				
			||||||
        -- {
 | 
					 | 
				
			||||||
        --   {1, 1, 1, 2}
 | 
					 | 
				
			||||||
        -- }
 | 
					 | 
				
			||||||
<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Parameters: ~
 | 
					 | 
				
			||||||
      • {a}     (`string`) First string to compare
 | 
					 | 
				
			||||||
      • {b}     (`string`) Second string to compare
 | 
					 | 
				
			||||||
      • {opts}  (`table?`) Optional parameters:
 | 
					 | 
				
			||||||
                • {on_hunk}?
 | 
					 | 
				
			||||||
                  (`fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?`)
 | 
					 | 
				
			||||||
                  Invoked for each hunk in the diff. Return a negative number
 | 
					 | 
				
			||||||
                  to cancel the callback for any remaining hunks. Arguments:
 | 
					 | 
				
			||||||
                  • `start_a` (`integer`): Start line of hunk in {a}.
 | 
					 | 
				
			||||||
                  • `count_a` (`integer`): Hunk size in {a}.
 | 
					 | 
				
			||||||
                  • `start_b` (`integer`): Start line of hunk in {b}.
 | 
					 | 
				
			||||||
                  • `count_b` (`integer`): Hunk size in {b}.
 | 
					 | 
				
			||||||
                • {result_type}? (`'unified'|'indices'`, default: `'unified'`)
 | 
					 | 
				
			||||||
                  Form of the returned diff:
 | 
					 | 
				
			||||||
                  • `unified`: String in unified format.
 | 
					 | 
				
			||||||
                  • `indices`: Array of hunk locations. Note: This option is
 | 
					 | 
				
			||||||
                    ignored if `on_hunk` is used.
 | 
					 | 
				
			||||||
                • {linematch}? (`boolean|integer`) Run linematch on the
 | 
					 | 
				
			||||||
                  resulting hunks from xdiff. When integer, only hunks upto
 | 
					 | 
				
			||||||
                  this size in lines are run through linematch. Requires
 | 
					 | 
				
			||||||
                  `result_type = indices`, ignored otherwise.
 | 
					 | 
				
			||||||
                • {algorithm}? (`'myers'|'minimal'|'patience'|'histogram'`,
 | 
					 | 
				
			||||||
                  default: `'myers'`) Diff algorithm to use. Values:
 | 
					 | 
				
			||||||
                  • `myers`: the default algorithm
 | 
					 | 
				
			||||||
                  • `minimal`: spend extra time to generate the smallest
 | 
					 | 
				
			||||||
                    possible diff
 | 
					 | 
				
			||||||
                  • `patience`: patience diff algorithm
 | 
					 | 
				
			||||||
                  • `histogram`: histogram diff algorithm
 | 
					 | 
				
			||||||
                • {ctxlen}? (`integer`) Context length
 | 
					 | 
				
			||||||
                • {interhunkctxlen}? (`integer`) Inter hunk context length
 | 
					 | 
				
			||||||
                • {ignore_whitespace}? (`boolean`) Ignore whitespace
 | 
					 | 
				
			||||||
                • {ignore_whitespace_change}? (`boolean`) Ignore whitespace
 | 
					 | 
				
			||||||
                  change
 | 
					 | 
				
			||||||
                • {ignore_whitespace_change_at_eol}? (`boolean`) Ignore
 | 
					 | 
				
			||||||
                  whitespace change at end-of-line.
 | 
					 | 
				
			||||||
                • {ignore_cr_at_eol}? (`boolean`) Ignore carriage return at
 | 
					 | 
				
			||||||
                  end-of-line
 | 
					 | 
				
			||||||
                • {ignore_blank_lines}? (`boolean`) Ignore blank lines
 | 
					 | 
				
			||||||
                • {indent_heuristic}? (`boolean`) Use the indent heuristic for
 | 
					 | 
				
			||||||
                  the internal diff library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Return: ~
 | 
					 | 
				
			||||||
        (`string|integer[][]?`) See {opts.result_type}. `nil` if
 | 
					 | 
				
			||||||
        {opts.on_hunk} is given.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
==============================================================================
 | 
					==============================================================================
 | 
				
			||||||
VIM.MPACK                                                          *vim.mpack*
 | 
					VIM.MPACK                                                          *vim.mpack*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4959,6 +4891,70 @@ vim.snippet.stop()                                        *vim.snippet.stop()*
 | 
				
			|||||||
==============================================================================
 | 
					==============================================================================
 | 
				
			||||||
Lua module: vim.text                                                *vim.text*
 | 
					Lua module: vim.text                                                *vim.text*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vim.text.diff({a}, {b}, {opts})                              *vim.text.diff()*
 | 
				
			||||||
 | 
					    Run diff on strings {a} and {b}. Any indices returned by this function,
 | 
				
			||||||
 | 
					    either directly or via callback arguments, are 1-based.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Examples: >lua
 | 
				
			||||||
 | 
					        vim.text.diff('a\n', 'b\nc\n')
 | 
				
			||||||
 | 
					        -- =>
 | 
				
			||||||
 | 
					        -- @@ -1 +1,2 @@
 | 
				
			||||||
 | 
					        -- -a
 | 
				
			||||||
 | 
					        -- +b
 | 
				
			||||||
 | 
					        -- +c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vim.text.diff('a\n', 'b\nc\n', {result_type = 'indices'})
 | 
				
			||||||
 | 
					        -- =>
 | 
				
			||||||
 | 
					        -- {
 | 
				
			||||||
 | 
					        --   {1, 1, 1, 2}
 | 
				
			||||||
 | 
					        -- }
 | 
				
			||||||
 | 
					<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Parameters: ~
 | 
				
			||||||
 | 
					      • {a}     (`string`) First string to compare
 | 
				
			||||||
 | 
					      • {b}     (`string`) Second string to compare
 | 
				
			||||||
 | 
					      • {opts}  (`table?`) Optional parameters:
 | 
				
			||||||
 | 
					                • {on_hunk}?
 | 
				
			||||||
 | 
					                  (`fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?`)
 | 
				
			||||||
 | 
					                  Invoked for each hunk in the diff. Return a negative number
 | 
				
			||||||
 | 
					                  to cancel the callback for any remaining hunks. Arguments:
 | 
				
			||||||
 | 
					                  • `start_a` (`integer`): Start line of hunk in {a}.
 | 
				
			||||||
 | 
					                  • `count_a` (`integer`): Hunk size in {a}.
 | 
				
			||||||
 | 
					                  • `start_b` (`integer`): Start line of hunk in {b}.
 | 
				
			||||||
 | 
					                  • `count_b` (`integer`): Hunk size in {b}.
 | 
				
			||||||
 | 
					                • {result_type}? (`'unified'|'indices'`, default: `'unified'`)
 | 
				
			||||||
 | 
					                  Form of the returned diff:
 | 
				
			||||||
 | 
					                  • `unified`: String in unified format.
 | 
				
			||||||
 | 
					                  • `indices`: Array of hunk locations. Note: This option is
 | 
				
			||||||
 | 
					                    ignored if `on_hunk` is used.
 | 
				
			||||||
 | 
					                • {linematch}? (`boolean|integer`) Run linematch on the
 | 
				
			||||||
 | 
					                  resulting hunks from xdiff. When integer, only hunks upto
 | 
				
			||||||
 | 
					                  this size in lines are run through linematch. Requires
 | 
				
			||||||
 | 
					                  `result_type = indices`, ignored otherwise.
 | 
				
			||||||
 | 
					                • {algorithm}? (`'myers'|'minimal'|'patience'|'histogram'`,
 | 
				
			||||||
 | 
					                  default: `'myers'`) Diff algorithm to use. Values:
 | 
				
			||||||
 | 
					                  • `myers`: the default algorithm
 | 
				
			||||||
 | 
					                  • `minimal`: spend extra time to generate the smallest
 | 
				
			||||||
 | 
					                    possible diff
 | 
				
			||||||
 | 
					                  • `patience`: patience diff algorithm
 | 
				
			||||||
 | 
					                  • `histogram`: histogram diff algorithm
 | 
				
			||||||
 | 
					                • {ctxlen}? (`integer`) Context length
 | 
				
			||||||
 | 
					                • {interhunkctxlen}? (`integer`) Inter hunk context length
 | 
				
			||||||
 | 
					                • {ignore_whitespace}? (`boolean`) Ignore whitespace
 | 
				
			||||||
 | 
					                • {ignore_whitespace_change}? (`boolean`) Ignore whitespace
 | 
				
			||||||
 | 
					                  change
 | 
				
			||||||
 | 
					                • {ignore_whitespace_change_at_eol}? (`boolean`) Ignore
 | 
				
			||||||
 | 
					                  whitespace change at end-of-line.
 | 
				
			||||||
 | 
					                • {ignore_cr_at_eol}? (`boolean`) Ignore carriage return at
 | 
				
			||||||
 | 
					                  end-of-line
 | 
				
			||||||
 | 
					                • {ignore_blank_lines}? (`boolean`) Ignore blank lines
 | 
				
			||||||
 | 
					                • {indent_heuristic}? (`boolean`) Use the indent heuristic for
 | 
				
			||||||
 | 
					                  the internal diff library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Return: ~
 | 
				
			||||||
 | 
					        (`string|integer[][]?`) See {opts.result_type}. `nil` if
 | 
				
			||||||
 | 
					        {opts.on_hunk} is given.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vim.text.hexdecode({enc})                               *vim.text.hexdecode()*
 | 
					vim.text.hexdecode({enc})                               *vim.text.hexdecode()*
 | 
				
			||||||
    Hex decode a string.
 | 
					    Hex decode a string.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,7 +140,7 @@ The following new APIs or features were added.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
• 'diffopt' now includes a `linematch` option to enable a second-stage diff on
 | 
					• 'diffopt' now includes a `linematch` option to enable a second-stage diff on
 | 
				
			||||||
  individual hunks to provide much more accurate diffs. This option is also
 | 
					  individual hunks to provide much more accurate diffs. This option is also
 | 
				
			||||||
  available to |vim.diff()|
 | 
					  available to |vim.text.diff()|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  See https://github.com/neovim/neovim/pull/14537.
 | 
					  See https://github.com/neovim/neovim/pull/14537.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,7 +87,7 @@ LSP
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
LUA
 | 
					LUA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
• todo
 | 
					• Renamed `vim.diff` to `vim.text.diff`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OPTIONS
 | 
					OPTIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1314,9 +1314,12 @@ end
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require('vim._options')
 | 
					require('vim._options')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Remove at Nvim 1.0
 | 
					--- Remove at Nvim 1.0
 | 
				
			||||||
---@deprecated
 | 
					---@deprecated
 | 
				
			||||||
vim.loop = vim.uv
 | 
					vim.loop = vim.uv
 | 
				
			||||||
 | 
					--- Renamed to `vim.text.diff`, remove at Nvim 1.0
 | 
				
			||||||
 | 
					---@deprecated
 | 
				
			||||||
 | 
					vim.diff = vim._diff ---@type fun(a: string, b: string, opts?: vim.text.diff.Opts): string|integer[][]?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Deprecated. Remove at Nvim 2.0
 | 
					-- Deprecated. Remove at Nvim 2.0
 | 
				
			||||||
vim.highlight = vim._defer_deprecated_module('vim.highlight', 'vim.hl')
 | 
					vim.highlight = vim._defer_deprecated_module('vim.highlight', 'vim.hl')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,71 +0,0 @@
 | 
				
			|||||||
---@meta
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--- Optional parameters:
 | 
					 | 
				
			||||||
--- @class vim.diff.Opts
 | 
					 | 
				
			||||||
--- @inlinedoc
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- Invoked for each hunk in the diff. Return a negative number
 | 
					 | 
				
			||||||
--- to cancel the callback for any remaining hunks.
 | 
					 | 
				
			||||||
--- Arguments:
 | 
					 | 
				
			||||||
---   - `start_a` (`integer`): Start line of hunk in {a}.
 | 
					 | 
				
			||||||
---   - `count_a` (`integer`): Hunk size in {a}.
 | 
					 | 
				
			||||||
---   - `start_b` (`integer`): Start line of hunk in {b}.
 | 
					 | 
				
			||||||
---   - `count_b` (`integer`): Hunk size in {b}.
 | 
					 | 
				
			||||||
--- @field on_hunk? fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- Form of the returned diff:
 | 
					 | 
				
			||||||
---   - `unified`: String in unified format.
 | 
					 | 
				
			||||||
---   - `indices`: Array of hunk locations.
 | 
					 | 
				
			||||||
--- Note: This option is ignored if `on_hunk` is used.
 | 
					 | 
				
			||||||
--- (default: `'unified'`)
 | 
					 | 
				
			||||||
--- @field result_type? 'unified'|'indices'
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- Run linematch on the resulting hunks from xdiff. When integer, only hunks
 | 
					 | 
				
			||||||
--- upto this size in lines are run through linematch.
 | 
					 | 
				
			||||||
--- Requires `result_type = indices`, ignored otherwise.
 | 
					 | 
				
			||||||
--- @field linematch? boolean|integer
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- Diff algorithm to use. Values:
 | 
					 | 
				
			||||||
---   - `myers`: the default algorithm
 | 
					 | 
				
			||||||
---   - `minimal`: spend extra time to generate the smallest possible diff
 | 
					 | 
				
			||||||
---   - `patience`: patience diff algorithm
 | 
					 | 
				
			||||||
---   - `histogram`: histogram diff algorithm
 | 
					 | 
				
			||||||
--- (default: `'myers'`)
 | 
					 | 
				
			||||||
--- @field algorithm? 'myers'|'minimal'|'patience'|'histogram'
 | 
					 | 
				
			||||||
--- @field ctxlen? integer Context length
 | 
					 | 
				
			||||||
--- @field interhunkctxlen? integer Inter hunk context length
 | 
					 | 
				
			||||||
--- @field ignore_whitespace? boolean Ignore whitespace
 | 
					 | 
				
			||||||
--- @field ignore_whitespace_change? boolean Ignore whitespace change
 | 
					 | 
				
			||||||
--- @field ignore_whitespace_change_at_eol? boolean Ignore whitespace change at end-of-line.
 | 
					 | 
				
			||||||
--- @field ignore_cr_at_eol? boolean Ignore carriage return at end-of-line
 | 
					 | 
				
			||||||
--- @field ignore_blank_lines? boolean Ignore blank lines
 | 
					 | 
				
			||||||
--- @field indent_heuristic? boolean Use the indent heuristic for the internal diff library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- luacheck: no unused args
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
--- Run diff on strings {a} and {b}. Any indices returned by this function,
 | 
					 | 
				
			||||||
--- either directly or via callback arguments, are 1-based.
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- Examples:
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- ```lua
 | 
					 | 
				
			||||||
--- vim.diff('a\n', 'b\nc\n')
 | 
					 | 
				
			||||||
--- -- =>
 | 
					 | 
				
			||||||
--- -- @@ -1 +1,2 @@
 | 
					 | 
				
			||||||
--- -- -a
 | 
					 | 
				
			||||||
--- -- +b
 | 
					 | 
				
			||||||
--- -- +c
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
--- vim.diff('a\n', 'b\nc\n', {result_type = 'indices'})
 | 
					 | 
				
			||||||
--- -- =>
 | 
					 | 
				
			||||||
--- -- {
 | 
					 | 
				
			||||||
--- --   {1, 1, 1, 2}
 | 
					 | 
				
			||||||
--- -- }
 | 
					 | 
				
			||||||
--- ```
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
---@param a string First string to compare
 | 
					 | 
				
			||||||
---@param b string Second string to compare
 | 
					 | 
				
			||||||
---@param opts? vim.diff.Opts
 | 
					 | 
				
			||||||
---@return string|integer[][]?
 | 
					 | 
				
			||||||
---     See {opts.result_type}. `nil` if {opts.on_hunk} is given.
 | 
					 | 
				
			||||||
function vim.diff(a, b, opts) end
 | 
					 | 
				
			||||||
@@ -2,6 +2,80 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
local M = {}
 | 
					local M = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- Optional parameters:
 | 
				
			||||||
 | 
					--- @class vim.text.diff.Opts
 | 
				
			||||||
 | 
					--- @inlinedoc
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- Invoked for each hunk in the diff. Return a negative number
 | 
				
			||||||
 | 
					--- to cancel the callback for any remaining hunks.
 | 
				
			||||||
 | 
					--- Arguments:
 | 
				
			||||||
 | 
					---   - `start_a` (`integer`): Start line of hunk in {a}.
 | 
				
			||||||
 | 
					---   - `count_a` (`integer`): Hunk size in {a}.
 | 
				
			||||||
 | 
					---   - `start_b` (`integer`): Start line of hunk in {b}.
 | 
				
			||||||
 | 
					---   - `count_b` (`integer`): Hunk size in {b}.
 | 
				
			||||||
 | 
					--- @field on_hunk? fun(start_a: integer, count_a: integer, start_b: integer, count_b: integer): integer?
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- Form of the returned diff:
 | 
				
			||||||
 | 
					---   - `unified`: String in unified format.
 | 
				
			||||||
 | 
					---   - `indices`: Array of hunk locations.
 | 
				
			||||||
 | 
					--- Note: This option is ignored if `on_hunk` is used.
 | 
				
			||||||
 | 
					--- (default: `'unified'`)
 | 
				
			||||||
 | 
					--- @field result_type? 'unified'|'indices'
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- Run linematch on the resulting hunks from xdiff. When integer, only hunks
 | 
				
			||||||
 | 
					--- upto this size in lines are run through linematch.
 | 
				
			||||||
 | 
					--- Requires `result_type = indices`, ignored otherwise.
 | 
				
			||||||
 | 
					--- @field linematch? boolean|integer
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- Diff algorithm to use. Values:
 | 
				
			||||||
 | 
					---   - `myers`: the default algorithm
 | 
				
			||||||
 | 
					---   - `minimal`: spend extra time to generate the smallest possible diff
 | 
				
			||||||
 | 
					---   - `patience`: patience diff algorithm
 | 
				
			||||||
 | 
					---   - `histogram`: histogram diff algorithm
 | 
				
			||||||
 | 
					--- (default: `'myers'`)
 | 
				
			||||||
 | 
					--- @field algorithm? 'myers'|'minimal'|'patience'|'histogram'
 | 
				
			||||||
 | 
					--- @field ctxlen? integer Context length
 | 
				
			||||||
 | 
					--- @field interhunkctxlen? integer Inter hunk context length
 | 
				
			||||||
 | 
					--- @field ignore_whitespace? boolean Ignore whitespace
 | 
				
			||||||
 | 
					--- @field ignore_whitespace_change? boolean Ignore whitespace change
 | 
				
			||||||
 | 
					--- @field ignore_whitespace_change_at_eol? boolean Ignore whitespace change at end-of-line.
 | 
				
			||||||
 | 
					--- @field ignore_cr_at_eol? boolean Ignore carriage return at end-of-line
 | 
				
			||||||
 | 
					--- @field ignore_blank_lines? boolean Ignore blank lines
 | 
				
			||||||
 | 
					--- @field indent_heuristic? boolean Use the indent heuristic for the internal diff library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- luacheck: no unused args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- Run diff on strings {a} and {b}. Any indices returned by this function,
 | 
				
			||||||
 | 
					--- either directly or via callback arguments, are 1-based.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- Examples:
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- ```lua
 | 
				
			||||||
 | 
					--- vim.text.diff('a\n', 'b\nc\n')
 | 
				
			||||||
 | 
					--- -- =>
 | 
				
			||||||
 | 
					--- -- @@ -1 +1,2 @@
 | 
				
			||||||
 | 
					--- -- -a
 | 
				
			||||||
 | 
					--- -- +b
 | 
				
			||||||
 | 
					--- -- +c
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- vim.text.diff('a\n', 'b\nc\n', {result_type = 'indices'})
 | 
				
			||||||
 | 
					--- -- =>
 | 
				
			||||||
 | 
					--- -- {
 | 
				
			||||||
 | 
					--- --   {1, 1, 1, 2}
 | 
				
			||||||
 | 
					--- -- }
 | 
				
			||||||
 | 
					--- ```
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					---@diagnostic disable-next-line: undefined-doc-param
 | 
				
			||||||
 | 
					---@param a string First string to compare
 | 
				
			||||||
 | 
					---@diagnostic disable-next-line: undefined-doc-param
 | 
				
			||||||
 | 
					---@param b string Second string to compare
 | 
				
			||||||
 | 
					---@diagnostic disable-next-line: undefined-doc-param
 | 
				
			||||||
 | 
					---@param opts? vim.text.diff.Opts
 | 
				
			||||||
 | 
					---@return string|integer[][]? # See {opts.result_type}. `nil` if {opts.on_hunk} is given.
 | 
				
			||||||
 | 
					function M.diff(...)
 | 
				
			||||||
 | 
					  return vim._diff(...)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local alphabet = '0123456789ABCDEF'
 | 
					local alphabet = '0123456789ABCDEF'
 | 
				
			||||||
local atoi = {} ---@type table<string, integer>
 | 
					local atoi = {} ---@type table<string, integer>
 | 
				
			||||||
local itoa = {} ---@type table<integer, string>
 | 
					local itoa = {} ---@type table<integer, string>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -133,7 +133,6 @@ local config = {
 | 
				
			|||||||
    filename = 'lua.txt',
 | 
					    filename = 'lua.txt',
 | 
				
			||||||
    section_order = {
 | 
					    section_order = {
 | 
				
			||||||
      'hl.lua',
 | 
					      'hl.lua',
 | 
				
			||||||
      'diff.lua',
 | 
					 | 
				
			||||||
      'mpack.lua',
 | 
					      'mpack.lua',
 | 
				
			||||||
      'json.lua',
 | 
					      'json.lua',
 | 
				
			||||||
      'base64.lua',
 | 
					      'base64.lua',
 | 
				
			||||||
@@ -185,7 +184,6 @@ local config = {
 | 
				
			|||||||
      'runtime/lua/vim/text.lua',
 | 
					      'runtime/lua/vim/text.lua',
 | 
				
			||||||
      'runtime/lua/vim/glob.lua',
 | 
					      'runtime/lua/vim/glob.lua',
 | 
				
			||||||
      'runtime/lua/vim/_meta/builtin.lua',
 | 
					      'runtime/lua/vim/_meta/builtin.lua',
 | 
				
			||||||
      'runtime/lua/vim/_meta/diff.lua',
 | 
					 | 
				
			||||||
      'runtime/lua/vim/_meta/mpack.lua',
 | 
					      'runtime/lua/vim/_meta/mpack.lua',
 | 
				
			||||||
      'runtime/lua/vim/_meta/json.lua',
 | 
					      'runtime/lua/vim/_meta/json.lua',
 | 
				
			||||||
      'runtime/lua/vim/_meta/base64.lua',
 | 
					      'runtime/lua/vim/_meta/base64.lua',
 | 
				
			||||||
@@ -230,7 +228,6 @@ local config = {
 | 
				
			|||||||
          'mpack',
 | 
					          'mpack',
 | 
				
			||||||
          'json',
 | 
					          'json',
 | 
				
			||||||
          'base64',
 | 
					          'base64',
 | 
				
			||||||
          'diff',
 | 
					 | 
				
			||||||
          'spell',
 | 
					          'spell',
 | 
				
			||||||
          'regex',
 | 
					          'regex',
 | 
				
			||||||
          'lpeg',
 | 
					          'lpeg',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -761,9 +761,9 @@ void nlua_state_add_stdlib(lua_State *const lstate, bool is_thread)
 | 
				
			|||||||
  lua_setfield(lstate, -2, "lpeg");
 | 
					  lua_setfield(lstate, -2, "lpeg");
 | 
				
			||||||
  lua_pop(lstate, 4);
 | 
					  lua_pop(lstate, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // vim.diff
 | 
					  // vim.text.diff
 | 
				
			||||||
  lua_pushcfunction(lstate, &nlua_xdl_diff);
 | 
					  lua_pushcfunction(lstate, &nlua_xdl_diff);
 | 
				
			||||||
  lua_setfield(lstate, -2, "diff");
 | 
					  lua_setfield(lstate, -2, "_diff");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // vim.json
 | 
					  // vim.json
 | 
				
			||||||
  lua_cjson_new(lstate);
 | 
					  lua_cjson_new(lstate);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,9 +164,7 @@ static int call_on_hunk_cb(int start_a, int count_a, int start_b, int count_b, v
 | 
				
			|||||||
  lua_pushinteger(lstate, count_b);
 | 
					  lua_pushinteger(lstate, count_b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (lua_pcall(lstate, 4, 1, 0) != 0) {
 | 
					  if (lua_pcall(lstate, 4, 1, 0) != 0) {
 | 
				
			||||||
    api_set_error(err, kErrorTypeException,
 | 
					    api_set_error(err, kErrorTypeException, "on_hunk: %s", lua_tostring(lstate, -1));
 | 
				
			||||||
                  "error running function on_hunk: %s",
 | 
					 | 
				
			||||||
                  lua_tostring(lstate, -1));
 | 
					 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -217,7 +217,7 @@ describe('thread', function()
 | 
				
			|||||||
    it('diff', function()
 | 
					    it('diff', function()
 | 
				
			||||||
      exec_lua [[
 | 
					      exec_lua [[
 | 
				
			||||||
        local entry = function(async)
 | 
					        local entry = function(async)
 | 
				
			||||||
          async:send(vim.diff('Hello\n', 'Helli\n'))
 | 
					          async:send(vim.text.diff('Hello\n', 'Helli\n'))
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        local on_async = function(ret)
 | 
					        local on_async = function(ret)
 | 
				
			||||||
          vim.rpcnotify(1, 'result', ret)
 | 
					          vim.rpcnotify(1, 'result', ret)
 | 
				
			||||||
@@ -372,7 +372,7 @@ describe('threadpool', function()
 | 
				
			|||||||
    it('work', function()
 | 
					    it('work', function()
 | 
				
			||||||
      exec_lua [[
 | 
					      exec_lua [[
 | 
				
			||||||
        local work_fn = function()
 | 
					        local work_fn = function()
 | 
				
			||||||
          return vim.diff('Hello\n', 'Helli\n')
 | 
					          return vim.text.diff('Hello\n', 'Helli\n')
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        local after_work_fn = function(ret)
 | 
					        local after_work_fn = function(ret)
 | 
				
			||||||
          vim.rpcnotify(1, 'result', ret)
 | 
					          vim.rpcnotify(1, 'result', ret)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
          '',
 | 
					          '',
 | 
				
			||||||
        }, '\n'),
 | 
					        }, '\n'),
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          return vim.diff(a1, b1)
 | 
					          return vim.text.diff(a1, b1)
 | 
				
			||||||
        end)
 | 
					        end)
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,7 +43,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
          '',
 | 
					          '',
 | 
				
			||||||
        }, '\n'),
 | 
					        }, '\n'),
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          return vim.diff(a2, b2)
 | 
					          return vim.text.diff(a2, b2)
 | 
				
			||||||
        end)
 | 
					        end)
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end)
 | 
					    end)
 | 
				
			||||||
@@ -53,7 +53,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
        { { 1, 1, 1, 1 } },
 | 
					        { { 1, 1, 1, 1 } },
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          local exp = {} --- @type table[]
 | 
					          local exp = {} --- @type table[]
 | 
				
			||||||
          assert(vim.diff(a1, b1, {
 | 
					          assert(vim.text.diff(a1, b1, {
 | 
				
			||||||
            on_hunk = function(...)
 | 
					            on_hunk = function(...)
 | 
				
			||||||
              exp[#exp + 1] = { ... }
 | 
					              exp[#exp + 1] = { ... }
 | 
				
			||||||
            end,
 | 
					            end,
 | 
				
			||||||
@@ -66,7 +66,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
					        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          local exp = {} --- @type table[]
 | 
					          local exp = {} --- @type table[]
 | 
				
			||||||
          assert(vim.diff(a2, b2, {
 | 
					          assert(vim.text.diff(a2, b2, {
 | 
				
			||||||
            on_hunk = function(...)
 | 
					            on_hunk = function(...)
 | 
				
			||||||
              exp[#exp + 1] = { ... }
 | 
					              exp[#exp + 1] = { ... }
 | 
				
			||||||
            end,
 | 
					            end,
 | 
				
			||||||
@@ -80,7 +80,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
					        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          local exp = {} --- @type table[]
 | 
					          local exp = {} --- @type table[]
 | 
				
			||||||
          assert(vim.diff(a2, b2, {
 | 
					          assert(vim.text.diff(a2, b2, {
 | 
				
			||||||
            on_hunk = function(...)
 | 
					            on_hunk = function(...)
 | 
				
			||||||
              exp[#exp + 1] = { ... }
 | 
					              exp[#exp + 1] = { ... }
 | 
				
			||||||
            end,
 | 
					            end,
 | 
				
			||||||
@@ -92,10 +92,10 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
    end)
 | 
					    end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('with error callback', function()
 | 
					    it('with error callback', function()
 | 
				
			||||||
      eq(
 | 
					      t.matches(
 | 
				
			||||||
        [[.../xdiff_spec.lua:0: error running function on_hunk: .../xdiff_spec.lua:0: ERROR1]],
 | 
					        [[on_hunk: %.%.%./xdiff_spec%.lua%:0%: ERROR1]],
 | 
				
			||||||
        pcall_err(exec_lua, function()
 | 
					        pcall_err(exec_lua, function()
 | 
				
			||||||
          vim.diff(a1, b1, {
 | 
					          vim.text.diff(a1, b1, {
 | 
				
			||||||
            on_hunk = function()
 | 
					            on_hunk = function()
 | 
				
			||||||
              error('ERROR1')
 | 
					              error('ERROR1')
 | 
				
			||||||
            end,
 | 
					            end,
 | 
				
			||||||
@@ -108,14 +108,14 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
      eq(
 | 
					      eq(
 | 
				
			||||||
        { { 1, 1, 1, 1 } },
 | 
					        { { 1, 1, 1, 1 } },
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          return vim.diff(a1, b1, { result_type = 'indices' })
 | 
					          return vim.text.diff(a1, b1, { result_type = 'indices' })
 | 
				
			||||||
        end)
 | 
					        end)
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      eq(
 | 
					      eq(
 | 
				
			||||||
        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
					        { { 1, 1, 1, 1 }, { 3, 1, 3, 2 } },
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          return vim.diff(a2, b2, { result_type = 'indices' })
 | 
					          return vim.text.diff(a2, b2, { result_type = 'indices' })
 | 
				
			||||||
        end)
 | 
					        end)
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    end)
 | 
					    end)
 | 
				
			||||||
@@ -160,7 +160,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
          '',
 | 
					          '',
 | 
				
			||||||
        }, '\n'),
 | 
					        }, '\n'),
 | 
				
			||||||
        exec_lua(function()
 | 
					        exec_lua(function()
 | 
				
			||||||
          return vim.diff(a, b, {
 | 
					          return vim.text.diff(a, b, {
 | 
				
			||||||
            algorithm = 'patience',
 | 
					            algorithm = 'patience',
 | 
				
			||||||
          })
 | 
					          })
 | 
				
			||||||
        end)
 | 
					        end)
 | 
				
			||||||
@@ -169,20 +169,26 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('can handle bad args', function()
 | 
					  it('can handle bad args', function()
 | 
				
			||||||
    eq([[Expected at least 2 arguments]], pcall_err(exec_lua, [[vim.diff('a')]]))
 | 
					    eq([[Expected at least 2 arguments]], pcall_err(exec_lua, [[vim.text.diff('a')]]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eq([[bad argument #1 to 'diff' (expected string)]], pcall_err(exec_lua, [[vim.diff(1, 2)]]))
 | 
					    t.matches(
 | 
				
			||||||
 | 
					      [[bad argument %#1 to '_?diff' %(expected string%)]],
 | 
				
			||||||
    eq(
 | 
					      pcall_err(exec_lua, [[vim.text.diff(1, 2)]])
 | 
				
			||||||
      [[bad argument #3 to 'diff' (expected table)]],
 | 
					 | 
				
			||||||
      pcall_err(exec_lua, [[vim.diff('a', 'b', true)]])
 | 
					 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eq([[invalid key: bad_key]], pcall_err(exec_lua, [[vim.diff('a', 'b', { bad_key = true })]]))
 | 
					    t.matches(
 | 
				
			||||||
 | 
					      [[bad argument %#3 to '_?diff' %(expected table%)]],
 | 
				
			||||||
 | 
					      pcall_err(exec_lua, [[vim.text.diff('a', 'b', true)]])
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eq(
 | 
				
			||||||
 | 
					      [[invalid key: bad_key]],
 | 
				
			||||||
 | 
					      pcall_err(exec_lua, [[vim.text.diff('a', 'b', { bad_key = true })]])
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eq(
 | 
					    eq(
 | 
				
			||||||
      [[on_hunk is not a function]],
 | 
					      [[on_hunk is not a function]],
 | 
				
			||||||
      pcall_err(exec_lua, [[vim.diff('a', 'b', { on_hunk = true })]])
 | 
					      pcall_err(exec_lua, [[vim.text.diff('a', 'b', { on_hunk = true })]])
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,7 +196,7 @@ describe('xdiff bindings', function()
 | 
				
			|||||||
    eq(
 | 
					    eq(
 | 
				
			||||||
      { { 0, 0, 1, 1 }, { 1, 0, 3, 2 } },
 | 
					      { { 0, 0, 1, 1 }, { 1, 0, 3, 2 } },
 | 
				
			||||||
      exec_lua(function()
 | 
					      exec_lua(function()
 | 
				
			||||||
        return vim.diff('\n', '\0\n\n\nb', { linematch = true, result_type = 'indices' })
 | 
					        return vim.text.diff('\n', '\0\n\n\nb', { linematch = true, result_type = 'indices' })
 | 
				
			||||||
      end)
 | 
					      end)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user