summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Totzke <patricktotzke@gmail.com>2013-01-19 15:22:36 +0000
committerPatrick Totzke <patricktotzke@gmail.com>2013-01-19 15:22:36 +0000
commit6b5f1a8bf68eecf4364f97c71ec177cf715c081e (patch)
tree9ebd2d95a81798ed84711b1d44b5051b48f7663d
parent576b6061a5074e6b6aad03621c5aec787d456c2d (diff)
parent69f0cf8dc4fe860eb5ad9d6f71fbee9b611fca00 (diff)
Merge branch '0.3.3-fix-nowait-547'
-rw-r--r--alot/settings/manager.py6
-rw-r--r--alot/ui.py48
2 files changed, 35 insertions, 19 deletions
diff --git a/alot/settings/manager.py b/alot/settings/manager.py
index 422c8e62..9dfec358 100644
--- a/alot/settings/manager.py
+++ b/alot/settings/manager.py
@@ -309,6 +309,12 @@ class SettingsManager(object):
return self.hooks.__dict__[key]
return None
+ def get_mapped_input_keysequences(self, mode=None, prefix=u''):
+ candidates = self._bindings.scalars
+ if mode is not None:
+ candidates = candidates + self._bindings[mode].scalars
+ return [s for s in candidates if s.startswith(prefix)]
+
def get_keybinding(self, mode, key):
"""look up keybinding from `MODE-maps` sections
diff --git a/alot/ui.py b/alot/ui.py
index 6f6d29ed..f492c2bd 100644
--- a/alot/ui.py
+++ b/alot/ui.py
@@ -120,26 +120,36 @@ class UI(object):
key = keys[0]
self.input_queue.append(key)
keyseq = ' '.join(self.input_queue)
- cmdline = settings.get_keybinding(self.mode, keyseq)
- if cmdline:
+ candidates = settings.get_mapped_input_keysequences(self.mode,
+ prefix=keyseq)
+ if keyseq in candidates:
+ # case: current input queue is a mapped keysequence
+ # get binding and interpret it if non-null
+ cmdline = settings.get_keybinding(self.mode, keyseq)
+ if cmdline:
+ clear()
+ logging.debug("cmdline: '%s'" % cmdline)
+ # move keys are always passed
+ if cmdline.startswith('move '):
+ movecmd = cmdline[5:].rstrip()
+ logging.debug("GOT MOVE: '%s'" % movecmd)
+ if movecmd in ['up', 'down', 'page up', 'page down']:
+ return [movecmd]
+ elif not self._locked:
+ try:
+ self.apply_commandline(cmdline)
+ except CommandParseError, e:
+ self.notify(e.message, priority='error')
+ elif not candidates:
+ # case: no sequence with prefix keyseq is mapped
+ # just clear the input queue
clear()
- logging.debug("cmdline: '%s'" % cmdline)
- # move keys are always passed
- if cmdline.startswith('move '):
- movecmd = cmdline[5:].rstrip()
- logging.debug("GOT MOVE: '%s'" % movecmd)
- if movecmd in ['up', 'down', 'page up', 'page down']:
- return [movecmd]
- elif not self._locked:
- try:
- self.apply_commandline(cmdline)
- except CommandParseError, e:
- self.notify(e.message, priority='error')
-
- timeout = float(settings.get('input_timeout'))
- if self._alarm is not None:
- self.mainloop.remove_alarm(self._alarm)
- self._alarm = self.mainloop.set_alarm_in(timeout, clear)
+ else:
+ # case: some sequences with proper prefix keyseq is mapped
+ timeout = float(settings.get('input_timeout'))
+ if self._alarm is not None:
+ self.mainloop.remove_alarm(self._alarm)
+ self._alarm = self.mainloop.set_alarm_in(timeout, clear)
# update statusbar
self.update()