mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Problem: Lua: cannot use table.insert() and table.remove(). Solution: Add the list functions. (Prabir Shrestha, closes #6353)
This commit is contained in:
parent
b7a78f7a67
commit
a1f9f8666e
@ -227,8 +227,17 @@ Properties
|
|||||||
in Vim.
|
in Vim.
|
||||||
o "l[k]" returns the k-th item in "l"; "l" is one-indexed, as in Lua.
|
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". Item can
|
||||||
|
be added to the end of the list by "l[#l + 1] = newitem"
|
||||||
o "l()" returns an iterator for "l".
|
o "l()" returns an iterator for "l".
|
||||||
|
o "table.insert(l, newitem)" inserts an item at the end of the list.
|
||||||
|
(only Lua 5.3 and later)
|
||||||
|
o "table.insert(l, position, newitem)" inserts an item at the
|
||||||
|
specified position. "position" is one-indexed. (only Lua 5.3 and
|
||||||
|
later)
|
||||||
|
o "table.remove(l, position)" removes an item at the specified
|
||||||
|
position. "position" is one-indexed.
|
||||||
|
|
||||||
|
|
||||||
Methods
|
Methods
|
||||||
-------
|
-------
|
||||||
@ -246,8 +255,11 @@ Examples:
|
|||||||
:lua l[1] = 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[1], l[2])
|
:lua print(l, #l, l[1], l[2])
|
||||||
|
:lua l[#l + 1] = 'value'
|
||||||
|
:lua table.insert(l, 100)
|
||||||
|
:lua table.insert(l, 2, 200)
|
||||||
|
:lua table.remove(l, 1)
|
||||||
:lua for item in l() do print(item) end
|
:lua for item in l() do print(item) end
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
4. Dict userdata *lua-dict*
|
4. Dict userdata *lua-dict*
|
||||||
|
15
src/if_lua.c
15
src/if_lua.c
@ -913,7 +913,19 @@ luaV_list_newindex(lua_State *L)
|
|||||||
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);
|
||||||
if (li == NULL) return 0;
|
if (li == NULL)
|
||||||
|
{
|
||||||
|
if (!lua_isnil(L, 3))
|
||||||
|
{
|
||||||
|
typval_T v;
|
||||||
|
luaV_checktypval(L, 3, &v, "inserting list item");
|
||||||
|
if (list_insert_tv(l, &v, li) == FAIL)
|
||||||
|
luaL_error(L, "failed to add item to list");
|
||||||
|
clear_tv(&v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (lua_isnil(L, 3)) // remove?
|
if (lua_isnil(L, 3)) // remove?
|
||||||
{
|
{
|
||||||
vimlist_remove(l, li, li);
|
vimlist_remove(l, li, li);
|
||||||
@ -927,6 +939,7 @@ luaV_list_newindex(lua_State *L)
|
|||||||
copy_tv(&v, &li->li_tv);
|
copy_tv(&v, &li->li_tv);
|
||||||
clear_tv(&v);
|
clear_tv(&v);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,6 +353,32 @@ func Test_lua_list_table()
|
|||||||
call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
|
call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_lua_list_table_insert_remove()
|
||||||
|
let luaver = split(split(luaeval('_VERSION'), ' ')[1], '\.')
|
||||||
|
let major = str2nr(luaver[0])
|
||||||
|
let minor = str2nr(luaver[1])
|
||||||
|
|
||||||
|
if major < 5 || (major == 5 && minor < 3)
|
||||||
|
throw 'Skipped: Lua version < 5.3'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l = [1, 2]
|
||||||
|
lua t = vim.eval('l')
|
||||||
|
lua table.insert(t, 10)
|
||||||
|
lua t[#t + 1] = 20
|
||||||
|
lua table.insert(t, 2, 30)
|
||||||
|
call assert_equal(l, [1, 30, 2, 10, 20])
|
||||||
|
lua table.remove(t, 2)
|
||||||
|
call assert_equal(l, [1, 2, 10, 20])
|
||||||
|
lua t[3] = nil
|
||||||
|
call assert_equal(l, [1, 2, 20])
|
||||||
|
lua removed_value = table.remove(t, 3)
|
||||||
|
call assert_equal(luaeval('removed_value'), 20)
|
||||||
|
lua t = nil
|
||||||
|
lua removed_value = nil
|
||||||
|
unlet l
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test l() i.e. iterator on list
|
" Test l() i.e. iterator on list
|
||||||
func Test_lua_list_iter()
|
func Test_lua_list_iter()
|
||||||
lua l = vim.list():add('foo'):add('bar')
|
lua l = vim.list():add('foo'):add('bar')
|
||||||
|
@ -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 */
|
||||||
|
/**/
|
||||||
|
1081,
|
||||||
/**/
|
/**/
|
||||||
1080,
|
1080,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user