diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 104478c10..c14f23b81 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -685,6 +685,7 @@ How many steps to zoom out. [options="header",width="75%",cols="25%,75%"] |============== |Command|Description +|<>|Clear the currently entered key chain. |<>|Execute the command currently in the commandline. |<>|Go forward in the commandline history. |<>|Go back in the commandline history. @@ -739,6 +740,10 @@ How many steps to zoom out. |<>|Toggle caret selection mode. |<>|Yank the selected text to the clipboard or primary selection. |============== +[[clear-keychain]] +=== clear-keychain +Clear the currently entered key chain. + [[command-accept]] === command-accept Execute the command currently in the commandline. diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index ad269d212..f9b0470c7 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -1143,7 +1143,7 @@ KEY_DATA = collections.OrderedDict([ ])), ('normal', collections.OrderedDict([ - ('search', ['']), + ('search ;; clear-keychain', ['']), ('set-cmd-text -s :open', ['o']), ('set-cmd-text :open {url}', ['go']), ('set-cmd-text -s :open -t', ['O']), @@ -1354,4 +1354,6 @@ CHANGED_KEY_COMMANDS = [ (re.compile(r'^scroll 0 -50$'), r'scroll up'), (re.compile(r'^scroll 50 0$'), r'scroll right'), (re.compile(r'^scroll ([-\d]+ [-\d]+)$'), r'scroll-px \1'), + + (re.compile(r'^search$'), r'search ;; clear-keychain'), ] diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py index 1c2c9ab86..d19e7ad9a 100644 --- a/qutebrowser/keyinput/basekeyparser.py +++ b/qutebrowser/keyinput/basekeyparser.py @@ -165,12 +165,6 @@ class BaseKeyParser(QObject): key = e.key() self._debug_log("Got key: 0x{:x} / text: '{}'".format(key, txt)) - if key == Qt.Key_Escape: - self._debug_log("Escape pressed, discarding '{}'.".format( - self._keystring)) - self._keystring = '' - return self.Match.none - if len(txt) == 1: category = unicodedata.category(txt) is_control_char = (category == 'Cc') @@ -306,6 +300,7 @@ class BaseKeyParser(QObject): True if the event was handled, False otherwise. """ handled = self._handle_special_key(e) + if handled or not self._supports_chains: return handled match = self._handle_single_key(e) @@ -362,3 +357,9 @@ class BaseKeyParser(QObject): "defined!") if mode == self._modename: self.read_config() + + def clear_keystring(self): + """Clear the currently entered key sequence.""" + self._debug_log("discarding keystring '{}'.".format(self._keystring)) + self._keystring = '' + self.keystring_updated.emit(self._keystring) diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index 357a5ffc9..6906a8720 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -317,3 +317,8 @@ class ModeManager(QObject): return self._eventFilter_keypress(event) else: return self._eventFilter_keyrelease(event) + + @cmdutils.register(instance='mode-manager', scope='window', hide=True) + def clear_keychain(self): + """Clear the currently entered key chain.""" + self._parsers[self.mode].clear_keystring()