diff --git a/runtime/lua/nvim/zip.lua b/runtime/lua/nvim/zip.lua index 7dd55b90dc..af07794039 100644 --- a/runtime/lua/nvim/zip.lua +++ b/runtime/lua/nvim/zip.lua @@ -18,7 +18,14 @@ end ---@param value string ---@return string local function literal_pattern(value) - return (value:gsub('\\', '\\\\'):gsub('%?', '\\?'):gsub('%*', '\\*'):gsub('%[', '[[]')) + return ( + value + :gsub('\\', '\\\\') + :gsub('%?', '\\?') + :gsub('%*', '\\*') + :gsub('%[', '[[]') + :gsub('^%-', '[-]') + ) end ---@param source string diff --git a/test/functional/plugin/zip_spec.lua b/test/functional/plugin/zip_spec.lua index 7d5497710a..5ec4329283 100644 --- a/test/functional/plugin/zip_spec.lua +++ b/test/functional/plugin/zip_spec.lua @@ -271,6 +271,18 @@ describe('nvim.zip', function() end end) + it('keeps a leading dash in a member from becoming a backend option', function() + local archive = vim.fs.joinpath(root, 'poc.zip') + copy_fixture(vim.fs.joinpath(old_samples, 'poc.zip'), archive) + clear_zip() + + edit(archive) + eq({ '-d/', 'pwned' }, lines()) + + edit(('zipfile://%s::-d/tmp'):format(archive)) + eq({ '' }, lines()) + end) + it('treats archive glob characters literally', function() t.skip(t.is_os('win'), 'N/A: Windows filenames cannot contain these characters') local archive = vim.fs.joinpath(root, 'archive::[*?].zip')