def list_usage(progname, description, command_keys, command_helps, command_aliases):
    """
    Constructs program usage for a list of commands with help and aliases.
    Contructs in the order given in command keys. Newlines can be used for
    command sections by adding None entries to command_keys list.
    Only one alias allowed per command.

    :param command_keys: list of keys or None to print help or empty lines
    :param command_helps: dict{key: help}
    :param command_aliases: dict{key: alias}
    :returns: usage string (multiline)
    """
    dvars = {'prog': progname}
    dvars.update(vars())
    result = []
    result.append(description % dvars)
    for key in command_keys:
        if key in command_aliases:
            alias = ' (%s)' % command_aliases[key]
        else:
            alias = ''
        if key is not None:
            result.append(("%s%s" % (key, alias)).ljust(10) + '   \t' + command_helps[key])
        else:
            result.append('')
    return '\n'.join(result)