neovim / pynvim

Python client and plugin host for Nvim
http://pynvim.readthedocs.io/en/latest/
Apache License 2.0
1.51k stars 118 forks source link

inconsistent mode behavior in `select` and `insert select` mode #484

Closed pierreganty closed 3 years ago

pierreganty commented 3 years ago

In insert select mode <C-o> alternates between visual and select mode. However, in select mode <C-o> remains in visual mode.

import neovim
n = neovim.attach("child", argv=['/opt/homebrew/bin/nvim', " --clean", "--embed", "--headless"])
n.feedkeys(n.replace_termcodes("i<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'niI', 'blocking': False})), "not in normal mode or is blocked!"
n.feedkeys(n.replace_termcodes("gh"))
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-c>"))
assert ( n.api.get_mode() == dict({'mode': 'n', 'blocking': False})), "not in normal mode or is blocked!"
n.feedkeys(n.replace_termcodes("gh"))
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"))
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
pierreganty commented 3 years ago

I can make it behave correctly using the feedkeys modes.

import neovim
n = neovim.attach("child", argv=['/opt/homebrew/bin/nvim', "--clean", "--embed", "--headless"])
n.feedkeys(n.replace_termcodes("i<C-o>"), 't')
assert ( n.api.get_mode() == dict({'mode': 'niI', 'blocking': False})), "not in normal mode or is blocked!"
n.feedkeys(n.replace_termcodes("gh"), 't')
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 't') 
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 't') 
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 't')
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-\><C-N>"), 't')
assert ( n.api.get_mode() == dict({'mode': 'n', 'blocking': False})), "not in normal mode or is blocked!"
n.feedkeys(n.replace_termcodes("gh"), 't')
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in select mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 't')
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 'xt')
assert ( n.api.get_mode() == dict({'mode': 's', 'blocking': False})), "not in visual mode or is blocked!"
n.feedkeys(n.replace_termcodes("<C-o>"), 't') 
assert ( n.api.get_mode() == dict({'mode': 'v', 'blocking': False})), "not in select mode or is blocked!"