summaryrefslogtreecommitdiff
path: root/alot/widgets
diff options
context:
space:
mode:
authorYour Name <you@example.com>2014-06-06 18:23:28 +0200
committerPatrick Totzke <patricktotzke@gmail.com>2014-08-02 17:36:45 +0200
commitc02fbc1ce0da5d048c3aafee9271c014c12a38a7 (patch)
tree5a15d70e7fe48c85f3f162012aed6c519cdb8011 /alot/widgets
parentd9d957b4045752f631779d83b8afa688d4b18893 (diff)
Add some basic Emacs keybindings in CompleteEdit
Diffstat (limited to 'alot/widgets')
-rw-r--r--alot/widgets/globals.py44
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 """