diff options
author | Patrick Totzke <patricktotzke@gmail.com> | 2012-09-22 10:31:10 +0100 |
---|---|---|
committer | Patrick Totzke <patricktotzke@gmail.com> | 2012-09-22 10:31:10 +0100 |
commit | 436d656ec82a5cca5e4a2e283d9621c5378e34b3 (patch) | |
tree | b525e3537f3802e87fbcaceb521d15f43337e1b0 | |
parent | a2b9e2262a9a69bdd1d2db8b197fcea7d20cb265 (diff) | |
parent | cd049ac737157392956dc5c4c097f513a08f5635 (diff) |
Merge branch '0.3.3-feature-from-completion-521'
-rw-r--r-- | alot/commands/globals.py | 7 | ||||
-rw-r--r-- | alot/completion.py | 45 | ||||
-rw-r--r-- | alot/defaults/default.bindings | 1 |
3 files changed, 34 insertions, 19 deletions
diff --git a/alot/commands/globals.py b/alot/commands/globals.py index 3f57faa4..5ff72c7f 100644 --- a/alot/commands/globals.py +++ b/alot/commands/globals.py @@ -668,12 +668,7 @@ class ComposeCommand(Command): if fromaddress is None: ui.notify('canceled') return - a = settings.get_account_by_address(fromaddress) - if a is not None: - fromstring = "%s <%s>" % (a.realname, a.address) - self.envelope.add('From', fromstring) - else: - self.envelope.add('From', fromaddress) + self.envelope.add('From', fromaddress) # add signature if not self.omit_signature: diff --git a/alot/completion.py b/alot/completion.py index 647266e1..c3bc60d6 100644 --- a/alot/completion.py +++ b/alot/completion.py @@ -45,16 +45,27 @@ class Completer(object): class StringlistCompleter(Completer): """completer for a fixed list of strings""" - def __init__(self, resultlist): + def __init__(self, resultlist, ignorecase=True, match_anywhere=False): """ :param resultlist: strings used for completion :type resultlist: list of str + :param liberal: match case insensitive and not prefix-only + :type liberal: bool """ self.resultlist = resultlist + self.flags = re.IGNORECASE if ignorecase else 0 + self.match_anywhere = match_anywhere def complete(self, original, pos): pref = original[:pos] - return [(a, len(a)) for a in self.resultlist if a.startswith(pref)] + + re_prefix = '.*' if self.match_anywhere else '' + + def match(s, m): + r = re_prefix + m + '.*' + return re.match(r, s, flags=self.flags) is not None + + return [(a, len(a)) for a in self.resultlist if match(a, pref)] class MultipleSelectionCompleter(Completer): @@ -251,9 +262,11 @@ class ArgparseOptionCompleter(Completer): class AccountCompleter(StringlistCompleter): """completes users' own mailaddresses""" - def __init__(self): - resultlist = settings.get_main_addresses() - StringlistCompleter.__init__(self, resultlist) + def __init__(self, **kwargs): + accounts = settings.get_accounts() + resultlist = ["%s <%s>" % (a.realname, a.address) for a in accounts] + StringlistCompleter.__init__(self, resultlist, match_anywhere=True, + **kwargs) class CommandNameCompleter(Completer): @@ -299,6 +312,7 @@ class CommandCompleter(Completer): abooks = settings.get_addressbooks() self._contactscompleter = ContactsCompleter(abooks) self._pathcompleter = PathCompleter() + self._accountscompleter = AccountCompleter() def complete(self, line, pos): # remember how many preceding space characters we see until the command @@ -367,7 +381,7 @@ class CommandCompleter(Completer): plist = params.split(' ', 1) if len(plist) == 1: # complete from header keys localprefix = params - headers = ['Subject', 'To', 'Cc', 'Bcc', 'In-Reply-To'] + headers = ['Subject', 'To', 'Cc', 'Bcc', 'In-Reply-To', 'From'] localcompleter = StringlistCompleter(headers) localres = localcompleter.complete(localprefix, localpos) res = [(c, p + 6) for (c, p) in localres] @@ -375,14 +389,19 @@ class CommandCompleter(Completer): header, params = plist localpos = localpos - (len(header) + 1) if header.lower() in ['to', 'cc', 'bcc']: + res = self._contactscompleter.complete(params, + localpos) + elif header.lower() == 'from': + res = self._accountscompleter.complete(params, + localpos) + + # prepend 'set ' + header and correct position + def f((completed, pos)): + return ('%s %s' % (header, completed), + pos + len(header) + 1) + res = map(f, res) + logging.debug(res) - # prepend 'set ' + header and correct position - def f((completed, pos)): - return ('%s %s' % (header, completed), - pos + len(header) + 1) - res = map(f, - self._contactscompleter.complete(params, - localpos)) elif self.mode == 'envelope' and cmd == 'unset': plist = params.split(' ', 1) if len(plist) == 1: # complete from header keys diff --git a/alot/defaults/default.bindings b/alot/defaults/default.bindings index 3ccb3e2b..b565eb5f 100644 --- a/alot/defaults/default.bindings +++ b/alot/defaults/default.bindings @@ -40,6 +40,7 @@ q = exit y = send P = save s = 'refine Subject' + f = prompt 'set From ' t = 'refine To' b = 'refine Bcc' c = 'refine Cc' |