mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.1066: Lua arrays are zero based
Problem: Lua arrays are zero based. Solution: Make Lua arrays one based. (Prabir Shrestha, closes #6347) Note: this is not backwards compatible.
This commit is contained in:
@@ -217,11 +217,15 @@ Vim's syntax for lists. Since lists are objects, changes in list references in
|
|||||||
Lua are reflected in Vim and vice-versa. A list "l" has the following
|
Lua are reflected in Vim and vice-versa. A list "l" has the following
|
||||||
properties and methods:
|
properties and methods:
|
||||||
|
|
||||||
|
NOTE: In patch 8.2.1066 array indexes were changed from zero-based to
|
||||||
|
one-based. You can check with: >
|
||||||
|
if has("patch-8.2.1066")
|
||||||
|
|
||||||
Properties
|
Properties
|
||||||
----------
|
----------
|
||||||
o "#l" is the number of items in list "l", equivalent to "len(l)"
|
o "#l" is the number of items in list "l", equivalent to "len(l)"
|
||||||
in Vim.
|
in Vim.
|
||||||
o "l[k]" returns the k-th item in "l"; "l" is zero-indexed, as in Vim.
|
o "l[k]" returns the k-th item in "l"; "l" is one-indexed, as in Lua.
|
||||||
To modify the k-th item, simply do "l[k] = newitem"; in
|
To modify the k-th item, simply do "l[k] = newitem"; in
|
||||||
particular, "l[k] = nil" removes the k-th item from "l".
|
particular, "l[k] = nil" removes the k-th item from "l".
|
||||||
o "l()" returns an iterator for "l".
|
o "l()" returns an iterator for "l".
|
||||||
@@ -237,11 +241,11 @@ Examples:
|
|||||||
:let l = [1, 'item']
|
:let l = [1, 'item']
|
||||||
:lua l = vim.eval('l') -- same 'l'
|
:lua l = vim.eval('l') -- same 'l'
|
||||||
:lua l:add(vim.list())
|
:lua l:add(vim.list())
|
||||||
:lua l[0] = math.pi
|
:lua l[1] = math.pi
|
||||||
:echo l[0] " 3.141593
|
:echo l[0] " 3.141593
|
||||||
:lua l[0] = nil -- remove first item
|
:lua l[1] = nil -- remove first item
|
||||||
:lua l:insert(true, 1)
|
:lua l:insert(true, 1)
|
||||||
:lua print(l, #l, l[0], l[1], l[-1])
|
:lua print(l, #l, l[1], l[2])
|
||||||
:lua for item in l() do print(item) end
|
:lua for item in l() do print(item) end
|
||||||
<
|
<
|
||||||
|
|
||||||
|
12
src/if_lua.c
12
src/if_lua.c
@@ -871,7 +871,13 @@ luaV_list_index(lua_State *L)
|
|||||||
list_T *l = luaV_unbox(L, luaV_List, 1);
|
list_T *l = luaV_unbox(L, luaV_List, 1);
|
||||||
if (lua_isnumber(L, 2)) // list item?
|
if (lua_isnumber(L, 2)) // list item?
|
||||||
{
|
{
|
||||||
listitem_T *li = list_find(l, (long) luaL_checkinteger(L, 2));
|
long n = (long) luaL_checkinteger(L, 2);
|
||||||
|
listitem_T *li;
|
||||||
|
|
||||||
|
// Lua array index starts with 1 while Vim uses 0, subtract 1 to
|
||||||
|
// normalize.
|
||||||
|
n -= 1;
|
||||||
|
li = list_find(l, n);
|
||||||
if (li == NULL)
|
if (li == NULL)
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
else
|
else
|
||||||
@@ -900,6 +906,10 @@ luaV_list_newindex(lua_State *L)
|
|||||||
list_T *l = luaV_unbox(L, luaV_List, 1);
|
list_T *l = luaV_unbox(L, luaV_List, 1);
|
||||||
long n = (long) luaL_checkinteger(L, 2);
|
long n = (long) luaL_checkinteger(L, 2);
|
||||||
listitem_T *li;
|
listitem_T *li;
|
||||||
|
|
||||||
|
// Lua array index starts with 1 while Vim uses 0, subtract 1 to normalize.
|
||||||
|
n -= 1;
|
||||||
|
|
||||||
if (l->lv_lock)
|
if (l->lv_lock)
|
||||||
luaL_error(L, "list is locked");
|
luaL_error(L, "list is locked");
|
||||||
li = list_find(l, n);
|
li = list_find(l, n);
|
||||||
|
@@ -327,8 +327,8 @@ func Test_lua_list()
|
|||||||
call assert_equal(7, luaeval('#l'))
|
call assert_equal(7, luaeval('#l'))
|
||||||
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
||||||
|
|
||||||
lua l[0] = 124
|
lua l[1] = 124
|
||||||
lua l[5] = nil
|
lua l[6] = nil
|
||||||
lua l:insert('first')
|
lua l:insert('first')
|
||||||
lua l:insert('xx', 3)
|
lua l:insert('xx', 3)
|
||||||
call assert_equal(['first', 124, 'abc', 'xx', v:true, v:false, v:null, {'a': 1, 'b': 2, 'c': 3}], l)
|
call assert_equal(['first', 124, 'abc', 'xx', v:true, v:false, v:null, {'a': 1, 'b': 2, 'c': 3}], l)
|
||||||
@@ -367,22 +367,22 @@ func Test_lua_recursive_list()
|
|||||||
lua l = vim.list():add(1):add(2)
|
lua l = vim.list():add(1):add(2)
|
||||||
lua l = l:add(l)
|
lua l = l:add(l)
|
||||||
|
|
||||||
call assert_equal(1, luaeval('l[0]'))
|
call assert_equal(1, luaeval('l[1]'))
|
||||||
call assert_equal(2, luaeval('l[1]'))
|
call assert_equal(2, luaeval('l[2]'))
|
||||||
|
|
||||||
call assert_equal(1, luaeval('l[2][0]'))
|
call assert_equal(1, luaeval('l[3][1]'))
|
||||||
call assert_equal(2, luaeval('l[2][1]'))
|
call assert_equal(2, luaeval('l[3][2]'))
|
||||||
|
|
||||||
call assert_equal(1, luaeval('l[2][2][0]'))
|
call assert_equal(1, luaeval('l[3][3][1]'))
|
||||||
call assert_equal(2, luaeval('l[2][2][1]'))
|
call assert_equal(2, luaeval('l[3][3][2]'))
|
||||||
|
|
||||||
call assert_equal('[1, 2, [...]]', string(luaeval('l')))
|
call assert_equal('[1, 2, [...]]', string(luaeval('l')))
|
||||||
|
|
||||||
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
||||||
call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
|
call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[3])'))
|
||||||
|
|
||||||
call assert_equal(luaeval('l'), luaeval('l[2]'))
|
call assert_equal(luaeval('l'), luaeval('l[3]'))
|
||||||
call assert_equal(luaeval('l'), luaeval('l[2][2]'))
|
call assert_equal(luaeval('l'), luaeval('l[3][3]'))
|
||||||
|
|
||||||
lua l = nil
|
lua l = nil
|
||||||
endfunc
|
endfunc
|
||||||
|
@@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1066,
|
||||||
/**/
|
/**/
|
||||||
1065,
|
1065,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user