mirror of
https://github.com/neovim/neovim.git
synced 2025-09-21 10:48:18 +00:00
menu_get(): fix query behavior
- Return the menu properties, not only its children. - If the {path} param is given, return only the first node. The "next" nodes in the linked-list are irrelevant.
This commit is contained in:
@@ -5666,23 +5666,24 @@ max({expr}) Return the maximum value of all items in {expr}.
|
||||
|
||||
menu_get({path}, {modes}) *menu_get()*
|
||||
Returns a |List| of |Dictionaries| describing |menus| (defined
|
||||
by |:menu|, |:amenu|, etc.).
|
||||
{path} limits the result to a subtree of the menu hierarchy
|
||||
(empty string matches all menus). E.g. to get items in the
|
||||
"File" menu subtree: >
|
||||
by |:menu|, |:amenu|, …), including |hidden-menus|.
|
||||
|
||||
{path} matches a menu by name, or all menus if {path} is an
|
||||
empty string. Example: >
|
||||
:echo menu_get('File','')
|
||||
:echo menu_get('')
|
||||
<
|
||||
{modes} is a string of zero or more modes (see |maparg()| or
|
||||
|creating-menus| for the list of modes). "a" means "all".
|
||||
|
||||
For example: >
|
||||
Example: >
|
||||
nnoremenu &Test.Test inormal
|
||||
inoremenu Test.Test insert
|
||||
vnoremenu Test.Test x
|
||||
echo menu_get("")
|
||||
<
|
||||
returns something like this:
|
||||
>
|
||||
|
||||
< returns something like this: >
|
||||
|
||||
[ {
|
||||
"hidden": 0,
|
||||
"name": "Test",
|
||||
|
@@ -735,22 +735,26 @@ static dict_T *menu_get_recursive(const vimmenu_T *menu, int modes)
|
||||
/// @return false if could not find path_name
|
||||
bool menu_get(char_u *const path_name, int modes, list_T *list)
|
||||
{
|
||||
vimmenu_T *menu;
|
||||
menu = find_menu(root_menu, path_name, modes);
|
||||
vimmenu_T *menu = find_menu(root_menu, path_name, modes);
|
||||
if (!menu) {
|
||||
return false;
|
||||
}
|
||||
for (; menu != NULL; menu = menu->next) {
|
||||
dict_T *dict = menu_get_recursive(menu, modes);
|
||||
if (dict && tv_dict_len(dict) > 0) {
|
||||
tv_list_append_dict(list, dict);
|
||||
dict_T *d = menu_get_recursive(menu, modes);
|
||||
if (d && tv_dict_len(d) > 0) {
|
||||
tv_list_append_dict(list, d);
|
||||
}
|
||||
if (*path_name != NUL) {
|
||||
// If a (non-empty) path query was given, only the first node in the
|
||||
// find_menu() result is relevant. Else we want all nodes.
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// Find menu matching required name and modes
|
||||
/// Find menu matching `name` and `modes`.
|
||||
///
|
||||
/// @param menu top menu to start looking from
|
||||
/// @param name path towards the menu
|
||||
|
@@ -83,7 +83,7 @@ describe('menu_get', function()
|
||||
it("path='', modes='a'", function()
|
||||
local m = funcs.menu_get("","a");
|
||||
-- HINT: To print the expected table and regenerate the tests:
|
||||
-- print(require('pl.pretty').dump(m))
|
||||
-- print(require('inspect')(m))
|
||||
local expected = {
|
||||
{
|
||||
shortcut = "T",
|
||||
@@ -310,8 +310,11 @@ describe('menu_get', function()
|
||||
|
||||
it('matching path, all modes', function()
|
||||
local m = funcs.menu_get("Export", "a")
|
||||
local expected = {
|
||||
{
|
||||
local expected = { {
|
||||
hidden = 0,
|
||||
name = "Export",
|
||||
priority = 500,
|
||||
submenus = { {
|
||||
tooltip = "This is the tooltip",
|
||||
hidden = 0,
|
||||
name = "Script",
|
||||
@@ -325,8 +328,8 @@ describe('menu_get', function()
|
||||
silent = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} }
|
||||
} }
|
||||
eq(expected, m)
|
||||
end)
|
||||
|
||||
|
Reference in New Issue
Block a user