diff --git a/CHANGES b/CHANGES index e0e5f80e..bb44bd63 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +16 November 2007 + +* (nicm) List available commands on ambiguous command. + 12 November 2007 * (nicm) If the terminal supports default colours (AX present), force black @@ -206,4 +210,4 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.67 2007-11-12 20:29:43 nicm Exp $ +$Id: CHANGES,v 1.68 2007-11-16 13:23:59 nicm Exp $ diff --git a/TODO b/TODO index 7bffc182..82738806 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ - it would be nice if there wasn't so much copying buffers about, audit uses -- useful env vars like WINDOW +- useful env vars like WINDOW? - sort out who controls the buffers in local.c a bit - better checking/emulation for missing term requirements - alt charset, borders etc (terminfo(5)/Line Graphics) @@ -25,7 +25,7 @@ - client could pass term/tty fd up to server and then do nothing. what problems would this cause? -- need access to all terminfo data at once... signals? - cleanup/redesign IPC - IPC is slightly arse-about-face: too much overhead. 8-byte header for + IPC is slightly arse-about-face: overhead? 8-byte header for each packet... hrm. already scanning output for \e, could add an extra byte to it for message - could use bsearch all over the place or get rid of smaller tables (clientmsg) @@ -34,7 +34,6 @@ - CLIENT_HOLD sucks - session with CMD_NOSESSION should be an error - each command should have a print op as well for list keys -- List available commands on ambigous command - Implicitly add exec to the commands for new windows (switch to disable it) - nested sessions, ie session as window - moving to it moves into session (remembering parent) @@ -44,27 +43,25 @@ - status-fg/status-bg should be to set attributes: bold, etc - show-options command - detach client and other client commands. note that there can only be a - "current client" on key presses - these should act like detach-session - - -a will do all clients, otherwise do nothing unless key in which case do - current client + "current client" on key presses - these should probably act like + detach-session: -a will do all clients, otherwise use current client if + key, else do nothing - check handling of out-of-bound values in input.c, most should be limited rather than ignored - save/restore (DECSC/DECRC) are ugly. maybe a struct screen_attr and memcpy - force maximum terminal size (centred?) - per-session toolbar state, other options -- commands: - kill server - force-default option: assume terminal supports default colours even if AX is missing (like, eg, xterm-color in an aterm) - refer to windows by name etc (duplicates?) -- command to run something without a window at all -- command to insert a key into a window -- function groups: - bind-key ^W { select-window 0; send-key ^W } - etc +- commands: + kill server + command to run something without a window at all? + command to insert a key into a window (send-key) +- function groups, bind-key ^W { select-window 0; send-key ^W } etc +- more(1) style handling for in-client output -- For 0.1 -------------------------------------------------------------------- -- fix most(1) problems after scrolling - fix mutt problems with redraw (mutt's) status line when reading mail -- For 0.2 -------------------------------------------------------------------- diff --git a/cmd.c b/cmd.c index 1396d04c..82c53831 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.26 2007-11-12 14:21:40 nicm Exp $ */ +/* $Id: cmd.c,v 1.27 2007-11-16 13:23:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -57,6 +57,7 @@ cmd_parse(int argc, char **argv, char **cause) { const struct cmd_entry **entryp, *entry; struct cmd *cmd; + char s[BUFSIZ]; int opt; *cause = NULL; @@ -73,10 +74,8 @@ cmd_parse(int argc, char **argv, char **cause) if (strncmp((*entryp)->name, argv[0], strlen(argv[0])) != 0) continue; - if (entry != NULL) { - xasprintf(cause, "ambiguous command: %s", argv[0]); - return (NULL); - } + if (entry != NULL) + goto ambiguous; entry = *entryp; } if (entry == NULL) { @@ -108,6 +107,20 @@ cmd_parse(int argc, char **argv, char **cause) } return (cmd); +ambiguous: + *s = '\0'; + for (entryp = cmd_table; *entryp != NULL; entryp++) { + if (strncmp((*entryp)->name, argv[0], strlen(argv[0])) != 0) + continue; + if (strlcat(s, (*entryp)->name, sizeof s) >= sizeof s) + break; + if (strlcat(s, ", ", sizeof s) >= sizeof s) + break; + } + s[strlen(s) - 2] = '\0'; + xasprintf(cause, "ambiguous command: %s, could be: %s", argv[0], s); + return (NULL); + usage: usage(cause, "%s %s", entry->name, entry->usage); return (NULL);