commit 00c2e7d89c282db40551918a73900e1e17e0de56
parent 1e81b540754286fdd50446649aa74e71302bc960
Author: Jan Edmund Lazo <jan.lazo@mail.utoronto.ca>
Date: Mon, 14 Jul 2025 01:07:31 -0400
vim-patch:8.1.1526: no numerical value for the patchlevel
Problem: No numerical value for the patchlevel.
Solution: Add v:versionlong.
https://github.com/vim/vim/commit/37df9a4401f6737d6216306ea77a7e080c942aea
Restore "highest_patch()" solely for "v:versionlong".
Copy/paste Test_vvar_scriptversion2() from patch 9.1.1540.
It works without ":scriptversion 2".
In general, if Vim's test works with ":scriptversion 1", just port it
for additional coverage.
---
vim-patch:8.1.1565: MS-Windows: no sound support
Problem: MS-Windows: no sound support.
Solution: Add sound support for MS-Windows. (Yasuhiro Matsumoto, Ken Takata,
closes vim/vim#4522)
https://github.com/vim/vim/commit/9b283523f2f75b45feef902b8713808e883d9c19
----
"sound" feature is N/A now but this updates "v:versionlong" docs.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat:
8 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/runtime/doc/vimeval.txt b/runtime/doc/vimeval.txt
@@ -2116,7 +2116,6 @@ text...
# Number
* Funcref
-
:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795*
Remove the internal variable {name}. Several variable
names can be given, they are all removed. The name
diff --git a/runtime/doc/vvars.txt b/runtime/doc/vvars.txt
@@ -727,6 +727,19 @@ v:version
:if has("nvim-0.2.1")
<
+ *v:versionlong* *versionlong-variable*
+v:versionlong
+ Like v:version, but also including the patchlevel in the last
+ four digits. Version 8.1 with patch 123 has value 8010123.
+ This can be used like this: >
+ if v:versionlong >= 8010123
+<
+ However, if there are gaps in the list of patches included
+ this will not work well. This can happen if a recent patch
+ was included into an older version, e.g. for a security fix.
+ Use the has() function to make sure the patch is actually
+ included.
+
*v:vim_did_enter* *vim_did_enter-variable*
v:vim_did_enter
0 during startup, 1 just before |VimEnter|.
diff --git a/runtime/lua/vim/_meta/vvars.lua b/runtime/lua/vim/_meta/vvars.lua
@@ -772,6 +772,21 @@ vim.v.val = ...
--- @type integer
vim.v.version = ...
+--- Like v:version, but also including the patchlevel in the last
+--- four digits. Version 8.1 with patch 123 has value 8010123.
+--- This can be used like this:
+--- ```
+--- if v:versionlong >= 8010123
+--- ```
+---
+--- However, if there are gaps in the list of patches included
+--- this will not work well. This can happen if a recent patch
+--- was included into an older version, e.g. for a security fix.
+--- Use the has() function to make sure the patch is actually
+--- included.
+--- @type integer
+vim.v.versionlong = ...
+
--- 0 during startup, 1 just before `VimEnter`.
--- Read-only.
--- @type integer
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
@@ -266,6 +266,7 @@ static struct vimvar {
VV(VV_TYPE_BOOL, "t_bool", VAR_NUMBER, VV_RO),
VV(VV_TYPE_BLOB, "t_blob", VAR_NUMBER, VV_RO),
VV(VV_EVENT, "event", VAR_DICT, VV_RO),
+ VV(VV_VERSIONLONG, "versionlong", VAR_NUMBER, VV_RO),
VV(VV_ECHOSPACE, "echospace", VAR_NUMBER, VV_RO),
VV(VV_ARGV, "argv", VAR_LIST, VV_RO),
VV(VV_COLLATE, "collate", VAR_STRING, VV_RO),
@@ -433,6 +434,7 @@ void eval_init(void)
}
}
vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
+ vimvars[VV_VERSIONLONG].vv_nr = VIM_VERSION_100 * 10000 + highest_patch();
dict_T *const msgpack_types_dict = tv_dict_alloc();
for (size_t i = 0; i < ARRAY_SIZE(msgpack_type_names); i++) {
diff --git a/src/nvim/eval.h b/src/nvim/eval.h
@@ -162,6 +162,7 @@ typedef enum {
VV_TYPE_BOOL,
VV_TYPE_BLOB,
VV_EVENT,
+ VV_VERSIONLONG,
VV_ECHOSPACE,
VV_ARGV,
VV_COLLATE,
diff --git a/src/nvim/version.c b/src/nvim/version.c
@@ -2528,6 +2528,12 @@ bool has_nvim_version(const char *const version_str)
&& patch <= NVIM_VERSION_PATCH))));
}
+int highest_patch(void)
+{
+ // this relies on the highest patch number to be the first entry
+ return included_patches[0];
+}
+
/// Checks whether a Vim patch has been included.
///
/// @param n Patch number.
diff --git a/src/nvim/vvars.lua b/src/nvim/vvars.lua
@@ -878,6 +878,21 @@ M.vars = {
<
]=],
},
+ versionlong = {
+ type = 'integer',
+ desc = [=[
+ Like v:version, but also including the patchlevel in the last
+ four digits. Version 8.1 with patch 123 has value 8010123.
+ This can be used like this: >
+ if v:versionlong >= 8010123
+ <
+ However, if there are gaps in the list of patches included
+ this will not work well. This can happen if a recent patch
+ was included into an older version, e.g. for a security fix.
+ Use the has() function to make sure the patch is actually
+ included.
+ ]=],
+ },
vim_did_enter = {
type = 'integer',
desc = [=[
diff --git a/test/old/testdir/test_eval_stuff.vim b/test/old/testdir/test_eval_stuff.vim
@@ -272,6 +272,17 @@ func Test_string_concat_scriptversion1()
endif
endfunc
+" scriptversion 2
+func Test_vvar_scriptversion2()
+ call assert_true(exists('version'))
+ echo version
+ call assert_fails('let version = 1', 'E46:')
+ call assert_equal(v:version, version)
+
+ call assert_equal(v:version, v:versionlong / 10000)
+ call assert_true(v:versionlong > 8011525)
+endfunc
+
" scriptversion 1
func Test_vvar_scriptversion1()
call assert_equal(15, 017)