def do_help(self, *cmd_names: str) -> None:
        """Show help for command name

        Any number of command names may be given to help, and the long help
        text for all of them will be shown.
        """
        def _h(cmd: str, template: str) -> None:
            try:
                func = getattr(self, cmd)
            except AttributeError:
                self._sout.write('No such command: {}\n'.format(cmd))
            else:
                doc = func.__doc__ if func.__doc__ else ''
                doc_firstline = doc.split('\n', maxsplit=1)[0]
                arg_list = ' '.join(
                    p for p in inspect.signature(func).parameters)
                self._sout.write(
                    template.format(
                        cmd_name=cmd[len(self._cmd_prefix):],
                        arg_list=arg_list,
                        cmd_arg_sep=' ' if arg_list else '',
                        doc=doc,
                        doc_firstline=doc_firstline
                    ) + '\n'
                )

        if not cmd_names:
            cmds = sorted(
                c.method_name for c in self._filter_cmds(with_alts=False)
            )
            self._sout.write('Available Commands are:\n\n')
            for cmd in cmds:
                _h(cmd, self.help_short_template)
        else:
            for cmd in cmd_names:
                _h(self._cmd_prefix + cmd, self.help_template)
Show help for command name

        Any number of command names may be given to help, and the long help
        text for all of them will be shown.