diff options
author | Your Name <you@example.com> | 2014-06-06 18:23:28 +0200 |
---|---|---|
committer | Patrick Totzke <patricktotzke@gmail.com> | 2014-08-02 17:36:45 +0200 |
commit | c02fbc1ce0da5d048c3aafee9271c014c12a38a7 (patch) | |
tree | 5a15d70e7fe48c85f3f162012aed6c519cdb8011 /alot/widgets | |
parent | d9d957b4045752f631779d83b8afa688d4b18893 (diff) |
Add some basic Emacs keybindings in CompleteEdit
Diffstat (limited to 'alot/widgets')
-rw-r--r-- | alot/widgets/globals.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/alot/widgets/globals.py b/alot/widgets/globals.py index 62929303..9abbb291 100644 --- a/alot/widgets/globals.py +++ b/alot/widgets/globals.py @@ -6,6 +6,8 @@ This contains alot-specific :class:`urwid.Widget` used in more than one mode. """ import urwid +import re +import operator from alot.helper import string_decode from alot.settings import settings @@ -162,11 +164,53 @@ class CompleteEdit(urwid.Edit): self.set_edit_pos(0) elif key == 'ctrl e': self.set_edit_pos(len(self.edit_text)) + elif key == 'ctrl f': + self.set_edit_pos(min(self.edit_pos+1, len(self.edit_text))) + elif key == 'ctrl b': + self.set_edit_pos(max(self.edit_pos-1, 0)) + elif key == 'ctrl k': + self.edit_text = self.edit_text[:self.edit_pos] + elif key == 'ctrl d': + self.edit_text = (self.edit_text[:self.edit_pos] + + self.edit_text[self.edit_pos+1:]) + elif key == 'meta f': + self.move_to_next_word(forward=True) + elif key == 'meta b': + self.move_to_next_word(forward=False) + elif key == 'meta d': + start_pos = self.edit_pos + end_pos = self.move_to_next_word(forward=True) + if end_pos != None: + self.edit_text = (self.edit_text[:start_pos] + + self.edit_text[end_pos:]) + self.set_edit_pos(start_pos) + elif key == 'meta backspace': + end_pos = self.edit_pos + start_pos = self.move_to_next_word(forward=False) + if start_pos != None: + self.edit_text = (self.edit_text[:start_pos] + + self.edit_text[end_pos:]) + self.set_edit_pos(start_pos) else: result = urwid.Edit.keypress(self, size, key) self.completions = None return result + def move_to_next_word(self, forward=True): + if forward: + match_iterator = re.finditer(r'(\b\W+|$)', self.edit_text, + flags=re.UNICODE) + match_positions = [m.start() for m in match_iterator] + op = operator.gt + else: + match_iterator = re.finditer(r'(\w+\b|^)', self.edit_text, + flags=re.UNICODE) + match_positions = reversed([m.start() for m in match_iterator]) + op = operator.lt + for pos in match_positions: + if op(pos, self.edit_pos): + self.set_edit_pos(pos) + return pos class HeadersList(urwid.WidgetWrap): """ renders a pile of header values as key/value list """ |