Hightlight usage [Feature #16754]
This commit is contained in:
parent
3825662d77
commit
cc68d2fbd0
Notes:
git
2020-04-12 14:58:37 +09:00
41
ruby.c
41
ruby.c
@ -239,20 +239,27 @@ static struct {
|
|||||||
char **argv;
|
char **argv;
|
||||||
} origarg;
|
} origarg;
|
||||||
|
|
||||||
|
static const char esc_standout[] = "\n\033[1;7m";
|
||||||
|
static const char esc_bold[] = "\033[1m";
|
||||||
|
static const char esc_reset[] = "\033[0m";
|
||||||
|
static const char esc_none[] = "";
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_usage_line(const char *str, unsigned int namelen, unsigned int secondlen, int help)
|
show_usage_line(const char *str, unsigned int namelen, unsigned int secondlen, int help, int highlight)
|
||||||
{
|
{
|
||||||
|
const char *sb = highlight ? esc_bold : esc_none;
|
||||||
|
const char *se = highlight ? esc_reset : esc_none;
|
||||||
const unsigned int w = 16;
|
const unsigned int w = 16;
|
||||||
const int wrap = help && namelen + secondlen - 1 > w;
|
const int wrap = help && namelen + secondlen - 1 > w;
|
||||||
printf(" %.*s%-*.*s%-*s%s\n", namelen-1, str,
|
printf(" %s%.*s%-*.*s%s%-*s%s\n", sb, namelen-1, str,
|
||||||
(wrap ? 0 : w - namelen + 1),
|
(wrap ? 0 : w - namelen + 1),
|
||||||
(help ? secondlen-1 : 0), str + namelen,
|
(help ? secondlen-1 : 0), str + namelen, se,
|
||||||
(wrap ? w + 3 : 0), (wrap ? "\n" : ""),
|
(wrap ? w + 3 : 0), (wrap ? "\n" : ""),
|
||||||
str + namelen + secondlen);
|
str + namelen + secondlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(const char *name, int help)
|
usage(const char *name, int help, int highlight)
|
||||||
{
|
{
|
||||||
/* This message really ought to be max 23 lines.
|
/* This message really ought to be max 23 lines.
|
||||||
* Removed -h because the user already knows that option. Others? */
|
* Removed -h because the user already knows that option. Others? */
|
||||||
@ -330,27 +337,31 @@ usage(const char *name, int help)
|
|||||||
M("--jit-min-calls=num", "", "Number of calls to trigger JIT (for testing, default: 10000)"),
|
M("--jit-min-calls=num", "", "Number of calls to trigger JIT (for testing, default: 10000)"),
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
const char *sb = highlight ? esc_standout+1 : esc_none;
|
||||||
|
const char *se = highlight ? esc_reset : esc_none;
|
||||||
const int num = numberof(usage_msg) - (help ? 1 : 0);
|
const int num = numberof(usage_msg) - (help ? 1 : 0);
|
||||||
#define SHOW(m) show_usage_line((m).str, (m).namelen, (m).secondlen, help)
|
#define SHOW(m) show_usage_line((m).str, (m).namelen, (m).secondlen, help, highlight)
|
||||||
|
|
||||||
printf("Usage: %s [switches] [--] [programfile] [arguments]\n", name);
|
printf("%sUsage:%s %s [switches] [--] [programfile] [arguments]\n", sb, se, name);
|
||||||
for (i = 0; i < num; ++i)
|
for (i = 0; i < num; ++i)
|
||||||
SHOW(usage_msg[i]);
|
SHOW(usage_msg[i]);
|
||||||
|
|
||||||
if (!help) return;
|
if (!help) return;
|
||||||
|
|
||||||
|
if (highlight) sb = esc_standout;
|
||||||
|
|
||||||
for (i = 0; i < numberof(help_msg); ++i)
|
for (i = 0; i < numberof(help_msg); ++i)
|
||||||
SHOW(help_msg[i]);
|
SHOW(help_msg[i]);
|
||||||
puts("Dump List:");
|
printf("%s""Dump List:%s\n", sb, se);
|
||||||
for (i = 0; i < numberof(dumps); ++i)
|
for (i = 0; i < numberof(dumps); ++i)
|
||||||
SHOW(dumps[i]);
|
SHOW(dumps[i]);
|
||||||
puts("Features:");
|
printf("%s""Features:%s\n", sb, se);
|
||||||
for (i = 0; i < numberof(features); ++i)
|
for (i = 0; i < numberof(features); ++i)
|
||||||
SHOW(features[i]);
|
SHOW(features[i]);
|
||||||
puts("Warning categories:");
|
printf("%s""Warning categories:%s\n", sb, se);
|
||||||
for (i = 0; i < numberof(warn_categories); ++i)
|
for (i = 0; i < numberof(warn_categories); ++i)
|
||||||
SHOW(warn_categories[i]);
|
SHOW(warn_categories[i]);
|
||||||
puts("JIT options (experimental):");
|
printf("%s""JIT options (experimental):%s\n", sb, se);
|
||||||
for (i = 0; i < numberof(mjit_options); ++i)
|
for (i = 0; i < numberof(mjit_options); ++i)
|
||||||
SHOW(mjit_options[i]);
|
SHOW(mjit_options[i]);
|
||||||
}
|
}
|
||||||
@ -1608,14 +1619,15 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
|
|||||||
unsigned int dump = opt->dump & dump_exit_bits;
|
unsigned int dump = opt->dump & dump_exit_bits;
|
||||||
|
|
||||||
if (opt->dump & (DUMP_BIT(usage)|DUMP_BIT(help))) {
|
if (opt->dump & (DUMP_BIT(usage)|DUMP_BIT(help))) {
|
||||||
|
int tty = isatty(1);
|
||||||
const char *const progname =
|
const char *const progname =
|
||||||
(argc > 0 && argv && argv[0] ? argv[0] :
|
(argc > 0 && argv && argv[0] ? argv[0] :
|
||||||
origarg.argc > 0 && origarg.argv && origarg.argv[0] ? origarg.argv[0] :
|
origarg.argc > 0 && origarg.argv && origarg.argv[0] ? origarg.argv[0] :
|
||||||
ruby_engine);
|
ruby_engine);
|
||||||
if (opt->dump & DUMP_BIT(help)) {
|
if ((opt->dump & DUMP_BIT(help)) && tty) {
|
||||||
const char *pager_env = getenv("RUBY_PAGER");
|
const char *pager_env = getenv("RUBY_PAGER");
|
||||||
if (!pager_env) pager_env = getenv("PAGER");
|
if (!pager_env) pager_env = getenv("PAGER");
|
||||||
if (pager_env && *pager_env && isatty(0) && isatty(1)) {
|
if (pager_env && *pager_env && isatty(0)) {
|
||||||
VALUE pager = rb_str_new_cstr(pager_env);
|
VALUE pager = rb_str_new_cstr(pager_env);
|
||||||
#ifdef HAVE_WORKING_FORK
|
#ifdef HAVE_WORKING_FORK
|
||||||
int fds[2];
|
int fds[2];
|
||||||
@ -1648,7 +1660,8 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
|
|||||||
int fd = RFILE(port)->fptr->fd;
|
int fd = RFILE(port)->fptr->fd;
|
||||||
dup2(fd, 1);
|
dup2(fd, 1);
|
||||||
dup2(fd, 2);
|
dup2(fd, 2);
|
||||||
usage(progname, 1);
|
/* more.com doesn't support CSI sequence */
|
||||||
|
usage(progname, 1, 0);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
dup2(oldout, 1);
|
dup2(oldout, 1);
|
||||||
dup2(olderr, 2);
|
dup2(olderr, 2);
|
||||||
@ -1658,7 +1671,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
usage(progname, (opt->dump & DUMP_BIT(help)));
|
usage(progname, (opt->dump & DUMP_BIT(help)), tty);
|
||||||
return Qtrue;
|
return Qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user