set_bindings can now update or replace existing bindings

This commit is contained in:
woorst
2017-07-19 18:24:04 -05:00
parent 47239b9bca
commit f43a4894fb
3 changed files with 18 additions and 13 deletions

View File

@@ -642,15 +642,17 @@ class KeyMap(object):
self._keymap = None
self.set_bindings(bindings)
def set_bindings(self, bindings):
# Clear the keymap before applying the bindings to avoid confusion.
# If a user defines custom bindings in their config file, they must
# explicitly define ALL of the bindings.
self._keymap = {}
def set_bindings(self, bindings, mode='update'):
new_keymap = {}
for command, keys in bindings.items():
if not isinstance(command, Command):
command = Command(command)
self._keymap[command] = keys
new_keymap[command] = keys
if not self._keymap or mode == 'replace':
self._keymap = new_keymap
elif mode == 'update':
self._keymap.update(new_keymap)
def get(self, command):
if not isinstance(command, Command):

View File

@@ -136,7 +136,7 @@ def test_config_from_file():
fargs, fbindings = Config.get_file(filename=fp.name)
config = Config(**fargs)
config.keymap.set_bindings(fbindings)
config.keymap.set_bindings(fbindings, 'replace')
assert config.config == {}
assert config.keymap._keymap == {}
@@ -153,7 +153,7 @@ def test_config_from_file():
fp.flush()
fargs, fbindings = Config.get_file(filename=fp.name)
config.update(**fargs)
config.keymap.set_bindings(fbindings)
config.keymap.set_bindings(fbindings, 'replace')
assert config.config == args
assert config.keymap.get('REFRESH') == ['r', '<KEY_F5>']
assert config.keymap.get('UPVOTE') == ['']

View File

@@ -370,13 +370,16 @@ def test_objects_keymap():
keymap.get('downvote')
assert 'DOWNVOTE' in six.text_type(e)
# Updating the bindings wipes out the old ones
bindings = {'refresh': ['a', 0x12, '<LF>', '<KEY_UP>']}
keymap.set_bindings(bindings)
bindings2 = {'upvote': ['b', 0x13, '<KEY_DOWN>']}
keymap.set_bindings(bindings, 'replace')
assert keymap.get('refresh')
with pytest.raises(exceptions.ConfigError) as e:
keymap.get('upvote')
assert 'UPVOTE' in six.text_type(e)
keymap.set_bindings(bindings2, 'update')
assert keymap.get('refresh')
assert keymap.get('upvote')
# Strings should be parsed correctly into keys
assert KeyMap.parse('a') == 97