diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2017-10-31 10:45:06 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-10-31 10:45:06 +0100 |
commit | b67f58b2845aaca68939e973d7d250b74b36bf23 (patch) | |
tree | a8a7d77ed43366a546b153d347ee14e0a071b6a7 | |
parent | 60b1e8ad12376c2aa930e50f119a4a1ca636233d (diff) | |
parent | 59f5eb0065518fffbab6f2ddab2e135f463ac9fc (diff) | |
download | rneovim-b67f58b2845aaca68939e973d7d250b74b36bf23.tar.gz rneovim-b67f58b2845aaca68939e973d7d250b74b36bf23.tar.bz2 rneovim-b67f58b2845aaca68939e973d7d250b74b36bf23.zip |
Merge #7454 'ui: ext_wildmenu'
closes #6168
ref #5686
-rw-r--r-- | runtime/doc/ui.txt | 44 | ||||
-rw-r--r-- | src/nvim/api/ui_events.in.h | 7 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 27 | ||||
-rw-r--r-- | test/functional/ui/tabline_spec.lua | 57 | ||||
-rw-r--r-- | test/functional/ui/wildmode_spec.lua | 97 | ||||
-rw-r--r-- | test/functional/viml/completion_spec.lua | 2 |
6 files changed, 185 insertions, 49 deletions
diff --git a/runtime/doc/ui.txt b/runtime/doc/ui.txt index deac1609c0..3644d0784f 100644 --- a/runtime/doc/ui.txt +++ b/runtime/doc/ui.txt @@ -28,6 +28,7 @@ a dictionary with these (optional) keys: `ext_popupmenu` Externalize the popupmenu. |ui-popupmenu| `ext_tabline` Externalize the tabline. |ui-tabline| `ext_cmdline` Externalize the cmdline. |ui-cmdline| + `ext_wildmenu` Externalize the wildmenu. |ui-ext-wildmenu| Nvim will then send msgpack-rpc notifications, with the method name "redraw" and a single argument, an array of screen update events. @@ -201,21 +202,21 @@ Popupmenu Events *ui-popupmenu* Only sent if `ext_popupmenu` option is set in |ui-options| ["popupmenu_show", items, selected, row, col] - `items` is an array of the items to show, the - items are themselves arrays of the form [word, kind, menu, info] - as defined at |complete-items|, except that `word` is replaced by - `abbr` if present. `selected` is the initially selected item, either a - zero-based index into the array of items, or -1 if no item is - selected. `row` and `col` is the anchor position, where the first - character of the completed word will be. + Show |popupmenu-completion|. `items` is an array of completion items + to show; each item is an array of the form [word, kind, menu, info] as + defined at |complete-items|, except that `word` is replaced by `abbr` + if present. `selected` is the initially-selected item, a zero-based + index into the array of items (-1 if no item is selected). `row` and + `col` give the anchor position, where the first character of the + completed word will be. ["popupmenu_select", selected] - An item in the currently displayed popupmenu is selected. `selected` - is either a zero-based index into the array of items from the last - `popupmenu_show` event, or -1 if no item is selected. + Select an item in the current popupmenu. `selected` is a zero-based + index into the array of items from the last popupmenu_show event, or + -1 if no item is selected. ["popupmenu_hide"] - The popupmenu is hidden. + Hide the popupmenu. ============================================================================== Tabline Events *ui-tabline* @@ -237,7 +238,7 @@ Only sent if `ext_cmdline` option is set in |ui-options| content: List of [attrs, string] [[{}, "t"], [attrs, "est"], ...] - Triggered when the user types in the cmdline. + Triggered when the cmdline is displayed or changed. The `content` is the full content that should be displayed in the cmdline, and the `pos` is the position of the cursor that in the cmdline. The content is divided into chunks with different highlight @@ -265,7 +266,7 @@ Only sent if `ext_cmdline` option is set in |ui-options| `shift` is true the text after the cursor should be shifted, otherwise it should overwrite the char at the cursor. - Should be hidden at next cmdline_pos. + Should be hidden at next cmdline_show or cmdline_pos. ["cmdline_hide"] Hide the cmdline. @@ -287,4 +288,21 @@ Only sent if `ext_cmdline` option is set in |ui-options| Hide the block. ============================================================================== +Wildmenu Events *ui-wildmenu* + +Only sent if `ext_wildmenu` option is set in |ui-options| + +["wildmenu_show", items] + Activate the wildmenu (command-line completion). `items` is an array + with the completion items. + +["wildmenu_select", selected] + Select an item in the current wildmenu. `selected` is a zero-based + index into the array of items from the last wildmenu_show event, or -1 + if no item is selected. + +["wildmenu_hide"] + Hide the wildmenu. + +============================================================================== vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/src/nvim/api/ui_events.in.h b/src/nvim/api/ui_events.in.h index 65357d008a..847b21072a 100644 --- a/src/nvim/api/ui_events.in.h +++ b/src/nvim/api/ui_events.in.h @@ -65,6 +65,7 @@ void popupmenu_hide(void) FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; void popupmenu_select(Integer selected) FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; + void tabline_update(Tabpage current, Array tabs) FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; @@ -84,4 +85,10 @@ void cmdline_block_append(Array lines) void cmdline_block_hide(void) FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; +void wildmenu_show(Array items) + FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; +void wildmenu_select(Integer selected) + FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; +void wildmenu_hide(void) + FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; #endif // NVIM_API_UI_EVENTS_IN_H diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index c9567145e4..27883997e4 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -534,6 +534,9 @@ static int command_line_execute(VimState *state, int key) if (!(s->c == p_wc && KeyTyped) && s->c != p_wcm && s->c != Ctrl_N && s->c != Ctrl_P && s->c != Ctrl_A && s->c != Ctrl_L) { + if (ui_is_external(kUIWildmenu)) { + ui_call_wildmenu_hide(); + } if (s->xpc.xp_numfiles != -1) { (void)ExpandOne(&s->xpc, NULL, NULL, 0, WILD_FREE); } @@ -3515,11 +3518,17 @@ ExpandOne ( else findex = -1; } - if (p_wmnu) - win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files, - findex, cmd_showtail); - if (findex == -1) + if (p_wmnu) { + if (ui_is_external(kUIWildmenu)) { + ui_call_wildmenu_select(findex); + } else { + win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files, + findex, cmd_showtail); + } + } + if (findex == -1) { return vim_strsave(orig_save); + } return vim_strsave(xp->xp_files[findex]); } else return NULL; @@ -3876,6 +3885,15 @@ static int showmatches(expand_T *xp, int wildmenu) showtail = cmd_showtail; } + if (ui_is_external(kUIWildmenu)) { + Array args = ARRAY_DICT_INIT; + for (i = 0; i < num_files; i++) { + ADD(args, STRING_OBJ(cstr_to_string((char *)files_found[i]))); + } + ui_call_wildmenu_show(args); + return EXPAND_OK; + } + if (!wildmenu) { msg_didany = FALSE; /* lines_left will be set */ msg_start(); /* prepare for paging */ @@ -6128,4 +6146,3 @@ static void set_search_match(pos_T *t) coladvance((colnr_T)MAXCOL); } } - diff --git a/test/functional/ui/tabline_spec.lua b/test/functional/ui/tabline_spec.lua index 56331a33b5..e8271de0bf 100644 --- a/test/functional/ui/tabline_spec.lua +++ b/test/functional/ui/tabline_spec.lua @@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local clear, command, eq = helpers.clear, helpers.command, helpers.eq -describe('ui/tabline', function() +describe('ui/ext_tabline', function() local screen local event_tabs, event_curtab @@ -21,37 +21,34 @@ describe('ui/tabline', function() screen:detach() end) - describe('externalized', function() - it('publishes UI events', function() - command("tabedit another-tab") + it('publishes UI events', function() + command("tabedit another-tab") - local expected_tabs = { - {tab = { id = 1 }, name = '[No Name]'}, - {tab = { id = 2 }, name = 'another-tab'}, - } - screen:expect([[ - ^ | - ~ | - ~ | - ~ | - | - ]], nil, nil, function() - eq({ id = 2 }, event_curtab) - eq(expected_tabs, event_tabs) - end) - - command("tabNext") - screen:expect([[ - ^ | - ~ | - ~ | - ~ | - | - ]], nil, nil, function() - eq({ id = 1 }, event_curtab) - eq(expected_tabs, event_tabs) - end) + local expected_tabs = { + {tab = { id = 1 }, name = '[No Name]'}, + {tab = { id = 2 }, name = 'another-tab'}, + } + screen:expect([[ + ^ | + ~ | + ~ | + ~ | + | + ]], nil, nil, function() + eq({ id = 2 }, event_curtab) + eq(expected_tabs, event_tabs) + end) + command("tabNext") + screen:expect([[ + ^ | + ~ | + ~ | + ~ | + | + ]], nil, nil, function() + eq({ id = 1 }, event_curtab) + eq(expected_tabs, event_tabs) end) end) end) diff --git a/test/functional/ui/wildmode_spec.lua b/test/functional/ui/wildmode_spec.lua index 41a751c284..042969357e 100644 --- a/test/functional/ui/wildmode_spec.lua +++ b/test/functional/ui/wildmode_spec.lua @@ -179,3 +179,100 @@ describe('command line completion', function() ]]) end) end) + +describe('ui/ext_wildmenu', function() + local screen + local items, selected = nil, nil + + before_each(function() + clear() + screen = Screen.new(25, 5) + screen:attach({rgb=true, ext_wildmenu=true}) + screen:set_on_event_handler(function(name, data) + if name == "wildmenu_show" then + items = data[1] + elseif name == "wildmenu_select" then + selected = data[1] + elseif name == "wildmenu_hide" then + items, selected = nil, nil + end + end) + end) + + after_each(function() + screen:detach() + end) + + it('works with :sign <tab>', function() + local expected = { + 'define', + 'jump', + 'list', + 'place', + 'undefine', + 'unplace', + } + + command('set wildmode=full') + command('set wildmenu') + feed(':sign <tab>') + screen:expect([[ + | + ~ | + ~ | + ~ | + :sign define^ | + ]], nil, nil, function() + eq(expected, items) + eq(0, selected) + end) + + feed('<tab>') + screen:expect([[ + | + ~ | + ~ | + ~ | + :sign jump^ | + ]], nil, nil, function() + eq(expected, items) + eq(1, selected) + end) + + feed('<left><left>') + screen:expect([[ + | + ~ | + ~ | + ~ | + :sign ^ | + ]], nil, nil, function() + eq(expected, items) + eq(-1, selected) + end) + + feed('<right>') + screen:expect([[ + | + ~ | + ~ | + ~ | + :sign define^ | + ]], nil, nil, function() + eq(expected, items) + eq(0, selected) + end) + + feed('a') + screen:expect([[ + | + ~ | + ~ | + ~ | + :sign definea^ | + ]], nil, nil, function() + eq(nil, items) + eq(nil, selected) + end) + end) +end) diff --git a/test/functional/viml/completion_spec.lua b/test/functional/viml/completion_spec.lua index 0e5278345c..b70ef724b7 100644 --- a/test/functional/viml/completion_spec.lua +++ b/test/functional/viml/completion_spec.lua @@ -868,7 +868,7 @@ describe('completion', function() end) end) -describe('ui/externalized/popupmenu', function() +describe('ui/ext_popupmenu', function() local screen local items, selected, anchor before_each(function() |