From e05dabefdf3e156bae0953686d92bb27ad814ba3 Mon Sep 17 00:00:00 2001 From: Panagiotis Ktistakis Date: Sun, 26 Nov 2017 13:34:18 +0200 Subject: [PATCH 1/2] Show default keybinding in :bind completion --- qutebrowser/completion/models/configmodel.py | 17 +++++++++++++---- qutebrowser/config/config.py | 7 +++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/qutebrowser/completion/models/configmodel.py b/qutebrowser/completion/models/configmodel.py index f1d706cd5..53a2adc19 100644 --- a/qutebrowser/completion/models/configmodel.py +++ b/qutebrowser/completion/models/configmodel.py @@ -77,17 +77,26 @@ def bind(key, *, info): key: the key being bound. """ model = completionmodel.CompletionModel(column_widths=(20, 60, 20)) - cmd_text = info.keyconf.get_command(key, 'normal') + data = [] + cmd_text = info.keyconf.get_command(key, 'normal') if cmd_text: parser = runners.CommandParser() try: cmd = parser.parse(cmd_text).cmd except cmdexc.NoSuchCommandError: - data = [(cmd_text, 'Invalid command!', key)] + data.append((cmd_text, '(Current) Invalid command!', key)) else: - data = [(cmd_text, cmd.desc, key)] - model.add_category(listcategory.ListCategory("Current", data)) + data.append((cmd_text, '(Current) {}'.format(cmd.desc), key)) + + cmd_text = info.keyconf.get_command(key, 'normal', default=True) + if cmd_text: + parser = runners.CommandParser() + cmd = parser.parse(cmd_text).cmd + data.append((cmd_text, '(Default) {}'.format(cmd.desc), key)) + + if data: + model.add_category(listcategory.ListCategory("Current/Default", data)) cmdlist = util.get_cmd_completions(info, include_hidden=True, include_aliases=True) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index ff09e2a5b..770546df6 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -162,10 +162,13 @@ class KeyConfig: cmd_to_keys[cmd].insert(0, key) return cmd_to_keys - def get_command(self, key, mode): + def get_command(self, key, mode, default=False): """Get the command for a given key (or None).""" key = self._prepare(key, mode) - bindings = self.get_bindings_for(mode) + if default: + bindings = dict(val.bindings.default[mode]) + else: + bindings = self.get_bindings_for(mode) return bindings.get(key, None) def bind(self, key, command, *, mode, save_yaml=False): From 2bb8d404d28cbc628b9f7828a57f6dd648ea38f9 Mon Sep 17 00:00:00 2001 From: Panagiotis Ktistakis Date: Sun, 26 Nov 2017 14:07:41 +0200 Subject: [PATCH 2/2] Adjust :bind completion tests --- tests/unit/completion/test_models.py | 62 +++++++++++++++++++++------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/tests/unit/completion/test_models.py b/tests/unit/completion/test_models.py index 5276ffd2a..e07c1949c 100644 --- a/tests/unit/completion/test_models.py +++ b/tests/unit/completion/test_models.py @@ -73,6 +73,9 @@ def cmdutils_stub(monkeypatch, stubs): name='scroll', desc='Scroll the current tab in the given direction.', modes=()), + 'tab-close': stubs.FakeCommand( + name='tab-close', + desc='Close the current tab.'), }) @@ -101,9 +104,10 @@ def configdata_stub(monkeypatch, configdata_init): ), ), default={ - 'normal': { - '': 'quit' - } + 'normal': collections.OrderedDict([ + ('', 'quit'), + ('d', 'tab-close'), + ]) }, backends=[], raw_backends=None)), @@ -122,6 +126,7 @@ def configdata_stub(monkeypatch, configdata_init): ('', 'quit'), ('ZQ', 'quit'), ('I', 'invalid'), + ('d', 'scroll down'), ]) }, backends=[], @@ -209,6 +214,7 @@ def test_command_completion(qtmodeltester, cmdutils_stub, configdata_stub, ('open', 'open a url', ''), ('q', "Alias for 'quit'", ''), ('quit', 'quit qutebrowser', 'ZQ, '), + ('tab-close', 'Close the current tab.', ''), ] }) @@ -233,7 +239,8 @@ def test_help_completion(qtmodeltester, cmdutils_stub, key_config_stub, "Commands": [ (':open', 'open a url', ''), (':quit', 'quit qutebrowser', 'ZQ, '), - (':scroll', 'Scroll the current tab in the given direction.', '') + (':scroll', 'Scroll the current tab in the given direction.', ''), + (':tab-close', 'Close the current tab.', ''), ], "Settings": [ ('aliases', 'Aliases for commands.', None), @@ -566,9 +573,9 @@ def test_setting_option_completion(qtmodeltester, config_stub, ('aliases', 'Aliases for commands.', '{"q": "quit"}'), ('bindings.commands', 'Default keybindings', '{"normal": {"": "quit", "ZQ": "quit", ' - '"I": "invalid"}}'), + '"I": "invalid", "d": "scroll down"}}'), ('bindings.default', 'Default keybindings', - '{"normal": {"": "quit"}}'), + '{"normal": {"": "quit", "d": "tab-close"}}'), ] }) @@ -589,14 +596,15 @@ def test_bind_completion(qtmodeltester, cmdutils_stub, config_stub, qtmodeltester.check(model) _check_completions(model, { - "Current": [ - ('quit', 'quit qutebrowser', 'ZQ'), + "Current/Default": [ + ('quit', '(Current) quit qutebrowser', 'ZQ'), ], "Commands": [ ('open', 'open a url', ''), ('q', "Alias for 'quit'", ''), ('quit', 'quit qutebrowser', 'ZQ, '), - ('scroll', 'Scroll the current tab in the given direction.', '') + ('scroll', 'Scroll the current tab in the given direction.', ''), + ('tab-close', 'Close the current tab.', ''), ], }) @@ -608,21 +616,22 @@ def test_bind_completion_invalid(cmdutils_stub, config_stub, key_config_stub, model.set_pattern('') _check_completions(model, { - "Current": [ - ('invalid', 'Invalid command!', 'I'), + "Current/Default": [ + ('invalid', '(Current) Invalid command!', 'I'), ], "Commands": [ ('open', 'open a url', ''), ('q', "Alias for 'quit'", ''), ('quit', 'quit qutebrowser', 'ZQ, '), - ('scroll', 'Scroll the current tab in the given direction.', '') + ('scroll', 'Scroll the current tab in the given direction.', ''), + ('tab-close', 'Close the current tab.', ''), ], }) -def test_bind_completion_no_current(qtmodeltester, cmdutils_stub, config_stub, +def test_bind_completion_no_binding(qtmodeltester, cmdutils_stub, config_stub, key_config_stub, configdata_stub, info): - """Test keybinding completion with no current binding.""" + """Test keybinding completion with no current or default binding.""" model = configmodel.bind('x', info=info) model.set_pattern('') qtmodeltester.data_display_may_return_none = True @@ -633,7 +642,30 @@ def test_bind_completion_no_current(qtmodeltester, cmdutils_stub, config_stub, ('open', 'open a url', ''), ('q', "Alias for 'quit'", ''), ('quit', 'quit qutebrowser', 'ZQ, '), - ('scroll', 'Scroll the current tab in the given direction.', '') + ('scroll', 'Scroll the current tab in the given direction.', ''), + ('tab-close', 'Close the current tab.', ''), + ], + }) + + +def test_bind_completion_changed(cmdutils_stub, config_stub, key_config_stub, + configdata_stub, info): + """Test command completion with a non-default command bound.""" + model = configmodel.bind('d', info=info) + model.set_pattern('') + + _check_completions(model, { + "Current/Default": [ + ('scroll down', + '(Current) Scroll the current tab in the given direction.', 'd'), + ('tab-close', '(Default) Close the current tab.', 'd'), + ], + "Commands": [ + ('open', 'open a url', ''), + ('q', "Alias for 'quit'", ''), + ('quit', 'quit qutebrowser', 'ZQ, '), + ('scroll', 'Scroll the current tab in the given direction.', ''), + ('tab-close', 'Close the current tab.', ''), ], })