fix(glob): handle numeric literals in pattern matching (#37257)

Problem:
vim.glob.to_lpeg() errors when patterns contain numeric literals
(like the '1' in '.ps*1') because LPeg interprets numeric strings
as indexed grammar rule references. For example:
  vim.glob.to_lpeg('.ps*1')
  E5108: Lua: rule '1' undefined in given grammar

Solution:
Prefix all rule names with '_' in the end_seg() function to prevent
literal numbers from being interpreted as LPeg indexed rules. This
ensures pattern components like '1', '2', etc. are treated as
regular rule names rather than special references.
This commit is contained in:
Tristan Knight
2026-01-12 18:58:01 +00:00
committed by GitHub
parent 025c0c34ce
commit d2ca90d87e
2 changed files with 4 additions and 1 deletions

View File

@@ -96,7 +96,7 @@ local function end_seg(t)
if t.n > 0 then
seg_grammar.s = t.s
for i = 1, t.n do
local rname = t[i][1]
local rname = '_' .. t[i][1]
if not seg_grammar[rname] then
-- Optimize search when deterministic first character is available
if t[i].F then

View File

@@ -67,6 +67,9 @@ describe('glob', function()
eq(true, match('a*b*[cy]*d*e*', 'axbxcxdxexxx'))
eq(true, match('a*b*[cy]*d*e*', 'axbxyxdxexxx'))
eq(true, match('a*b*[cy]*d*e*', 'axbxxxyxdxexxx'))
eq(true, match('.ps*1', '.ps1'))
eq(true, match('.ps*1', '.psaa1'))
eq(false, match('.ps*1', '.ps1a'))
end)
it('should match ? wildcards', function()