@@ -891,6 +891,9 @@ class DefaultHelpFormatter(
891891 val prologue : String? = null ,
892892 val epilogue : String? = null
893893) : HelpFormatter {
894+ val indent = " "
895+ val indentWidth = indent.codePointWidth()
896+
894897 override fun format (
895898 progName : String? ,
896899 columns : Int ,
@@ -918,9 +921,14 @@ class DefaultHelpFormatter(
918921 else -> optional
919922 }.add(value)
920923 }
921- appendSection(sb, columns, " required" , required)
922- appendSection(sb, columns, " optional" , optional)
923- appendSection(sb, columns, " positional" , positional)
924+ // Make left column as narrow as possible without wrapping any of the individual usages, though no wider than
925+ // half the screen.
926+ val usageColumns = (2 * indentWidth - 1 + (
927+ values.map { usageText(it).split(" " ).map { it.length }.max() ? : 0 }.max() ? : 0 )
928+ ).coerceAtMost(columns / 2 )
929+ appendSection(sb, usageColumns, columns, " required" , required)
930+ appendSection(sb, usageColumns, columns, " optional" , optional)
931+ appendSection(sb, usageColumns, columns, " positional" , positional)
924932
925933 if (! epilogue.isNullOrEmpty()) {
926934 sb.append(" \n " )
@@ -932,24 +940,29 @@ class DefaultHelpFormatter(
932940 return sb.toString()
933941 }
934942
935- private fun appendSection (sb : StringBuilder , columns : Int , name : String , values : List <HelpFormatter .Value >) {
936- // TODO: make these configurable or smarter?
937- val helpPos = columns * 3 / 10
938- val indent = " "
939- val indentWidth = indent.codePointWidth()
943+ private fun appendSection (
944+ sb : StringBuilder ,
945+ usageColumns : Int ,
946+ columns : Int ,
947+ name : String ,
948+ values : List <HelpFormatter .Value >
949+ ) {
940950
941951 if (! values.isEmpty()) {
942952 sb.append(" \n " )
943953 sb.append(" $name arguments:\n " )
944954 for (value in values) {
945- val left = value.usages.map { it.replace( ' ' , ' \u00a0 ' ) }.joinToString( " , " ). wrapText(helpPos - indentWidth).prependIndent(indent)
946- val right = value.help.wrapText(columns - helpPos - 2 * indentWidth).prependIndent(indent)
947- sb.append(columnize(left, right, minWidths = intArrayOf(helpPos )))
955+ val left = usageText(value). wrapText(usageColumns - indentWidth).prependIndent(indent)
956+ val right = value.help.wrapText(columns - usageColumns - 2 * indentWidth).prependIndent(indent)
957+ sb.append(columnize(left, right, minWidths = intArrayOf(usageColumns )))
948958 sb.append(" \n\n " )
949959 }
950960 }
951961 }
952962
963+ private fun usageText (value : HelpFormatter .Value ) =
964+ value.usages.map { it.replace(' ' , ' \u00a0 ' ) }.joinToString(" , " )
965+
953966 private fun appendUsage (sb : StringBuilder , columns : Int , progName : String? , values : List <HelpFormatter .Value >) {
954967 val usageStart = " usage:${if (progName != null ) " $progName " else " " } "
955968
0 commit comments