def print_usage(self, hint=None):
        """Usage format should be like:
        Lineno | Content
             1 | Script description (__doc__)
             2 | Usage: {script name} [COMMAND] [ARGUMENTS]
             3 | \n
             4 | Commands:
             5 |   cmd1               cmd1 description.
             6 |   cmd2isverylong     cmd2 description, and it is also
             7 |                      long as shit.
             7 |   cmd3               cmd3 description.
        """
        buf = []

        # Description
        if __doc__:
            buf.append(__doc__)

        # Usage
        script_name = sys.argv[0]
        buf.append('Usage: %s [COMMAND] [ARGUMENTS]' % script_name)

        buf.append('')
        buf.append('Commands:')

        # Commands
        indent_size = 2
        tab_size = 4
        doc_width = 50
        grid_len = max(len(i) for i in list(self._commands.keys())) + tab_size

        for name in self._commands_list:
            command = self._commands[name]
            line = ' ' * indent_size + name + ' ' * (grid_len - len(name))
            doc = command.doc
            pieces = [doc[i:i + doc_width] for i in range(0, len(doc), doc_width)]
            line += pieces[0]
            if len(pieces) > 1:
                line += '\n'
                line += '\n'.join(' ' * (grid_len + 2) + i for i in pieces[1:])

            buf.append(line)

        print('\n'.join(buf))
Usage format should be like:
        Lineno | Content
             1 | Script description (__doc__)
             2 | Usage: {script name} [COMMAND] [ARGUMENTS]
             3 | \n
             4 | Commands:
             5 |   cmd1               cmd1 description.
             6 |   cmd2isverylong     cmd2 description, and it is also
             7 |                      long as shit.
             7 |   cmd3               cmd3 description.