1*08d478e3Schristos /* $NetBSD: ex_usage.c,v 1.2 2013/11/22 15:52:05 christos Exp $ */ 23a571abcSchristos /*- 33a571abcSchristos * Copyright (c) 1992, 1993, 1994 43a571abcSchristos * The Regents of the University of California. All rights reserved. 53a571abcSchristos * Copyright (c) 1992, 1993, 1994, 1995, 1996 63a571abcSchristos * Keith Bostic. All rights reserved. 73a571abcSchristos * 83a571abcSchristos * See the LICENSE file for redistribution information. 93a571abcSchristos */ 103a571abcSchristos 113a571abcSchristos #include "config.h" 123a571abcSchristos 133a571abcSchristos #ifndef lint 143a571abcSchristos static const char sccsid[] = "Id: ex_usage.c,v 10.15 2001/06/25 15:19:21 skimo Exp (Berkeley) Date: 2001/06/25 15:19:21 "; 153a571abcSchristos #endif /* not lint */ 163a571abcSchristos 173a571abcSchristos #include <sys/types.h> 183a571abcSchristos #include <sys/queue.h> 193a571abcSchristos #include <sys/time.h> 203a571abcSchristos 213a571abcSchristos #include <bitstring.h> 223a571abcSchristos #include <ctype.h> 233a571abcSchristos #include <limits.h> 243a571abcSchristos #include <stdio.h> 253a571abcSchristos #include <stdlib.h> 263a571abcSchristos #include <string.h> 273a571abcSchristos 283a571abcSchristos #include "../common/common.h" 293a571abcSchristos #include "../vi/vi.h" 303a571abcSchristos 313a571abcSchristos /* 323a571abcSchristos * ex_help -- :help 333a571abcSchristos * Display help message. 343a571abcSchristos * 353a571abcSchristos * PUBLIC: int ex_help __P((SCR *, EXCMD *)); 363a571abcSchristos */ 373a571abcSchristos int 383a571abcSchristos ex_help(SCR *sp, EXCMD *cmdp) 393a571abcSchristos { 403a571abcSchristos (void)ex_puts(sp, 413a571abcSchristos "To see the list of vi commands, enter \":viusage<CR>\"\n"); 423a571abcSchristos (void)ex_puts(sp, 433a571abcSchristos "To see the list of ex commands, enter \":exusage<CR>\"\n"); 443a571abcSchristos (void)ex_puts(sp, 453a571abcSchristos "For an ex command usage statement enter \":exusage [cmd]<CR>\"\n"); 463a571abcSchristos (void)ex_puts(sp, 473a571abcSchristos "For a vi key usage statement enter \":viusage [key]<CR>\"\n"); 483a571abcSchristos (void)ex_puts(sp, "To exit, enter \":q!\"\n"); 493a571abcSchristos return (0); 503a571abcSchristos } 513a571abcSchristos 523a571abcSchristos /* 533a571abcSchristos * ex_usage -- :exusage [cmd] 543a571abcSchristos * Display ex usage strings. 553a571abcSchristos * 563a571abcSchristos * PUBLIC: int ex_usage __P((SCR *, EXCMD *)); 573a571abcSchristos */ 583a571abcSchristos int 593a571abcSchristos ex_usage(SCR *sp, EXCMD *cmdp) 603a571abcSchristos { 613a571abcSchristos ARGS *ap; 623a571abcSchristos EXCMDLIST const *cp; 633a571abcSchristos int newscreen; 64*08d478e3Schristos CHAR_T *p, nb[MAXCMDNAMELEN + 5]; 65*08d478e3Schristos const CHAR_T *name; 663a571abcSchristos 673a571abcSchristos switch (cmdp->argc) { 683a571abcSchristos case 1: 693a571abcSchristos ap = cmdp->argv[0]; 70*08d478e3Schristos if (ISUPPER((UCHAR_T)ap->bp[0])) { 713a571abcSchristos newscreen = 1; 72*08d478e3Schristos ap->bp[0] = TOLOWER((UCHAR_T)ap->bp[0]); 733a571abcSchristos } else 743a571abcSchristos newscreen = 0; 753a571abcSchristos for (cp = cmds; cp->name != NULL && 763a571abcSchristos memcmp(ap->bp, cp->name, ap->len); ++cp); 773a571abcSchristos if (cp->name == NULL || 78*08d478e3Schristos (newscreen && !F_ISSET(cp, E_NEWSCREEN))) { 79*08d478e3Schristos const char *nstr; 80*08d478e3Schristos size_t nlen; 81*08d478e3Schristos 823a571abcSchristos if (newscreen) 83*08d478e3Schristos ap->bp[0] = TOUPPER((UCHAR_T)ap->bp[0]); 84*08d478e3Schristos 85*08d478e3Schristos INT2CHAR(sp, ap->bp, ap->len + 1, nstr, nlen); 863a571abcSchristos (void)ex_printf(sp, "The %.*s command is unknown\n", 87*08d478e3Schristos (int)ap->len, nstr); 883a571abcSchristos } else { 893a571abcSchristos (void)ex_printf(sp, 903a571abcSchristos "Command: %s\n Usage: %s\n", cp->help, cp->usage); 913a571abcSchristos /* 923a571abcSchristos * !!! 933a571abcSchristos * The "visual" command has two modes, one from ex, 943a571abcSchristos * one from the vi colon line. Don't ask. 953a571abcSchristos */ 963a571abcSchristos if (cp != &cmds[C_VISUAL_EX] && 973a571abcSchristos cp != &cmds[C_VISUAL_VI]) 983a571abcSchristos break; 993a571abcSchristos if (cp == &cmds[C_VISUAL_EX]) 1003a571abcSchristos cp = &cmds[C_VISUAL_VI]; 1013a571abcSchristos else 1023a571abcSchristos cp = &cmds[C_VISUAL_EX]; 1033a571abcSchristos (void)ex_printf(sp, 1043a571abcSchristos "Command: %s\n Usage: %s\n", cp->help, cp->usage); 1053a571abcSchristos } 1063a571abcSchristos break; 1073a571abcSchristos case 0: 1083a571abcSchristos for (cp = cmds; cp->name != NULL && !INTERRUPTED(sp); ++cp) { 1093a571abcSchristos /* 1103a571abcSchristos * The ^D command has an unprintable name. 1113a571abcSchristos * 1123a571abcSchristos * XXX 1133a571abcSchristos * We display both capital and lower-case versions of 1143a571abcSchristos * the appropriate commands -- no need to add in extra 1153a571abcSchristos * room, they're all short names. 1163a571abcSchristos */ 1173a571abcSchristos if (cp == &cmds[C_SCROLL]) 1183a571abcSchristos name = L("^D"); 1193a571abcSchristos else if (F_ISSET(cp, E_NEWSCREEN)) { 1203a571abcSchristos nb[0] = L('['); 121*08d478e3Schristos nb[1] = TOUPPER((UCHAR_T)cp->name[0]); 1223a571abcSchristos nb[2] = cp->name[0]; 1233a571abcSchristos nb[3] = L(']'); 1243a571abcSchristos for (name = cp->name + 1, 1253a571abcSchristos p = nb + 4; (*p++ = *name++) != '\0';); 1263a571abcSchristos name = nb; 1273a571abcSchristos } else 1283a571abcSchristos name = cp->name; 1293a571abcSchristos (void)ex_printf(sp, 1303a571abcSchristos WVS": %s\n", MAXCMDNAMELEN, name, cp->help); 1313a571abcSchristos } 1323a571abcSchristos break; 1333a571abcSchristos default: 1343a571abcSchristos abort(); 1353a571abcSchristos } 1363a571abcSchristos return (0); 1373a571abcSchristos } 1383a571abcSchristos 1393a571abcSchristos /* 1403a571abcSchristos * ex_viusage -- :viusage [key] 1413a571abcSchristos * Display vi usage strings. 1423a571abcSchristos * 1433a571abcSchristos * PUBLIC: int ex_viusage __P((SCR *, EXCMD *)); 1443a571abcSchristos */ 1453a571abcSchristos int 1463a571abcSchristos ex_viusage(SCR *sp, EXCMD *cmdp) 1473a571abcSchristos { 1483a571abcSchristos VIKEYS const *kp; 1493a571abcSchristos int key; 1503a571abcSchristos 1513a571abcSchristos switch (cmdp->argc) { 1523a571abcSchristos case 1: 1533a571abcSchristos if (cmdp->argv[0]->len != 1) { 1543a571abcSchristos ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); 1553a571abcSchristos return (1); 1563a571abcSchristos } 1573a571abcSchristos key = cmdp->argv[0]->bp[0]; 1583a571abcSchristos if (key > MAXVIKEY) 1593a571abcSchristos goto nokey; 1603a571abcSchristos 1613a571abcSchristos /* Special case: '[' and ']' commands. */ 1623a571abcSchristos if ((key == '[' || key == ']') && cmdp->argv[0]->bp[1] != key) 1633a571abcSchristos goto nokey; 1643a571abcSchristos 1653a571abcSchristos /* Special case: ~ command. */ 1663a571abcSchristos if (key == '~' && O_ISSET(sp, O_TILDEOP)) 1673a571abcSchristos kp = &tmotion; 1683a571abcSchristos else 1693a571abcSchristos kp = &vikeys[key]; 1703a571abcSchristos 1713a571abcSchristos if (kp->usage == NULL) 1723a571abcSchristos nokey: (void)ex_printf(sp, 1733a571abcSchristos "The %s key has no current meaning\n", 1743a571abcSchristos KEY_NAME(sp, key)); 1753a571abcSchristos else 1763a571abcSchristos (void)ex_printf(sp, 1773a571abcSchristos " Key:%s%s\nUsage: %s\n", 178*08d478e3Schristos isblank((unsigned char)*kp->help) ? "" : " ", kp->help, kp->usage); 1793a571abcSchristos break; 1803a571abcSchristos case 0: 1813a571abcSchristos for (key = 0; key <= MAXVIKEY && !INTERRUPTED(sp); ++key) { 1823a571abcSchristos /* Special case: ~ command. */ 1833a571abcSchristos if (key == '~' && O_ISSET(sp, O_TILDEOP)) 1843a571abcSchristos kp = &tmotion; 1853a571abcSchristos else 1863a571abcSchristos kp = &vikeys[key]; 1873a571abcSchristos if (kp->help != NULL) 1883a571abcSchristos (void)ex_printf(sp, "%s\n", kp->help); 1893a571abcSchristos } 1903a571abcSchristos break; 1913a571abcSchristos default: 1923a571abcSchristos abort(); 1933a571abcSchristos } 1943a571abcSchristos return (0); 1953a571abcSchristos } 196