Merge remote-tracking branch 'origin/pr/3336'

This commit is contained in:
Florian Bruhin 2017-11-26 19:35:26 +01:00
commit 38f8cacd2b
3 changed files with 65 additions and 21 deletions

View File

@ -77,17 +77,26 @@ def bind(key, *, info):
key: the key being bound. key: the key being bound.
""" """
model = completionmodel.CompletionModel(column_widths=(20, 60, 20)) 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: if cmd_text:
parser = runners.CommandParser() parser = runners.CommandParser()
try: try:
cmd = parser.parse(cmd_text).cmd cmd = parser.parse(cmd_text).cmd
except cmdexc.NoSuchCommandError: except cmdexc.NoSuchCommandError:
data = [(cmd_text, 'Invalid command!', key)] data.append((cmd_text, '(Current) Invalid command!', key))
else: else:
data = [(cmd_text, cmd.desc, key)] data.append((cmd_text, '(Current) {}'.format(cmd.desc), key))
model.add_category(listcategory.ListCategory("Current", data))
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, cmdlist = util.get_cmd_completions(info, include_hidden=True,
include_aliases=True) include_aliases=True)

View File

@ -162,9 +162,12 @@ class KeyConfig:
cmd_to_keys[cmd].insert(0, key) cmd_to_keys[cmd].insert(0, key)
return cmd_to_keys 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).""" """Get the command for a given key (or None)."""
key = self._prepare(key, mode) key = self._prepare(key, mode)
if default:
bindings = dict(val.bindings.default[mode])
else:
bindings = self.get_bindings_for(mode) bindings = self.get_bindings_for(mode)
return bindings.get(key, None) return bindings.get(key, None)

View File

@ -73,6 +73,9 @@ def cmdutils_stub(monkeypatch, stubs):
name='scroll', name='scroll',
desc='Scroll the current tab in the given direction.', desc='Scroll the current tab in the given direction.',
modes=()), modes=()),
'tab-close': stubs.FakeCommand(
name='tab-close',
desc='Close the current tab.'),
}) })
@ -101,9 +104,10 @@ def configdata_stub(monkeypatch, configdata_init):
), ),
), ),
default={ default={
'normal': { 'normal': collections.OrderedDict([
'<ctrl+q>': 'quit' ('<ctrl+q>', 'quit'),
} ('d', 'tab-close'),
])
}, },
backends=[], backends=[],
raw_backends=None)), raw_backends=None)),
@ -122,6 +126,7 @@ def configdata_stub(monkeypatch, configdata_init):
('<ctrl+q>', 'quit'), ('<ctrl+q>', 'quit'),
('ZQ', 'quit'), ('ZQ', 'quit'),
('I', 'invalid'), ('I', 'invalid'),
('d', 'scroll down'),
]) ])
}, },
backends=[], backends=[],
@ -209,6 +214,7 @@ def test_command_completion(qtmodeltester, cmdutils_stub, configdata_stub,
('open', 'open a url', ''), ('open', 'open a url', ''),
('q', "Alias for 'quit'", ''), ('q', "Alias for 'quit'", ''),
('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'), ('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'),
('tab-close', 'Close the current tab.', ''),
] ]
}) })
@ -233,7 +239,8 @@ def test_help_completion(qtmodeltester, cmdutils_stub, key_config_stub,
"Commands": [ "Commands": [
(':open', 'open a url', ''), (':open', 'open a url', ''),
(':quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'), (':quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'),
(':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": [ "Settings": [
('aliases', 'Aliases for commands.', None), ('aliases', 'Aliases for commands.', None),
@ -566,9 +573,9 @@ def test_setting_option_completion(qtmodeltester, config_stub,
('aliases', 'Aliases for commands.', '{"q": "quit"}'), ('aliases', 'Aliases for commands.', '{"q": "quit"}'),
('bindings.commands', 'Default keybindings', ('bindings.commands', 'Default keybindings',
'{"normal": {"<ctrl+q>": "quit", "ZQ": "quit", ' '{"normal": {"<ctrl+q>": "quit", "ZQ": "quit", '
'"I": "invalid"}}'), '"I": "invalid", "d": "scroll down"}}'),
('bindings.default', 'Default keybindings', ('bindings.default', 'Default keybindings',
'{"normal": {"<ctrl+q>": "quit"}}'), '{"normal": {"<ctrl+q>": "quit", "d": "tab-close"}}'),
] ]
}) })
@ -589,14 +596,15 @@ def test_bind_completion(qtmodeltester, cmdutils_stub, config_stub,
qtmodeltester.check(model) qtmodeltester.check(model)
_check_completions(model, { _check_completions(model, {
"Current": [ "Current/Default": [
('quit', 'quit qutebrowser', 'ZQ'), ('quit', '(Current) quit qutebrowser', 'ZQ'),
], ],
"Commands": [ "Commands": [
('open', 'open a url', ''), ('open', 'open a url', ''),
('q', "Alias for 'quit'", ''), ('q', "Alias for 'quit'", ''),
('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'), ('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'),
('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('') model.set_pattern('')
_check_completions(model, { _check_completions(model, {
"Current": [ "Current/Default": [
('invalid', 'Invalid command!', 'I'), ('invalid', '(Current) Invalid command!', 'I'),
], ],
"Commands": [ "Commands": [
('open', 'open a url', ''), ('open', 'open a url', ''),
('q', "Alias for 'quit'", ''), ('q', "Alias for 'quit'", ''),
('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'), ('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'),
('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): 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 = configmodel.bind('x', info=info)
model.set_pattern('') model.set_pattern('')
qtmodeltester.data_display_may_return_none = True 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', ''), ('open', 'open a url', ''),
('q', "Alias for 'quit'", ''), ('q', "Alias for 'quit'", ''),
('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'), ('quit', 'quit qutebrowser', 'ZQ, <ctrl+q>'),
('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, <ctrl+q>'),
('scroll', 'Scroll the current tab in the given direction.', ''),
('tab-close', 'Close the current tab.', ''),
], ],
}) })