diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2024-02-12 20:21:26 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-02-12 20:24:56 +0100 |
commit | a0010a186d93187d2b69b857d75db8a1e01049bb (patch) | |
tree | 5ec733566b066d5d053a38fe2117ac5bad68e6ad | |
parent | 6d91227267a5f7e21fc9b30443687618e92751bf (diff) |
patch 9.1.0099: Not able to use diff() with 'diffexpr'v9.1.0099
Problem: Not able to use diff() with 'diffexpr'
(rickhowe, after v9.1.0096)
Solution: Use a default context length of 0, update diff() help text,
add a test for using diff() with 'diffexpr'
(Yegappan Lakshmanan)
closes: #14013
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | runtime/doc/builtin.txt | 9 | ||||
-rw-r--r-- | runtime/doc/diff.txt | 7 | ||||
-rw-r--r-- | src/diff.c | 4 | ||||
-rw-r--r-- | src/evalfunc.c | 2 | ||||
-rw-r--r-- | src/testdir/dumps/Test_difffunc_diffexpr_1.dump | 12 | ||||
-rw-r--r-- | src/testdir/test_diffmode.vim | 65 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 77 insertions, 24 deletions
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 0dca4679e9..0b3d59e966 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2024 Feb 11 +*builtin.txt* For Vim version 9.1. Last change: 2024 Feb 12 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2078,8 +2078,7 @@ diff({fromlist}, {tolist} [, {options}]) *diff()* use. Supported boolean items are "myers", "minimal", "patience" and "histogram". - context unified diff context length. Default - is 1. + context diff context length. Default is 0. iblank ignore changes where lines are all blank. icase ignore changes in case of text. @@ -2092,6 +2091,10 @@ diff({fromlist}, {tolist} [, {options}]) *diff()* line. For more information about these options, refer to 'diffopt'. + To compute the unified diff, all the items in {fromlist} are + concatenated into a string using a newline separator and the + same for {tolist}. The unified diff output uses line numbers. + Returns an empty List or String if {fromlist} and {tolist} are identical. diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt index 05dd4a6be9..e3abbdeff5 100644 --- a/runtime/doc/diff.txt +++ b/runtime/doc/diff.txt @@ -510,9 +510,14 @@ between two Lists of strings are below. [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] " disjointed changes - :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices'}) + :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 0}) [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1}, {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}] + + " disjointed changes with context length 1 + :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 1}) + [{'from_idx': 0, 'from_count': 4, 'to_idx': 0, 'to_count': 4}] + < vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/src/diff.c b/src/diff.c index a4f3f7e072..d2089dc15e 100644 --- a/src/diff.c +++ b/src/diff.c @@ -3511,9 +3511,9 @@ parse_diff_optarg( } } - *diff_ctxlen = dict_get_number_def(d, "context", 1); + *diff_ctxlen = dict_get_number_def(d, "context", 0); if (*diff_ctxlen < 0) - *diff_ctxlen = 1; + *diff_ctxlen = 0; if (dict_get_bool(d, "iblank", FALSE)) *diffopts |= DIFF_IBLANK; diff --git a/src/evalfunc.c b/src/evalfunc.c index 67a14272b1..d13eb1c9f5 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1952,7 +1952,7 @@ static funcentry_T global_functions[] = {"did_filetype", 0, 0, 0, NULL, ret_number_bool, f_did_filetype}, {"diff", 2, 3, FEARG_1, arg3_diff, - ret_list_dict_any, f_diff}, + ret_any, f_diff}, {"diff_filler", 1, 1, FEARG_1, arg1_lnum, ret_number, f_diff_filler}, {"diff_hlID", 2, 2, FEARG_1, arg2_lnum_number, diff --git a/src/testdir/dumps/Test_difffunc_diffexpr_1.dump b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump new file mode 100644 index 0000000000..b103cc8d29 --- /dev/null +++ b/src/testdir/dumps/Test_difffunc_diffexpr_1.dump @@ -0,0 +1,12 @@ +| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|z+0#0000000#5fd7ff255|e|r|o| @30 +| +0#0000e05#a8a8a8255@1>o+0#0000000#ffffff0|n|e| @31||+1&&| +0#0000e05#a8a8a8255@1|o+0#0000000#ffffff0|n|e| @31 +| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o|x+2&#ff404010| +0&#ffd7ff255@30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|t+0#0000000#ffd7ff255|w|o| @31 +| +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29||+1&&| +0#0000e05#a8a8a8255@1|t+0#0000000#ffffff0|h|r|e@1| @29 +| +0#0000e05#a8a8a8255@1|f+0#0000000#5fd7ff255|o|u|r| @30||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34 +|~+0&#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|X+3#0000000&|d|i|f@2|u|n|c|2|.|t|x|t| @4|1|,|1| @11|A|l@1| |X+1&&|d|i|f@2|u|n|c|1|.|t|x|t| @4|1|,|1| @11|A|l@1 +|"+0&&|X|d|i|f@2|u|n|c|2|.|t|x|t|"| |4|L|,| |2|0|B| @50 diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index d37a9a28a5..8e7d5ce312 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -1719,43 +1719,43 @@ endfunc " Test for the diff() function def Test_diff_func() # string is added/removed/modified at the beginning - assert_equal("@@ -1 +1,2 @@\n+abc\n def\n", + assert_equal("@@ -0,0 +1 @@\n+abc\n", diff(['def'], ['abc', 'def'], {output: 'unified'})) assert_equal([{from_idx: 0, from_count: 0, to_idx: 0, to_count: 1}], diff(['def'], ['abc', 'def'], {output: 'indices'})) - assert_equal("@@ -1,2 +1 @@\n-abc\n def\n", + assert_equal("@@ -1 +0,0 @@\n-abc\n", diff(['abc', 'def'], ['def'], {output: 'unified'})) assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 0}], diff(['abc', 'def'], ['def'], {output: 'indices'})) - assert_equal("@@ -1,2 +1,2 @@\n-abc\n+abx\n def\n", + assert_equal("@@ -1 +1 @@\n-abc\n+abx\n", diff(['abc', 'def'], ['abx', 'def'], {output: 'unified'})) assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}], diff(['abc', 'def'], ['abx', 'def'], {output: 'indices'})) # string is added/removed/modified at the end - assert_equal("@@ -1 +1,2 @@\n abc\n+def\n", + assert_equal("@@ -1,0 +2 @@\n+def\n", diff(['abc'], ['abc', 'def'], {output: 'unified'})) assert_equal([{from_idx: 1, from_count: 0, to_idx: 1, to_count: 1}], diff(['abc'], ['abc', 'def'], {output: 'indices'})) - assert_equal("@@ -1,2 +1 @@\n abc\n-def\n", + assert_equal("@@ -2 +1,0 @@\n-def\n", diff(['abc', 'def'], ['abc'], {output: 'unified'})) assert_equal([{from_idx: 1, from_count: 1, to_idx: 1, to_count: 0}], diff(['abc', 'def'], ['abc'], {output: 'indices'})) - assert_equal("@@ -1,2 +1,2 @@\n abc\n-def\n+xef\n", + assert_equal("@@ -2 +2 @@\n-def\n+xef\n", diff(['abc', 'def'], ['abc', 'xef'], {output: 'unified'})) assert_equal([{from_idx: 1, from_count: 1, to_idx: 1, to_count: 1}], diff(['abc', 'def'], ['abc', 'xef'], {output: 'indices'})) # string is added/removed/modified in the middle - assert_equal("@@ -2,2 +2,3 @@\n 222\n+xxx\n 333\n", + assert_equal("@@ -2,0 +3 @@\n+xxx\n", diff(['111', '222', '333'], ['111', '222', 'xxx', '333'], {output: 'unified'})) assert_equal([{from_idx: 2, from_count: 0, to_idx: 2, to_count: 1}], diff(['111', '222', '333'], ['111', '222', 'xxx', '333'], {output: 'indices'})) - assert_equal("@@ -2,3 +2,2 @@\n 222\n-333\n 444\n", + assert_equal("@@ -3 +2,0 @@\n-333\n", diff(['111', '222', '333', '444'], ['111', '222', '444'], {output: 'unified'})) assert_equal([{from_idx: 2, from_count: 1, to_idx: 2, to_count: 0}], diff(['111', '222', '333', '444'], ['111', '222', '444'], {output: 'indices'})) - assert_equal("@@ -2,3 +2,3 @@\n 222\n-333\n+xxx\n 444\n", + assert_equal("@@ -3 +3 @@\n-333\n+xxx\n", diff(['111', '222', '333', '444'], ['111', '222', 'xxx', '444'], {output: 'unified'})) assert_equal([{from_idx: 2, from_count: 1, to_idx: 2, to_count: 1}], diff(['111', '222', '333', '444'], ['111', '222', 'xxx', '444'], {output: 'indices'})) @@ -1795,10 +1795,12 @@ def Test_diff_func() diff(['abcd'], ['abc'], {output: 'unified'})) assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}], diff(['abcd'], ['abc'], {output: 'indices'})) - assert_equal("@@ -1 +1 @@\n-abc\n+abx\n", - diff(['abc'], ['abx'], {output: 'unified'})) + var diff_unified: string = diff(['abc'], ['abx'], {output: 'unified'}) + assert_equal("@@ -1 +1 @@\n-abc\n+abx\n", diff_unified) + var diff_indices: list<dict<number>> = + diff(['abc'], ['abx'], {output: 'indices'}) assert_equal([{from_idx: 0, from_count: 1, to_idx: 0, to_count: 1}], - diff(['abc'], ['abx'], {output: 'indices'})) + diff_indices) # partial string modification at the start and at the end. var fromlist =<< trim END @@ -1825,17 +1827,18 @@ def Test_diff_func() three four five six END - assert_equal("@@ -1,3 +1,3 @@\n-one two\n+one abc two\n three four\n-five abc six\n+five six\n", + assert_equal("@@ -1 +1 @@\n-one two\n+one abc two\n@@ -3 +3 @@\n-five abc six\n+five six\n", diff(fromlist, tolist, {output: 'unified'})) - assert_equal([{from_idx: 0, from_count: 3, to_idx: 0, to_count: 3}], + assert_equal([{'from_count': 1, 'to_idx': 0, 'to_count': 1, 'from_idx': 0}, + {'from_count': 1, 'to_idx': 2, 'to_count': 1, 'from_idx': 2}], diff(fromlist, tolist, {output: 'indices'})) # add/remove blank lines - assert_equal("@@ -1,4 +1,2 @@\n one\n-\n-\n two\n", + assert_equal("@@ -2,2 +1,0 @@\n-\n-\n", diff(['one', '', '', 'two'], ['one', 'two'], {output: 'unified'})) assert_equal([{from_idx: 1, from_count: 2, to_idx: 1, to_count: 0}], diff(['one', '', '', 'two'], ['one', 'two'], {output: 'indices'})) - assert_equal("@@ -1,2 +1,4 @@\n one\n+\n+\n two\n", + assert_equal("@@ -1,0 +2,2 @@\n+\n+\n", diff(['one', 'two'], ['one', '', '', 'two'], {output: 'unified'})) assert_equal([{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}], diff(['one', 'two'], ['one', '', '', 'two'], {output: 'indices'})) @@ -1911,7 +1914,7 @@ def Test_diff_func() diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: 3})) assert_equal("@@ -1,3 +1,4 @@\n+x\n a\n b\n c\n", diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: 4})) - assert_equal("@@ -1 +1,2 @@\n+x\n a\n", + assert_equal("@@ -0,0 +1 @@\n+x\n", diff(['a', 'b', 'c'], ['x', 'a', 'b', 'c'], {context: -1})) # Error cases @@ -1922,4 +1925,32 @@ def Test_diff_func() assert_fails('call diff(["a"], ["a"], {context: []})', 'E745: Using a List as a Number') enddef +" Test for using the diff() function with 'diffexpr' +func Test_diffexpr_with_diff_func() + CheckScreendump + + let lines =<< trim END + def DiffFuncExpr() + var in: list<string> = readfile(v:fname_in) + var new: list<string> = readfile(v:fname_new) + var out: string = diff(in, new) + writefile(split(out, "\n"), v:fname_out) + enddef + set diffexpr=DiffFuncExpr() + + edit Xdifffunc1.txt + diffthis + vert split Xdifffunc2.txt + diffthis + END + call writefile(lines, 'XsetupDiffFunc.vim', 'D') + + call writefile(['zero', 'one', 'two', 'three'], 'Xdifffunc1.txt', 'D') + call writefile(['one', 'twox', 'three', 'four'], 'Xdifffunc2.txt', 'D') + + let buf = RunVimInTerminal('-S XsetupDiffFunc.vim', {'rows': 12}) + call VerifyScreenDump(buf, 'Test_difffunc_diffexpr_1', {}) + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 7fd6982f3f..7a9172a667 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 99, +/**/ 98, /**/ 97, |