diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt index 54527c5a50..38289dc5d0 100644 --- a/runtime/doc/lua.txt +++ b/runtime/doc/lua.txt @@ -2832,11 +2832,15 @@ range({spec}) *vim.version.range()* } < - `:has()` checks if a version is in the range (inclusive `from` , exclusive `to` ). Example: >lua + `:has()` checks if a version is in the range (inclusive `from`, exclusive + `to`). + + Example: >lua local r = vim.version.range('1.0.0 - 2.0.0') - print(r:has('1.9.9')) -- true - print(r:has('2.0.0')) -- false + print(r:has('1.9.9')) -- true + print(r:has('2.0.0')) -- false + print(r:has(vim.version())) -- check against current Nvim version < Or use cmp(), eq(), lt(), and gt() to compare `.to` and `.from` directly: >lua diff --git a/runtime/lua/vim/version.lua b/runtime/lua/vim/version.lua index ebe8f4e053..d4a3752e37 100644 --- a/runtime/lua/vim/version.lua +++ b/runtime/lua/vim/version.lua @@ -226,8 +226,13 @@ function Range:has(version) if type(version) == 'string' then ---@diagnostic disable-next-line: cast-local-type version = M.parse(version) + else + -- Need metatable to compare versions. + version = setmetatable(vim.deepcopy(version), Version) end if version then + -- Workaround: vim.version() reports "prerelease" as a boolean. + version.prerelease = version.prerelease or nil if version.prerelease ~= self.from.prerelease then return false end @@ -244,11 +249,14 @@ end --- } --- --- ---- `:has()` checks if a version is in the range (inclusive `from`, exclusive `to`). Example: +--- `:has()` checks if a version is in the range (inclusive `from`, exclusive `to`). +--- +--- Example: ---
lua
--- local r = vim.version.range('1.0.0 - 2.0.0')
---- print(r:has('1.9.9')) -- true
---- print(r:has('2.0.0')) -- false
+--- print(r:has('1.9.9')) -- true
+--- print(r:has('2.0.0')) -- false
+--- print(r:has(vim.version())) -- check against current Nvim version
---
---
--- Or use cmp(), eq(), lt(), and gt() to compare `.to` and `.from` directly:
@@ -279,7 +287,7 @@ function M.range(spec) -- Adapted from https://github.com/folke/lazy.nvim
}, { __index = Range })
end
---@type string, string
- local mods, version = spec:lower():match('^([%^=>~]*)(.*)$')
+ local mods, version = spec:lower():match('^([%^=<>~]*)(.*)$')
version = version:gsub('%.[%*x]', '')
local parts = vim.split(version:gsub('%-.*', ''), '.', { plain = true })
if #parts < 3 and mods == '' then
@@ -292,6 +300,11 @@ function M.range(spec) -- Adapted from https://github.com/folke/lazy.nvim
local to = vim.deepcopy(semver)
if mods == '' or mods == '=' then
to.patch = to.patch + 1
+ elseif mods == '<' then
+ from = M._version({})
+ elseif mods == '<=' then
+ from = M._version({})
+ to.patch = to.patch + 1
elseif mods == '>' then
from.patch = from.patch + 1
to = nil ---@diagnostic disable-line: cast-local-type
diff --git a/test/functional/lua/version_spec.lua b/test/functional/lua/version_spec.lua
index 75b62e8318..64dcbec983 100644
--- a/test/functional/lua/version_spec.lua
+++ b/test/functional/lua/version_spec.lua
@@ -40,6 +40,8 @@ describe('version', function()
['=1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 2, 4 } },
['>1.2.3'] = { from = { 1, 2, 4 } },
['>=1.2.3'] = { from = { 1, 2, 3 } },
+ ['<1.2.3'] = { from = { 0, 0, 0 }, to = { 1, 2, 3 } },
+ ['<=1.2.3'] = { from = { 0, 0, 0 }, to = { 1, 2, 4 } },
['~1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 3, 0 } },
['^1.2.3'] = { from = { 1, 2, 3 }, to = { 2, 0, 0 } },
['^0.2.3'] = { from = { 0, 2, 3 }, to = { 0, 3, 0 } },