diff options
-rw-r--r-- | src/nvim/menu.c | 10 | ||||
-rw-r--r-- | test/functional/ex_cmds/menu_spec.lua | 38 |
2 files changed, 45 insertions, 3 deletions
diff --git a/src/nvim/menu.c b/src/nvim/menu.c index a8bf4ee5be..d965de6019 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -1257,11 +1257,15 @@ void ex_emenu(exarg_T *eap) /* Found the menu, so execute. * Use the Insert mode entry when returning to Insert mode. */ - if (restart_edit - && !current_SID - ) { + if (((State & INSERT) || restart_edit) && !current_SID) { mode = (char_u *)"Insert"; idx = MENU_INDEX_INSERT; + } else if (get_real_state() & VISUAL) { + /* Detect real visual mode -- if we are really in visual mode we + * don't need to do any guesswork to figure out what the selection + * is. Just execute the visual binding for the menu. */ + mode = (char_u *)"Visual"; + idx = MENU_INDEX_VISUAL; } else if (eap->addr_count) { pos_T tpos; diff --git a/test/functional/ex_cmds/menu_spec.lua b/test/functional/ex_cmds/menu_spec.lua new file mode 100644 index 0000000000..6af889bf9e --- /dev/null +++ b/test/functional/ex_cmds/menu_spec.lua @@ -0,0 +1,38 @@ +local helpers = require('test.functional.helpers') +local clear, execute, nvim = helpers.clear, helpers.execute, helpers.nvim +local expect = helpers.expect +local feed = helpers.feed +local command = helpers.command + +describe(':emenu', function() + + before_each(function() + clear() + execute('nnoremenu Test.Test inormal<ESC>') + execute('inoremenu Test.Test insert') + execute('vnoremenu Test.Test x') + end) + + it('executes correct bindings in normal mode without using API', function() + execute('emenu Test.Test') + expect('normal') + end) + + it('executes correct bindings in normal mode', function() + command('emenu Test.Test') + expect('normal') + end) + + it('executes correct bindings in insert mode', function() + feed('i') + command('emenu Test.Test') + expect('insert') + end) + + it('executes correct bindings in visual mode', function() + feed('iabcde<ESC>0lvll') + command('emenu Test.Test') + expect('ae') + end) + +end) |