0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.1.1600: using diff anchors with hidden buffers fails silently

Problem:  diff: using diff anchors with hidden buffers fails silently
Solution: Give specific error message for diff anchors when using hidden
          buffers (Yee Cheng Chin).

Diff anchors currently will fail to parse if a buffer used for diff'ing
is hidden. Previously it would just fail as the code assumes it would
not happen normally, but this is actually possible to do if `closeoff`
and `hideoff` are not set in diffopt. Git's default diff tool "vimdiff3"
also takes advantage of this.

This fix this properly would require the `{address}` parser to be
smarter about whether a particular address relies on window position or
not (e.g. the `'.` address requires an active window, but `'a` or `1234`
do not). Since hidden diff buffers seem relatively niche, just provide a
better error message / documentation for now. This could be improved
later if there's a demand for it.

related: #17615
closes: #17904

Signed-off-by: Yee Cheng Chin <ychin.git@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yee Cheng Chin
2025-08-07 15:33:34 +02:00
committed by Christian Brabandt
parent 589aa284f6
commit cad3b2421d
7 changed files with 27 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
*options.txt* For Vim version 9.1. Last change: 2025 Aug 06 *options.txt* For Vim version 9.1. Last change: 2025 Aug 07
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -3016,6 +3016,8 @@ A jump table for the options with a short description can be found at |Q_op|.
If some of the {address} do not resolve to a line in each buffer (e.g. If some of the {address} do not resolve to a line in each buffer (e.g.
a pattern search that does not match anything), none of the anchors a pattern search that does not match anything), none of the anchors
will be used. will be used.
*E1562*
Diff anchors can only be used when there are no hidden diff buffers.
*'dex'* *'diffexpr'* *'dex'* *'diffexpr'*
'diffexpr' 'dex' string (default "") 'diffexpr' 'dex' string (default "")

View File

@@ -4694,6 +4694,7 @@ E1559 vim9.txt /*E1559*
E156 sign.txt /*E156* E156 sign.txt /*E156*
E1560 vim9.txt /*E1560* E1560 vim9.txt /*E1560*
E1561 vim9.txt /*E1561* E1561 vim9.txt /*E1561*
E1562 options.txt /*E1562*
E157 sign.txt /*E157* E157 sign.txt /*E157*
E158 sign.txt /*E158* E158 sign.txt /*E158*
E159 sign.txt /*E159* E159 sign.txt /*E159*

View File

@@ -2768,8 +2768,15 @@ parse_diffanchors(int check_only, buf_T *buf, linenr_T *anchors, int *num_anchor
FOR_ALL_WINDOWS(bufwin) FOR_ALL_WINDOWS(bufwin)
if (bufwin->w_buffer == buf && bufwin->w_p_diff) if (bufwin->w_buffer == buf && bufwin->w_p_diff)
break; break;
if (bufwin == NULL) if (bufwin == NULL && *dia != NUL)
return FAIL; // should not really happen {
// The buffer is hidden. Currently this is not supported due to the
// edge cases of needing to decide if an address is window-specific
// or not. We could add more checks in the future so we can detect
// whether an address relies on curwin to make this more fleixble.
emsg(_(e_diff_anchors_with_hidden_windows));
return FAIL;
}
} }
for (i = 0; i < MAX_DIFF_ANCHORS && *dia != NUL; i++) for (i = 0; i < MAX_DIFF_ANCHORS && *dia != NUL; i++)

View File

@@ -3778,3 +3778,7 @@ EXTERN char e_not_a_generic_function_str[]
EXTERN char e_duplicate_type_var_name_str[] EXTERN char e_duplicate_type_var_name_str[]
INIT(= N_("E1561: Duplicate type variable name: %s")); INIT(= N_("E1561: Duplicate type variable name: %s"));
#endif #endif
#if defined(FEAT_DIFF)
EXTERN char e_diff_anchors_with_hidden_windows[]
INIT(= N_("E1562: Diff anchors cannot be used with hidden diff windows"));
#endif

5
src/po/vim.pot generated
View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-25 19:14+0200\n" "POT-Creation-Date: 2025-08-07 15:32+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -8803,6 +8803,9 @@ msgstr ""
msgid "E1561: Duplicate type variable name: %s" msgid "E1561: Duplicate type variable name: %s"
msgstr "" msgstr ""
msgid "E1562: Diff anchors cannot be used with hidden diff windows"
msgstr ""
#. type of cmdline window or 0 #. type of cmdline window or 0
#. result of cmdline window or 0 #. result of cmdline window or 0
#. buffer of cmdline window or NULL #. buffer of cmdline window or NULL

View File

@@ -3483,6 +3483,10 @@ func Test_diffanchors_invalid()
diffupdate diffupdate
call assert_equal('orig_search_pat', @/) " also check we don't pollute the search register call assert_equal('orig_search_pat', @/) " also check we don't pollute the search register
set diffanchors=1/does_not_exist/ set diffanchors=1/does_not_exist/
call assert_fails('diffupdate', 'E1550:')
call assert_equal('orig_search_pat', @/)
" Hidden buffers are not supported right now
hide hide
call assert_fails('diffupdate', 'E1562:') call assert_fails('diffupdate', 'E1562:')

View File

@@ -719,6 +719,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1600,
/**/ /**/
1599, 1599,
/**/ /**/