docs: 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))