aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/eval.txt17
-rw-r--r--src/nvim/menu.c18
-rw-r--r--test/functional/ex_cmds/menu_spec.lua13
3 files changed, 28 insertions, 20 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 425dcede8b..5dc282f6ba 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -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",
diff --git a/src/nvim/menu.c b/src/nvim/menu.c
index 805952f395..aea297fce2 100644
--- a/src/nvim/menu.c
+++ b/src/nvim/menu.c
@@ -735,27 +735,31 @@ 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
/// @return menu if \p name is null, found menu or NULL
-static vimmenu_T* find_menu(vimmenu_T *menu, char_u * name, int modes)
+static vimmenu_T *find_menu(vimmenu_T *menu, char_u *name, int modes)
{
char_u *p;
diff --git a/test/functional/ex_cmds/menu_spec.lua b/test/functional/ex_cmds/menu_spec.lua
index 07a40c7a2c..2309e949c0 100644
--- a/test/functional/ex_cmds/menu_spec.lua
+++ b/test/functional/ex_cmds/menu_spec.lua
@@ -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)