diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 0239fe6c5..515d17a19 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -90,6 +90,8 @@ Fixed already worked before) - The command completion now updates correctly when changing aliases - `:undo` now doesn't undo tabs "closed" by `:tab-detach` anymore. +- Fixed an issue with hint chars not being cleared correctly when leaving hint + mode. v0.8.3 (unreleased) ------------------- diff --git a/README.asciidoc b/README.asciidoc index 11bac4605..c9f0e2639 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -145,10 +145,10 @@ Contributors, sorted by the number of commits in descending order: * Antoni Boucher * Lamar Pavel * Bruno Oliveira +* Jakub Klinkovský * Jan Verbeek * Alexander Cogneau * Marshall Lochbaum -* Jakub Klinkovský * Felix Van der Jeugt * Martin Tournoij * Raphael Pierzina diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index b62968904..805557e94 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -1452,7 +1452,7 @@ RETURN_KEYS = ['', '', '', '', '', KEY_DATA = collections.OrderedDict([ ('!normal', collections.OrderedDict([ - ('clear-keychain ;; leave-mode', ['', '']), + ('leave-mode', ['', '']), ])), ('normal', collections.OrderedDict([ @@ -1683,7 +1683,7 @@ CHANGED_KEY_COMMANDS = [ (re.compile(r'^scroll ([-\d]+ [-\d]+)$'), r'scroll-px \1'), (re.compile(r'^search *;; *clear-keychain$'), r'clear-keychain ;; search'), - (re.compile(r'^leave-mode$'), r'clear-keychain ;; leave-mode'), + (re.compile(r'^clear-keychain *;; *leave-mode$'), r'leave-mode'), (re.compile(r'^download-remove --all$'), r'download-clear'), diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py index 887f22515..c549c4b8c 100644 --- a/qutebrowser/keyinput/basekeyparser.py +++ b/qutebrowser/keyinput/basekeyparser.py @@ -193,7 +193,7 @@ class BaseKeyParser(QObject): if match == self.Match.definitive: self._debug_log("Definitive match for '{}'.".format( self._keystring)) - self._keystring = '' + self.clear_keystring() self.execute(binding, self.Type.chain, count) elif match == self.Match.ambiguous: self._debug_log("Ambiguous match for '{}'.".format( @@ -205,7 +205,7 @@ class BaseKeyParser(QObject): elif match == self.Match.none: self._debug_log("Giving up with '{}', no matches".format( self._keystring)) - self._keystring = '' + self.clear_keystring() else: raise AssertionError("Invalid match value {!r}".format(match)) return match @@ -271,7 +271,7 @@ class BaseKeyParser(QObject): time = config.get('input', 'timeout') if time == 0: # execute immediately - self._keystring = '' + self.clear_keystring() self.execute(binding, self.Type.chain, count) else: # execute in `time' ms @@ -289,8 +289,7 @@ class BaseKeyParser(QObject): command/count: As if passed to self.execute() """ self._debug_log("Executing delayed command now!") - self._keystring = '' - self.keystring_updated.emit(self._keystring) + self.clear_keystring() self.execute(command, self.Type.chain, count) def handle(self, e): @@ -307,7 +306,9 @@ class BaseKeyParser(QObject): if handled or not self._supports_chains: return handled match = self._handle_single_key(e) - self.keystring_updated.emit(self._keystring) + # don't emit twice if the keystring was cleared in self.clear_keystring + if self._keystring: + self.keystring_updated.emit(self._keystring) return match != self.Match.none def read_config(self, modename=None): @@ -366,6 +367,8 @@ class BaseKeyParser(QObject): 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) + if self._keystring: + 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 9aa492062..71a83b9a3 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -282,6 +282,9 @@ class ModeManager(QObject): raise NotInModeError("Not in mode {}!".format(mode)) log.modes.debug("Leaving mode {}{}".format( mode, '' if reason is None else ' (reason: {})'.format(reason))) + # leaving a mode implies clearing keychain, see + # https://github.com/The-Compiler/qutebrowser/issues/1805 + self.clear_keychain() self.mode = usertypes.KeyMode.normal self.left.emit(mode, self.mode, self._win_id) diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 6ef44f47d..1fe6dbeec 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -278,7 +278,7 @@ class TestKeyConfigParser: ('search ;; clear-keychain', 'clear-keychain ;; search'), ('search;;clear-keychain', 'clear-keychain ;; search'), ('search;;foo', None), - ('leave-mode', 'clear-keychain ;; leave-mode'), + ('clear-keychain ;; leave-mode', 'leave-mode'), ('leave-mode ;; foo', None), ('download-remove --all', 'download-clear'),