git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Get correct column with for options in command usage

From
Duy Nguyen <pclouds@gmail.com>
Date
Feb 5, 2013, 12:15 UTC
Message-ID
<20130205121552.GA16601@lanh>
In-Reply-To
<0b035132df6de2cac56ac59d66b04f30e90ad760.1360049671.git.worldhello.net@gmail.com>
On Tue, Feb 05, 2013 at 03:40:32PM +0800, Jiang Xin wrote:
> Command usage would not align well if command options are translated,
> especially to CJK. Call utf8_strwidth in function usage_argh, so that
> the caller will get correct column width.

Yeah, I just noticed a misalignment in Vietnamese translation (just two spaces to the left, hard to notice unless paying attention).

Show 16 quoted lines
>  static int usage_argh(const struct option *opts, FILE *outfile)
>  {
> -	const char *s;
> +	const char *s, *p;
>  	int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !opts->argh;
>  	if (opts->flags & PARSE_OPT_OPTARG)
>  		if (opts->long_name)
> @@ -482,7 +482,9 @@ static int usage_argh(const struct option *opts, FILE *outfile)
>  			s = literal ? "[%s]" : "[<%s>]";
>  	else
>  		s = literal ? " %s" : " <%s>";
> -	return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
> +	p = opts->argh ? _(opts->argh) : _("...");
> +	fprintf(outfile, s, p);
> +	return utf8_strwidth(p) + strlen(s) - 2;
>  }
First of all, #include "utf8.h" is required for utf8_strwidth().

The "strlen(s) - 2" is quite sensitive to how "s" is written. How about this? A bit longer but clearer. Your version is OK too with a comment explaining "strlen(s) - 2".

-- 8< --
diff --git a/parse-options.c b/parse-options.c
index 67e98a6..0f803bd 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -474,6 +474,8 @@ int parse_options(int argc, const char **argv, const char *prefix,
 static int usage_argh(const struct option *opts, FILE *outfile)
 {
 	const char *s;
+	struct strbuf sb = STRBUF_INIT;
+	int columns;
 	int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !opts->argh;
 	if (opts->flags & PARSE_OPT_OPTARG)
 		if (opts->long_name)
@@ -482,7 +484,11 @@ static int usage_argh(const struct option *opts, FILE *outfile)
 			s = literal ? "[%s]" : "[<%s>]";
 	else
 		s = literal ? " %s" : " <%s>";
-	return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
+	strbuf_addf(&sb, s, opts->argh ? _(opts->argh) : _("..."));
+	fprintf(outfile, sb.buf);
+	columns = utf8_strwidth(sb.buf);
+	strbuf_release(&sb);
+	return columns;
 }
 
 #define USAGE_OPTS_WIDTH 24
-- 8< --

While looking at parse-options.c, I notice "-NUM" is not marked for
translation. I think you might want to mark it so that you can
translate "NUM" to a similar abbreviation in a local language. A
similar patch like this is required so we get columns for "-NUM"
translation instead of the number of bytes.
--
Duy
Previous: Jiang XinNext: Duy Nguyen
Message 2 of 20 in “Get correct column with for options in command usage”
  1. Get correct column with for options in command usageJiang Xin, Feb 5, 2013
  2. Duy NguyenFeb 5, 2013
  3. Duy NguyenFeb 5, 2013
  4. Junio C HamanoFeb 5, 2013
  5. 1/2 Get correct column with for options in command usageJiang Xin, Feb 5, 2013
  6. 2/2 i18n: mark OPTION_NUMBER (-NUM) for translationJiang Xin, Feb 5, 2013
  7. Junio C HamanoFeb 5, 2013
  8. Jiang XinFeb 6, 2013
  9. Junio C HamanoFeb 6, 2013
  10. Jiang XinFeb 6, 2013
  11. Junio C HamanoFeb 6, 2013
  12. Duy NguyenFeb 6, 2013
  13. Junio C HamanoFeb 6, 2013
  14. Add utf8_fprintf helper which returns correct columnsJiang Xin, Feb 8, 2013
  15. Torsten BögershausenFeb 8, 2013
  16. Torsten BögershausenFeb 8, 2013
  17. Jiang XinFeb 8, 2013
  18. Torsten BögershausenFeb 8, 2013
  19. Add utf8_fprintf helper that returns correct columnsJiang Xin, Feb 9, 2013
  20. Add utf8_fprintf helper which returns correct columnsJiang Xin, Feb 6, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.