diff --git a/src/helper/command.c b/src/helper/command.c
index 1263a93142272a5348fe1ced3faacb617dbb41ce..a1ba358500324c17ef204558b86685422d66acc0 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -811,20 +811,48 @@ static COMMAND_HELPER(command_help_show_list, struct command *head, unsigned n,
 		CALL_COMMAND_HANDLER(command_help_show, c, n, show_help);
 	return ERROR_OK;
 }
+
+#define HELP_LINE_WIDTH(_n) (int)(76 - (2 * _n))
+
+static void command_help_show_indent(unsigned n)
+{
+	for (unsigned i = 0; i < n; i++)
+		LOG_USER_N("  ");
+}
+static void command_help_show_wrap(const char *str, unsigned n, unsigned n2)
+{
+	const char *cp = str, *last = str;
+	while (*cp)
+	{
+		const char *next = last;
+		do {
+			cp = next;
+			do {
+				next++;
+			} while (*next != ' ' && *next != '\t' && *next != '\0');
+		} while ((next - last < HELP_LINE_WIDTH(n)) && *next != '\0');
+		if (next - last < HELP_LINE_WIDTH(n))
+			cp = next;
+		command_help_show_indent(n);
+		LOG_USER_N("%.*s", (int)(cp - last), last);
+		LOG_USER_N("\n");
+		last = cp + 1;
+		n = n2;
+	}
+}
 static COMMAND_HELPER(command_help_show, struct command *c, unsigned n,
 		bool show_help)
 {
-	const char *usage = c->usage ? : "";
-	const char *help = "";
-	const char *sep = "";
-	if (show_help && c->help)
-	{
-		help = c->help ? : "";
-		sep = c->usage ? " | " : "";
+	command_help_show_indent(n);
+	LOG_USER_N("%s", command_name(c, ' '));
+	if (c->usage) {
+		LOG_USER_N(" ");
+		command_help_show_wrap(c->usage, 0, n + 5);
 	}
-	command_run_linef(CMD_CTX, "cmd_help {%s} {%s%s%s} %d",
-			command_name(c, ' '), usage, sep, help, n);
-
+	else
+		LOG_USER_N("\n");
+	if (show_help && c->help)
+		command_help_show_wrap(c->help, n + 3, n + 3);
 	if (++n >= 2)
 		return ERROR_OK;
 
diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl
index 5969cfec7a3075d0ec31daca07ace90d08927cb3..f11d5b6838aa27b3b95f4a087671d905915737ac 100644
--- a/src/helper/startup.tcl
+++ b/src/helper/startup.tcl
@@ -10,40 +10,6 @@ proc exit {} {
 	ocd_throw exit
 }
 
-# Help text list. A list of command + help text pairs.
-proc cmd_help {cmdname h indent} {
-	set indent [expr $indent * 2]
-
-	set fmt_str [format "%%%ds%%-%ds %%s" $indent [expr 25 - $indent]]
-	set w [expr 50 - $indent]
-	set n 0
-
-	while 1 {
-		if {$n > [string length $h]} {break}
-
-		set next_a [expr $n + $w]
-		if {[string length $h] > $n + $w} \
-		{
-			set xxxx [string range $h $n [expr $n + $w]]
-			for {set lastpos [expr [string length $xxxx] - 1]} \
-				{$lastpos >= 0 && [string compare \
-					[string range $xxxx $lastpos $lastpos] " "] != 0} \
-				{set lastpos [expr $lastpos - 1]} \
-			{
-			}
-			#set next_a -1
-			if {$lastpos != -1} {
-				set next_a [expr $lastpos + $n + 1]
-			}
-		}
-
-		puts [format $fmt_str "" $cmdname \
-				[string range $h $n [expr $next_a - 1]] ]
-		set cmdname ""
-		set n [expr $next_a]
-	}
-}
-
 # Try flipping / and \ to find file if the filename does not
 # match the precise spelling
 proc find {filename} {