From 3d7596765bc2aa10ffdd210fb3531d647dd932f5 Mon Sep 17 00:00:00 2001 From: He Shiming Date: Mon, 30 Jan 2023 19:28:07 +0800 Subject: [PATCH] implements column-aligned multi-line help message for arguments (issue #248) --- include/argparse/argparse.hpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index d0ce31d..3f5ddee 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -649,6 +649,7 @@ public: friend std::ostream &operator<<(std::ostream &stream, const Argument &argument) { + auto stream_width = stream.width(); std::stringstream name_stream; name_stream << " "; // indent if (argument.is_positional(argument.m_names.front(), @@ -668,7 +669,31 @@ public: name_stream << " " << argument.m_metavar; } } - stream << name_stream.str() << "\t" << argument.m_help; + auto spacing = name_stream.str().size(); + auto pos = 0; + auto prev = 0; + auto first_line = true; + stream << name_stream.str(); + while ((pos = argument.m_help.find('\n', prev)) != std::string::npos) { + auto line = argument.m_help.substr(prev, pos - prev + 1); + if (first_line) { + stream << "\t" << line; + first_line = false; + } else { + stream.width(stream_width); + stream << std::string(spacing, ' ') << "\t" << line; + } + prev += pos - prev + 1; + } + if (first_line) + stream << "\t" << argument.m_help; + else { + auto leftover = argument.m_help.substr(prev, argument.m_help.size() - prev); + if (leftover.size() > 0) { + stream.width(stream_width); + stream << std::string(spacing, ' ') << "\t" << leftover; + } + } // print nargs spec if (!argument.m_help.empty()) {