diff --git a/runtime/lua/vim/_core/help.lua b/runtime/lua/vim/_core/help.lua index 1e0f665566..a78f325ffb 100644 --- a/runtime/lua/vim/_core/help.lua +++ b/runtime/lua/vim/_core/help.lua @@ -433,6 +433,8 @@ local function extract_tags(tags, file, name) return end --- @cast source string + -- The grammar treats "\r" as part of a word, so CRLF files would yield bogus tags. + source = source:gsub('\r\n', '\n') local query = ts.query.parse('vimdoc', '(tag (word) @tagname)') local parser = ts.get_string_parser(source, 'vimdoc') diff --git a/test/functional/ex_cmds/help_spec.lua b/test/functional/ex_cmds/help_spec.lua index b97fdd4817..6c76255a38 100644 --- a/test/functional/ex_cmds/help_spec.lua +++ b/test/functional/ex_cmds/help_spec.lua @@ -354,11 +354,13 @@ describe(':helptags', function() fn.mkdir('Xhelptags/doc/sub', 'p') -- A "|" in a tag would break |links|, and "*Xd" is not closed, so neither is a tag. write_file('Xhelptags/doc/sub/Xc.txt', '*Xc*\n*X|c*\n*Xd\n') + -- CRLF helpfile: "\r" must not confuse the parser into finding tags in an example. + write_file('Xhelptags/doc/Xe.txt', '*Xe*\r\n>\r\n\t+-----+\r\n\t|/* a.c */ |/* b.c */ |\r\n') command('helptags Xhelptags/doc') eq( - eval("['Xa Xa.txt /*Xa*','Xb Xb.txt /*Xb*','Xc sub/Xc.txt /*Xc*']"), + eval("['Xa Xa.txt /*Xa*','Xb Xb.txt /*Xb*','Xc sub/Xc.txt /*Xc*','Xe Xe.txt /*Xe*']"), eval("readfile('Xhelptags/doc/tags')") )