예제 #1
0
파일: globals.py 프로젝트: t-8ch/alot
    def apply(self, ui):
        logging.debug('HELP')
        if self.commandname == 'bindings':
            text_att = settings.get_theming_attribute('help', 'text')
            title_att = settings.get_theming_attribute('help', 'title')
            section_att = settings.get_theming_attribute('help', 'section')
            # get mappings
            if ui.mode in settings._bindings:
                modemaps = dict(settings._bindings[ui.mode].items())
            else:
                modemaps = {}
            is_scalar = lambda (k, v): k in settings._bindings.scalars
            globalmaps = dict(filter(is_scalar, settings._bindings.items()))

            # build table
            maxkeylength = len(max((modemaps).keys() + globalmaps.keys(),
                                   key=len))
            keycolumnwidth = maxkeylength + 2

            linewidgets = []
            # mode specific maps
            if modemaps:
                linewidgets.append(urwid.Text((section_att,
                                    '\n%s-mode specific maps' % ui.mode)))
                for (k, v) in modemaps.items():
                    line = urwid.Columns([('fixed', keycolumnwidth,
                                           urwid.Text((text_att, k))),
                                          urwid.Text((text_att, v))])
                    linewidgets.append(line)

            # global maps
            linewidgets.append(urwid.Text((section_att, '\nglobal maps')))
            for (k, v) in globalmaps.items():
                if k not in modemaps:
                    line = urwid.Columns(
                        [('fixed', keycolumnwidth, urwid.Text((text_att, k))),
                         urwid.Text((text_att, v))])
                    linewidgets.append(line)

            body = urwid.ListBox(linewidgets)
            ckey = 'cancel'
            titletext = 'Bindings Help (%s cancels)' % ckey

            box = widgets.DialogBox(body, titletext,
                                    bodyattr=text_att,
                                    titleattr=title_att)

            # put promptwidget as overlay on main widget
            overlay = urwid.Overlay(box, ui.mainframe, 'center',
                                    ('relative', 70), 'middle',
                                    ('relative', 70))
            ui.show_as_root_until_keypress(overlay, 'cancel')
        else:
            logging.debug('HELP %s' % self.commandname)
            parser = commands.lookup_parser(self.commandname, ui.mode)
            if parser:
                ui.notify(parser.format_help(), block=True)
            else:
                ui.notify('command not known: %s' % self.commandname,
                          priority='error')
예제 #2
0
파일: globals.py 프로젝트: fagga/alot
    def apply(self, ui):
        logging.debug('HELP')
        if self.commandname == 'bindings':
            text_att = settings.get_theming_attribute('help', 'text')
            title_att = settings.get_theming_attribute('help', 'title')
            section_att = settings.get_theming_attribute('help', 'section')
            # get mappings
            if ui.mode in settings._bindings:
                modemaps = dict(settings._bindings[ui.mode].items())
            else:
                modemaps = {}
            is_scalar = lambda (k, v): k in settings._bindings.scalars
            globalmaps = dict(filter(is_scalar, settings._bindings.items()))

            # build table
            maxkeylength = len(
                max((modemaps).keys() + globalmaps.keys(), key=len))
            keycolumnwidth = maxkeylength + 2

            linewidgets = []
            # mode specific maps
            if modemaps:
                txt = (section_att, '\n%s-mode specific maps' % ui.mode)
                linewidgets.append(urwid.Text(txt))
                for (k, v) in modemaps.items():
                    line = urwid.Columns([('fixed', keycolumnwidth,
                                           urwid.Text((text_att, k))),
                                          urwid.Text((text_att, v))])
                    linewidgets.append(line)

            # global maps
            linewidgets.append(urwid.Text((section_att, '\nglobal maps')))
            for (k, v) in globalmaps.items():
                if k not in modemaps:
                    line = urwid.Columns([('fixed', keycolumnwidth,
                                           urwid.Text((text_att, k))),
                                          urwid.Text((text_att, v))])
                    linewidgets.append(line)

            body = urwid.ListBox(linewidgets)
            titletext = 'Bindings Help (escape cancels)'

            box = DialogBox(body,
                            titletext,
                            bodyattr=text_att,
                            titleattr=title_att)

            # put promptwidget as overlay on main widget
            overlay = urwid.Overlay(box, ui.root_widget, 'center',
                                    ('relative', 70), 'middle',
                                    ('relative', 70))
            ui.show_as_root_until_keypress(overlay, 'esc')
        else:
            logging.debug('HELP %s' % self.commandname)
            parser = commands.lookup_parser(self.commandname, ui.mode)
            if parser:
                ui.notify(parser.format_help(), block=True)
            else:
                ui.notify('command not known: %s' % self.commandname,
                          priority='error')
예제 #3
0
파일: globals.py 프로젝트: kostajh/alot
    def apply(self, ui):
        logging.debug("HELP")
        if self.commandname == "bindings":
            text_att = settings.get_theming_attribute("help", "text")
            title_att = settings.get_theming_attribute("help", "title")
            section_att = settings.get_theming_attribute("help", "section")
            # get mappings
            if ui.mode in settings._bindings:
                modemaps = dict(settings._bindings[ui.mode].items())
            else:
                modemaps = {}
            is_scalar = lambda k_v: k_v[0] in settings._bindings.scalars
            globalmaps = dict(filter(is_scalar, settings._bindings.items()))

            # build table
            maxkeylength = len(max((modemaps).keys() + globalmaps.keys(), key=len))
            keycolumnwidth = maxkeylength + 2

            linewidgets = []
            # mode specific maps
            if modemaps:
                txt = (section_att, "\n%s-mode specific maps" % ui.mode)
                linewidgets.append(urwid.Text(txt))
                for (k, v) in modemaps.items():
                    line = urwid.Columns(
                        [("fixed", keycolumnwidth, urwid.Text((text_att, k))), urwid.Text((text_att, v))]
                    )
                    linewidgets.append(line)

            # global maps
            linewidgets.append(urwid.Text((section_att, "\nglobal maps")))
            for (k, v) in globalmaps.items():
                if k not in modemaps:
                    line = urwid.Columns(
                        [("fixed", keycolumnwidth, urwid.Text((text_att, k))), urwid.Text((text_att, v))]
                    )
                    linewidgets.append(line)

            body = urwid.ListBox(linewidgets)
            titletext = "Bindings Help (escape cancels)"

            box = DialogBox(body, titletext, bodyattr=text_att, titleattr=title_att)

            # put promptwidget as overlay on main widget
            overlay = urwid.Overlay(box, ui.root_widget, "center", ("relative", 70), "middle", ("relative", 70))
            ui.show_as_root_until_keypress(overlay, "esc")
        else:
            logging.debug("HELP %s" % self.commandname)
            parser = commands.lookup_parser(self.commandname, ui.mode)
            if parser:
                ui.notify(parser.format_help(), block=True)
            else:
                ui.notify("command not known: %s" % self.commandname, priority="error")
예제 #4
0
파일: globals.py 프로젝트: tomprince/alot
    def apply(self, ui):
        logging.debug('HELP')
        if self.commandname == 'bindings':
            # get mappings
            modemaps = dict(settings.config.items('%s-maps' % ui.mode))
            globalmaps = dict(settings.config.items('global-maps'))

            # build table
            maxkeylength = len(max((modemaps).keys() + globalmaps.keys(),
                                   key=len))
            keycolumnwidth = maxkeylength + 2

            linewidgets = []
            # mode specific maps
            linewidgets.append(urwid.Text(('help_section',
                                '\n%s-mode specific maps' % ui.mode)))
            for (k, v) in modemaps.items():
                line = urwid.Columns([('fixed', keycolumnwidth, urwid.Text(k)),
                                      urwid.Text(v)])
                linewidgets.append(line)

            # global maps
            linewidgets.append(urwid.Text(('help_section',
                                           '\nglobal maps')))
            for (k, v) in globalmaps.items():
                if k not in modemaps:
                    line = urwid.Columns(
                        [('fixed', keycolumnwidth, urwid.Text(k)),
                         urwid.Text(v)])
                    linewidgets.append(line)

            body = urwid.ListBox(linewidgets)
            ckey = 'cancel'
            titletext = 'Bindings Help (%s cancels)' % ckey

            box = widgets.DialogBox(body, titletext,
                                    bodyattr='help_text',
                                    titleattr='help_title')

            # put promptwidget as overlay on main widget
            overlay = urwid.Overlay(box, ui.mainframe, 'center',
                                    ('relative', 70), 'middle',
                                    ('relative', 70))
            ui.show_as_root_until_keypress(overlay, 'cancel')
        else:
            logging.debug('HELP %s' % self.commandname)
            parser = commands.lookup_parser(self.commandname, ui.mode)
            if parser:
                ui.notify(parser.format_help(), block=True)
            else:
                ui.notify('command not known: %s' % self.commandname,
                          priority='error')
예제 #5
0
파일: globals.py 프로젝트: 0x64746b/alot
    def apply(self, ui):
        ui.logger.debug("HELP")
        if self.commandname == "bindings":
            # get mappings
            modemaps = dict(settings.config.items("%s-maps" % ui.mode))
            globalmaps = dict(settings.config.items("global-maps"))

            # build table
            maxkeylength = len(max((modemaps).keys() + globalmaps.keys(), key=len))
            keycolumnwidth = maxkeylength + 2

            linewidgets = []
            # mode specific maps
            linewidgets.append(urwid.Text(("help_section", "\n%s-mode specific maps" % ui.mode)))
            for (k, v) in modemaps.items():
                line = urwid.Columns([("fixed", keycolumnwidth, urwid.Text(k)), urwid.Text(v)])
                linewidgets.append(line)

            # global maps
            linewidgets.append(urwid.Text(("help_section", "\nglobal maps")))
            for (k, v) in globalmaps.items():
                if k not in modemaps:
                    line = urwid.Columns([("fixed", keycolumnwidth, urwid.Text(k)), urwid.Text(v)])
                    linewidgets.append(line)

            body = urwid.ListBox(linewidgets)
            ckey = "cancel"
            titletext = "Bindings Help (%s cancels)" % ckey

            box = widgets.DialogBox(body, titletext, bodyattr="help_text", titleattr="help_title")

            # put promptwidget as overlay on main widget
            overlay = urwid.Overlay(box, ui.mainframe, "center", ("relative", 70), "middle", ("relative", 70))
            ui.show_as_root_until_keypress(overlay, "cancel")
        else:
            ui.logger.debug("HELP %s" % self.commandname)
            parser = commands.lookup_parser(self.commandname, ui.mode)
            if parser:
                ui.notify(parser.format_help(), block=True)
            else:
                ui.notify("command not known: %s" % self.commandname, priority="error")
예제 #6
0
파일: command.py 프로젝트: xaltsc/alot
    def complete(self, original, pos):
        # remember how many preceding space characters we see until the command
        # string starts. We'll continue to complete from there on and will add
        # these whitespaces again at the very end
        whitespaceoffset = len(original) - len(original.lstrip())
        original = original[whitespaceoffset:]
        pos = pos - whitespaceoffset

        words = original.split(' ', 1)

        res = []
        if pos <= len(words[0]):  # we complete commands
            for cmd, cpos in self._commandnamecompleter.complete(
                    original, pos):
                newtext = ('%s %s' % (cmd, ' '.join(words[1:])))
                res.append((newtext, cpos + 1))
        else:
            cmd, params = words
            localpos = pos - (len(cmd) + 1)
            parser = commands.lookup_parser(cmd, self.mode)
            if parser is not None:
                # set 'res' - the result set of matching completionstrings
                # depending on the current mode and command

                # detect if we are completing optional parameter
                arguments_until_now = params[:localpos].split(' ')
                all_optionals = True
                logging.debug(str(arguments_until_now))
                for a in arguments_until_now:
                    logging.debug(a)
                    if a and not a.startswith('-'):
                        all_optionals = False
                # complete optional parameter if
                # 1. all arguments prior to current position are optional
                # 2. the parameter starts with '-' or we are at its beginning
                if all_optionals:
                    myarg = arguments_until_now[-1]
                    start_myarg = params.rindex(myarg)
                    beforeme = params[:start_myarg]
                    # set up local stringlist completer
                    # and let it complete for given list of options
                    localcompleter = ArgparseOptionCompleter(parser)
                    localres = localcompleter.complete(myarg, len(myarg))
                    res = [(beforeme + c, p + start_myarg)
                           for (c, p) in localres]

                # global
                elif cmd == 'search':
                    res = self._querycompleter.complete(params, localpos)
                elif cmd == 'help':
                    res = self._commandnamecompleter.complete(params, localpos)
                elif cmd in ['compose']:
                    res = self._contactscompleter.complete(params, localpos)
                # search
                elif self.mode == 'search' and cmd == 'refine':
                    res = self._querycompleter.complete(params, localpos)
                elif self.mode == 'search' and cmd in [
                        'tag', 'retag', 'untag', 'toggletags'
                ]:
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=',')
                    res = localcomp.complete(params, localpos)
                elif self.mode == 'search' and cmd == 'toggletag':
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=' ')
                    res = localcomp.complete(params, localpos)
                # envelope
                elif self.mode == 'envelope' and cmd == 'set':
                    plist = params.split(' ', 1)
                    if len(plist) == 1:  # complete from header keys
                        localprefix = params
                        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]
                    else:  # must have 2 elements
                        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 = [f(c, p) for c, p in res]
                        logging.debug(res)

                elif self.mode == 'envelope' and cmd == 'unset':
                    plist = params.split(' ', 1)
                    if len(plist) == 1:  # complete from header keys
                        localprefix = params
                        buf = self.currentbuffer
                        if buf:
                            if isinstance(buf, EnvelopeBuffer):
                                available = buf.envelope.headers.keys()
                                localcompleter = StringlistCompleter(available)
                                localres = localcompleter.complete(
                                    localprefix, localpos)
                                res = [(c, p + 6) for (c, p) in localres]

                elif self.mode == 'envelope' and cmd == 'attach':
                    res = self._pathcompleter.complete(params, localpos)
                elif self.mode == 'envelope' and cmd in ['sign', 'togglesign']:
                    res = self._secretkeyscompleter.complete(params, localpos)
                elif self.mode == 'envelope' and cmd in [
                        'encrypt', 'rmencrypt', 'toggleencrypt'
                ]:
                    res = self._publickeyscompleter.complete(params, localpos)
                elif self.mode == 'envelope' and cmd in [
                        'tag', 'toggletags', 'untag', 'retag'
                ]:
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=',')
                    res = localcomp.complete(params, localpos)
                # thread
                elif self.mode == 'thread' and cmd == 'save':
                    res = self._pathcompleter.complete(params, localpos)
                elif self.mode == 'thread' and cmd in [
                        'fold', 'unfold', 'togglesource', 'toggleheaders',
                        'togglemimetree', 'togglemimepart'
                ]:
                    res = self._querycompleter.complete(params, localpos)
                elif self.mode == 'thread' and cmd in [
                        'tag', 'retag', 'untag', 'toggletags'
                ]:
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=',')
                    res = localcomp.complete(params, localpos)
                elif cmd == 'move':
                    directions = [
                        'up', 'down', 'page up', 'page down', 'halfpage up',
                        'halfpage down', 'first', 'last'
                    ]
                    if self.mode == 'thread':
                        directions += [
                            'parent', 'first reply', 'last reply',
                            'next sibling', 'previous sibling', 'next',
                            'previous', 'next unfolded', 'previous unfolded'
                        ]
                    localcompleter = StringlistCompleter(directions)
                    res = localcompleter.complete(params, localpos)

                # prepend cmd and correct position
                res = [('%s %s' % (cmd, t), p + len(cmd) + 1)
                       for (t, p) in res]

        # re-insert whitespaces and correct position
        wso = whitespaceoffset
        res = [(' ' * wso + cmdstr, p + wso) for cmdstr, p in res]
        return res
예제 #7
0
파일: completion.py 프로젝트: foobacca/alot
    def complete(self, line, pos):
        # remember how many preceding space characters we see until the command
        # string starts. We'll continue to complete from there on and will add
        # these whitespaces again at the very end
        whitespaceoffset = len(line) - len(line.lstrip())
        line = line[whitespaceoffset:]
        pos = pos - whitespaceoffset

        words = line.split(' ', 1)

        res = []
        if pos <= len(words[0]):  # we complete commands
            for cmd, cpos in self._commandnamecompleter.complete(line, pos):
                newtext = ('%s %s' % (cmd, ' '.join(words[1:])))
                res.append((newtext, cpos + 1))
        else:
            cmd, params = words
            localpos = pos - (len(cmd) + 1)
            parser = commands.lookup_parser(cmd, self.mode)
            if parser is not None:
                # set 'res' - the result set of matching completionstrings
                # depending on the current mode and command

                # detect if we are completing optional parameter
                arguments_until_now = params[:localpos].split(' ')
                all_optionals = True
                logging.debug(str(arguments_until_now))
                for a in arguments_until_now:
                    logging.debug(a)
                    if a and not a.startswith('-'):
                        all_optionals = False
                # complete optional parameter if
                # 1. all arguments prior to current position are optional
                # 2. the parameter starts with '-' or we are at its beginning
                if all_optionals:
                    myarg = arguments_until_now[-1]
                    start_myarg = params.rindex(myarg)
                    beforeme = params[:start_myarg]
                    # set up local stringlist completer
                    # and let it complete for given list of options
                    localcompleter = ArgparseOptionCompleter(parser)
                    localres = localcompleter.complete(myarg, len(myarg))
                    res = [(
                        beforeme + c, p + start_myarg) for (c, p) in localres]

                # global
                elif cmd == 'search':
                    res = self._querycompleter.complete(params, localpos)
                elif cmd == 'help':
                    res = self._commandnamecompleter.complete(params, localpos)
                elif cmd in ['compose']:
                    res = self._contactscompleter.complete(params, localpos)
                # search
                elif self.mode == 'search' and cmd == 'refine':
                    res = self._querycompleter.complete(params, localpos)
                elif self.mode == 'search' and cmd in ['tag', 'retag', 'untag',
                                                       'toggletags']:
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=',')
                    res = localcomp.complete(params, localpos)
                elif self.mode == 'search' and cmd == 'toggletag':
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=' ')
                    res = localcomp.complete(params, localpos)
                # envelope
                elif self.mode == 'envelope' and cmd == 'set':
                    plist = params.split(' ', 1)
                    if len(plist) == 1:  # complete from header keys
                        localprefix = params
                        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]
                    else:  # must have 2 elements
                        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)

                elif self.mode == 'envelope' and cmd == 'unset':
                    plist = params.split(' ', 1)
                    if len(plist) == 1:  # complete from header keys
                        localprefix = params
                        buf = self.currentbuffer
                        if buf:
                            if isinstance(buf, EnvelopeBuffer):
                                available = buf.envelope.headers.keys()
                                localcompleter = StringlistCompleter(available)
                                localres = localcompleter.complete(localprefix,
                                                                   localpos)
                                res = [(c, p + 6) for (c, p) in localres]

                elif self.mode == 'envelope' and cmd == 'attach':
                    res = self._pathcompleter.complete(params, localpos)
                elif self.mode == 'envelope' and cmd in ['sign', 'togglesign']:
                    res = self._secretkeyscompleter.complete(params, localpos)
                elif self.mode == 'envelope' and cmd in ['encrypt',
                                                         'rmencrypt',
                                                         'toggleencrypt']:
                    res = self._publickeyscompleter.complete(params, localpos)
                # thread
                elif self.mode == 'thread' and cmd == 'save':
                    res = self._pathcompleter.complete(params, localpos)
                elif self.mode == 'thread' and cmd in ['fold', 'unfold',
                                                       'togglesource',
                                                       'toggleheaders']:
                    res = self._querycompleter.complete(params, localpos)
                elif self.mode == 'thread' and cmd in ['tag', 'retag', 'untag',
                                                       'toggletags']:
                    localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                           separator=',')
                    res = localcomp.complete(params, localpos)
                elif cmd == 'move':
                    directions = ['up', 'down', 'page up', 'page down']
                    if self.mode == 'thread':
                        directions += ['first', 'next', 'previous',
                                       'last reply', 'first reply', 'parent',
                                       'next sibling', 'previous sibling']
                    localcompleter = StringlistCompleter(directions)
                    res = localcompleter.complete(params, localpos)

                # prepend cmd and correct position
                res = [('%s %s' % (cmd, t), p + len(cmd) +
                        1) for (t, p) in res]

        # re-insert whitespaces and correct position
        wso = whitespaceoffset
        res = [(' ' * wso + cmd, p + wso) for cmd, p
               in res]
        return res
예제 #8
0
    def complete(self, line, pos):
        words = line.split(' ', 1)

        res = []
        if pos <= len(words[0]):  # we complete commands
            for cmd, cpos in self._commandcompleter.complete(line, pos):
                newtext = ('%s %s' % (cmd, ' '.join(words[1:])))
                res.append((newtext, cpos + 1))
        else:
            cmd, params = words
            localpos = pos - (len(cmd) + 1)
            parser = commands.lookup_parser(cmd, self.mode)
            # set 'res' - the result set of matching completionstrings
            # depending on the current mode and command

            # detect if we are completing optional parameter
            arguments_until_now = params[:localpos].split(' ')
            all_optionals = True
            logging.debug(str(arguments_until_now))
            for a in arguments_until_now:
                logging.debug(a)
                if a and not a.startswith('-'):
                    all_optionals = False
            # complete optional parameter if
            # 1. all arguments prior to current position are optional parameter
            # 2. the parameter starts with '-' or we are at its beginning
            if all_optionals:
                myarg = arguments_until_now[-1]
                start_myarg = params.rindex(myarg)
                beforeme = params[:start_myarg]
                # set up local stringlist completer
                # and let it complete for given list of options
                localcompleter = ArgparseOptionCompleter(parser)
                localres = localcompleter.complete(myarg, len(myarg))
                res = [(beforeme + c, p + start_myarg) for (c, p) in localres]

            # global
            elif cmd == 'search':
                res = self._querycompleter.complete(params, localpos)
            elif cmd == 'help':
                res = self._commandcompleter.complete(params, localpos)
            elif cmd in ['compose']:
                res = self._contactscompleter.complete(params, localpos)
            # search
            elif self.mode == 'search' and cmd == 'refine':
                res = self._querycompleter.complete(params, localpos)
            elif self.mode == 'search' and cmd in [
                    'tag', 'retag', 'untag', 'toggletags'
            ]:
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=',')
                res = localcomp.complete(params, localpos)
            elif self.mode == 'search' and cmd == 'toggletag':
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=' ')
                res = localcomp.complete(params, localpos)
            # envelope
            elif self.mode == 'envelope' and cmd == 'set':
                plist = params.split(' ', 1)
                if len(plist) == 1:  # complete from header keys
                    localprefix = params
                    headers = ['Subject', 'To', 'Cc', 'Bcc', 'In-Reply-To']
                    localcompleter = StringlistCompleter(headers)
                    localres = localcompleter.complete(localprefix, localpos)
                    res = [(c, p + 6) for (c, p) in localres]
                else:  # must have 2 elements
                    header, params = plist
                    localpos = localpos - (len(header) + 1)
                    if header.lower() in ['to', 'cc', 'bcc']:

                        # 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
                    localprefix = params
                    buf = self.currentbuffer
                    if buf:
                        if isinstance(buf, EnvelopeBuffer):
                            available = buf.envelope.headers.keys()
                            localcompleter = StringlistCompleter(available)
                            localres = localcompleter.complete(
                                localprefix, localpos)
                            res = [(c, p + 6) for (c, p) in localres]

            elif self.mode == 'envelope' and cmd == 'attach':
                res = self._pathcompleter.complete(params, localpos)
            # thread
            elif self.mode == 'thread' and cmd == 'save':
                res = self._pathcompleter.complete(params, localpos)
            elif self.mode == 'thread' and cmd in [
                    'tag', 'retag', 'untag', 'toggletags'
            ]:
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=',')
                res = localcomp.complete(params, localpos)

            # prepend cmd and correct position
            res = [('%s %s' % (cmd, t), p + len(cmd) + 1) for (t, p) in res]
        return res
예제 #9
0
파일: completion.py 프로젝트: laarmen/alot
    def complete(self, line, pos):
        words = line.split(' ', 1)

        res = []
        if pos <= len(words[0]):  # we complete commands
            for cmd, cpos in self._commandcompleter.complete(line, pos):
                newtext = ('%s %s' % (cmd, ' '.join(words[1:])))
                res.append((newtext, cpos + 1))
        else:
            cmd, params = words
            localpos = pos - (len(cmd) + 1)
            parser = commands.lookup_parser(cmd, self.mode)
            # set 'res' - the result set of matching completionstrings
            # depending on the current mode and command

            # detect if we are completing optional parameter
            arguments_until_now = params[:localpos].split(' ')
            all_optionals = True
            logging.debug(str(arguments_until_now))
            for a in arguments_until_now:
                logging.debug(a)
                if a and not a.startswith('-'):
                    all_optionals = False
            # complete optional parameter if
            # 1. all arguments prior to current position are optional parameter
            # 2. the parameter starts with '-' or we are at its beginning
            if all_optionals:
                myarg = arguments_until_now[-1]
                start_myarg = params.rindex(myarg)
                beforeme = params[:start_myarg]
                # set up local stringlist completer
                # and let it complete for given list of options
                localcompleter = ArgparseOptionCompleter(parser)
                localres = localcompleter.complete(myarg, len(myarg))
                res = [(beforeme + c, p + start_myarg) for (c, p) in localres]

            # global
            elif cmd == 'search':
                res = self._querycompleter.complete(params, localpos)
            elif cmd == 'help':
                res = self._commandcompleter.complete(params, localpos)
            elif cmd in ['compose']:
                res = self._contactscompleter.complete(params, localpos)
            # search
            elif self.mode == 'search' and cmd == 'refine':
                res = self._querycompleter.complete(params, localpos)
            elif self.mode == 'search' and cmd in ['tag', 'retag', 'untag',
                                                   'toggletags']:
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=',')
                res = localcomp.complete(params, localpos)
            elif self.mode == 'search' and cmd == 'toggletag':
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=' ')
                res = localcomp.complete(params, localpos)
            # envelope
            elif self.mode == 'envelope' and cmd == 'set':
                plist = params.split(' ', 1)
                if len(plist) == 1:  # complete from header keys
                    localprefix = params
                    headers = ['Subject', 'To', 'Cc', 'Bcc', 'In-Reply-To']
                    localcompleter = StringlistCompleter(headers)
                    localres = localcompleter.complete(localprefix, localpos)
                    res = [(c, p + 6) for (c, p) in localres]
                else:  # must have 2 elements
                    header, params = plist
                    localpos = localpos - (len(header) + 1)
                    if header.lower() in ['to', 'cc', 'bcc']:

                        # 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
                    localprefix = params
                    buf = self.currentbuffer
                    if buf:
                        if isinstance(buf, EnvelopeBuffer):
                            available = buf.envelope.headers.keys()
                            localcompleter = StringlistCompleter(available)
                            localres = localcompleter.complete(localprefix,
                                                               localpos)
                            res = [(c, p + 6) for (c, p) in localres]

            elif self.mode == 'envelope' and cmd == 'attach':
                res = self._pathcompleter.complete(params, localpos)
            # thread
            elif self.mode == 'thread' and cmd == 'save':
                res = self._pathcompleter.complete(params, localpos)
            elif self.mode == 'thread' and cmd in ['tag', 'retag', 'untag',
                                                   'toggletags']:
                localcomp = MultipleSelectionCompleter(self._tagcompleter,
                                                       separator=',')
                res = localcomp.complete(params, localpos)

            # prepend cmd and correct position
            res = [('%s %s' % (cmd, t), p + len(cmd) + 1) for (t, p) in res]
        return res