'Implements the multidescer.  We will use `db.desc` for the
description in use and `db.multidesc` to store all descriptions.'

def func(self):

    caller = self.caller
    args = self.args.strip()
    switches = self.switches
    try:
        if (('list' in switches) or ('all' in switches)):
            _update_store(caller)
            do_crop = (not ('full' in switches))
            if do_crop:
                outtext = [('|w%s:|n    %s' % (key, crop(desc))) for (key, desc) in caller.db.multidesc]
            else:
                outtext = [('\n|w%s:|n|n\n%s\n%s' % (key, ('-' * (len(key) + 1)), desc)) for (key, desc) in caller.db.multidesc]
            caller.msg(('|wStored    descs:|n\n' + '\n'.join(outtext)))
            return
        elif ('edit' in switches):
            if (not args):
                caller.msg(('Usage:    %s/edit    key' % self.key))
                return
            caller.db._multidesc_editkey = args
            EvEditor(caller, loadfunc=_load_editor, savefunc=_save_editor, quitfunc=_quit_editor, key='multidesc    editor', persistent=True)
        elif (('delete' in switches) or ('del' in switches)):
            if (not args):
                caller.msg(('Usage:    %s/delete    key' % self.key))
                return
            _update_store(caller, args, delete=True)
            caller.msg(("Deleted    description    with    key    '%s'." % args))
        elif (('swap' in switches) or ('switch' in switches) or ('reorder' in switches)):
            keys = [arg for arg in args.split('-', 1)]
            if (not (len(keys) == 2)):
                caller.msg(('Usage:    %s/swap    key1-key2' % self.key))
                return
            (key1, key2) = keys
            _update_store(caller, key1, swapkey=key2)
            caller.msg(("Swapped    descs    '%s'    and    '%s'." % (key1, key2)))
        elif ('set' in switches):
            _update_store(caller)
            if (not args):
                caller.msg(('Usage:    %s/set    key    [+    key2    +    key3    +    ...]' % self.key))
                return
            new_desc = []
            multidesc = caller.db.multidesc
            for key in args.split('+'):
                notfound = True
                lokey = key.strip().lower()
                for (mkey, desc) in multidesc:
                    if (lokey == mkey):
                        new_desc.append(desc)
                        notfound = False
                        continue
                if notfound:
                    new_desc.append(key)
            new_desc = ''.join(new_desc)
            caller.db.desc = new_desc
            caller.msg(('%s\n\n|wThe    above    was    set    as    the    current    description.|n' % new_desc))
        elif (self.rhs or ('add' in switches)):
            if (not (self.lhs and self.rhs)):
                caller.msg(('Usage:    %s/add    key    =    description' % self.key))
                return
            (key, desc) = (self.lhs, self.rhs)
            _update_store(caller, key, desc)
            caller.msg(('Stored    description    \'%s\':    "%s"' % (key, crop(desc))))
        else:
            _update_store(caller)
            if args:
                key = args.lower()
                multidesc = caller.db.multidesc
                for (mkey, desc) in multidesc:
                    if (key == mkey):
                        caller.msg(('|wDecsription    %s:|n\n%s' % (key, desc)))
                        return
                caller.msg(("Description    key    '%s'    not    found." % key))
            else:
                caller.msg(('|wCurrent    desc:|n\n%s' % caller.db.desc))
    except DescValidateError as err:
        caller.msg(err)
