aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--TODO25
-rw-r--r--cmd.c23
3 files changed, 34 insertions, 20 deletions
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 <nicm@users.sourceforge.net>
@@ -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);