4 * (C) 1992 Joseph H. Allen
6 * This file is part of JOE (Joe's Own Editor)
12 __RCSID("$MirOS: contrib/code/jupp/cmd.c,v 1.19 2017/12/02 02:07:25 tg Exp $");
58 int ubeep(BW *bw, int k)
64 extern char main_context[];
65 static int do_keymap(BW *bw, unsigned char *s, void *object, int *notify)
71 if (!s || !*s || !(new_kmap = kmap_getcontext(s, 0)))
73 if (bw->o.context != (unsigned char *)main_context)
75 bw->o.context = strcmp((char *)s, main_context) ?
76 (unsigned char *)strdup((char *)s) : (unsigned char *)main_context;
77 rmkbd(bw->parent->kbd);
78 bw->parent->kbd = mkkbd(new_kmap);
79 joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "New keymap: %s", s);
80 msgnw(bw->parent, msgbuf);
83 static int ukeymap(BW *bw)
85 if (wmkpw(bw->parent, US "Name of keymap to switch to: ", NULL,
86 do_keymap, NULL, NULL, utypebw, NULL, NULL, locale_map)) {
100 msgnw(bw->parent, US "Sorry, not supported without MMU");
104 #define ubuild unommu
109 {US "abendjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabendjoe, NULL, 0, NULL},
110 {US "abort", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabort, NULL, 0, NULL},
111 {US "abortbuf", TYPETW, uabortbuf, NULL, 0, NULL},
112 {US "arg", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uarg, NULL, 0, NULL},
113 {US "ask", TYPETW + TYPEPW, uask, NULL, 0, NULL},
114 {US "backs", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EMINOR + EKILL + EMOD, ubacks, NULL, 1, US "delch"},
115 {US "backsmenu", TYPEMENU, umbacks, NULL, 1, NULL},
116 {US "backw", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EKILL + EMOD, ubackw, NULL, 1, US "delw"},
117 {US "beep", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ubeep, NULL, 0, NULL},
118 {US "begin_marking", TYPETW + TYPEPW, ubegin_marking, NULL, 0, NULL},
119 {US "bknd", TYPETW + TYPEPW, ubknd, NULL, 0, NULL},
120 {US "bkwdc", TYPETW + TYPEPW, ubkwdc, NULL, 1, US "fwrdc"},
121 {US "blkcpy", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, ublkcpy, NULL, 1, NULL},
122 {US "blkdel", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD + EBLOCK, ublkdel, NULL, 0, NULL},
123 {US "blkmove", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, ublkmove, NULL, 0, NULL},
124 {US "blksave", TYPETW + TYPEPW + EBLOCK, ublksave, NULL, 0, NULL},
125 {US "bof", TYPETW + TYPEPW + EMOVE + EFIXXCOL, u_goto_bof, NULL, 0, NULL},
126 {US "bofmenu", TYPEMENU, umbof, NULL, 0, NULL},
127 {US "bol", TYPETW + TYPEPW + EFIXXCOL, u_goto_bol, NULL, 0, NULL},
128 {US "bolmenu", TYPEMENU, umbol, NULL, 0, NULL},
129 {US "bop", TYPETW + TYPEPW + EFIXXCOL, ubop, NULL, 1, US "eop"},
130 {US "bos", TYPETW + TYPEPW + EMOVE, ubos, NULL, 0, NULL},
131 {US "bufed", TYPETW, ubufed, NULL, 0, NULL},
132 {US "build", TYPETW + TYPEPW, ubuild, NULL, 0, NULL},
133 {US "byte", TYPETW + TYPEPW, ubyte, NULL, 0, NULL},
134 {US "cancel", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ucancel, NULL, 0, NULL},
135 {US "center", TYPETW + TYPEPW + EFIXXCOL + EMOD, ucenter, NULL, 1, NULL},
136 {US "col", TYPETW + TYPEPW, ucol, NULL, 0, NULL},
137 {US "complete", TYPEPW + EMINOR + EMOD, ucmplt, NULL, 0, NULL},
138 {US "copy", TYPETW + TYPEPW, ucopy, NULL, 0, NULL},
139 {US "crawll", TYPETW + TYPEPW, ucrawll, NULL, 1, US "crawlr"},
140 {US "crawlr", TYPETW + TYPEPW, ucrawlr, NULL, 1, US "crawll"},
141 {US "ctrl", TYPETW + TYPEPW + EMOD, uctrl, NULL, 0, NULL},
142 {US "delbol", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD, udelbl, NULL, 1, US "deleol"},
143 {US "delch", TYPETW + TYPEPW + ECHKXCOL + EFIXXCOL + EMINOR + EKILL + EMOD, udelch, NULL, 1, US "backs"},
144 {US "deleol", TYPETW + TYPEPW + EKILL + EMOD, udelel, NULL, 1, US "delbol"},
145 {US "dellin", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD, udelln, NULL, 1, NULL},
146 {US "delw", TYPETW + TYPEPW + EFIXXCOL + ECHKXCOL + EKILL + EMOD, u_word_delete, NULL, 1, US "backw"},
147 {US "dnarw", TYPETW + TYPEPW + EMOVE, udnarw, NULL, 1, US "uparw"},
148 {US "dnarwmenu", TYPEMENU, umdnarw, NULL, 1, US "uparwmenu"},
149 {US "dnslide", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, udnslide, NULL, 1, US "upslide"},
150 {US "drop", TYPETW + TYPEPW, udrop, NULL, 0, NULL},
151 {US "dupw", TYPETW, uduptw, NULL, 0, NULL},
152 {US "edit", TYPETW, uedit, NULL, 0, NULL},
153 {US "eof", TYPETW + TYPEPW + EFIXXCOL + EMOVE, u_goto_eof, NULL, 0, NULL},
154 {US "eofmenu", TYPEMENU, umeof, NULL, 0, NULL},
155 {US "eol", TYPETW + TYPEPW + EFIXXCOL, u_goto_eol, NULL, 0, NULL},
156 {US "eolmenu", TYPEMENU, umeol, NULL, 0, NULL},
157 {US "eop", TYPETW + TYPEPW + EFIXXCOL, ueop, NULL, 1, US "bop"},
158 {US "execmd", TYPETW + TYPEPW, uexecmd, NULL, 0, NULL},
159 {US "explode", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uexpld, NULL, 0, NULL},
160 {US "exsave", TYPETW + TYPEPW, uexsve, NULL, 0, NULL},
161 {US "ffirst", TYPETW + TYPEPW, pffirst, NULL, 0, NULL},
162 {US "filt", TYPETW + TYPEPW + EMOD + EBLOCK, ufilt, NULL, 0, NULL},
163 {US "finish", TYPETW + TYPEPW + EMOD, ufinish, NULL, 1, NULL},
164 {US "fmtblk", TYPETW + EMOD + EFIXXCOL + EBLOCK, ufmtblk, NULL, 1, NULL},
165 {US "fnext", TYPETW + TYPEPW, pfnext, NULL, 1, NULL},
166 {US "format", TYPETW + TYPEPW + EFIXXCOL + EMOD, uformat, NULL, 1, NULL},
167 {US "fwrdc", TYPETW + TYPEPW, ufwrdc, NULL, 1, US "bkwdc"},
168 {US "gomark", TYPETW + TYPEPW + EMOVE, ugomark, NULL, 0, NULL},
169 {US "groww", TYPETW, ugroww, NULL, 1, US "shrinkw"},
170 {US "help", TYPETW + TYPEPW + TYPEQW, u_help, NULL, 0, NULL},
171 {US "helpcard", TYPETW + TYPEPW + TYPEQW, u_helpcard, NULL, 0, NULL},
172 {US "hnext", TYPETW + TYPEPW + TYPEQW, u_help_next, NULL, 0, NULL},
173 {US "home", TYPETW + TYPEPW + EFIXXCOL, uhome, NULL, 0, NULL},
174 {US "hprev", TYPETW + TYPEPW + TYPEQW, u_help_prev, NULL, 0, NULL},
175 {US "insc", TYPETW + TYPEPW + EFIXXCOL + EMOD, uinsc, NULL, 1, US "delch"},
176 {US "insf", TYPETW + TYPEPW + EMOD, uinsf, NULL, 0, NULL},
177 {US "isrch", TYPETW + TYPEPW, uisrch, NULL, 0, NULL},
178 {US "keymap", TYPETW + TYPEPW, ukeymap, NULL, 0, NULL},
179 {US "killjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ukilljoe, NULL, 0, NULL},
180 {US "killproc", TYPETW + TYPEPW, ukillpid, NULL, 0, NULL},
181 {US "lindent", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, ulindent, NULL, 1, US "rindent"},
182 {US "line", TYPETW + TYPEPW, uline, NULL, 0, NULL},
183 {US "lose", TYPETW + TYPEPW, ulose, NULL, 0, NULL},
184 {US "lower", TYPETW + TYPEPW + EMOD + EBLOCK, ulower, NULL, 0, NULL},
185 {US "ltarw", TYPETW + TYPEPW /* + EFIXXCOL + ECHKXCOL */, u_goto_left, NULL, 1, US "rtarw"},
186 {US "ltarwmenu", TYPEMENU, umltarw, NULL, 1, US "rtarwmenu"},
187 {US "macros", TYPETW + EFIXXCOL, umacros, NULL, 0, NULL},
188 {US "markb", TYPETW + TYPEPW, umarkb, NULL, 0, NULL},
189 {US "markk", TYPETW + TYPEPW, umarkk, NULL, 0, NULL},
190 {US "markl", TYPETW + TYPEPW, umarkl, NULL, 0, NULL},
191 {US "math", TYPETW + TYPEPW, umath, NULL, 0, NULL},
192 {US "mathins", TYPETW + TYPEPW, umathins, NULL, 0, NULL},
193 {US "mathres", TYPETW + TYPEPW, umathres, NULL, 0, NULL},
194 {US "mode", TYPETW + TYPEPW + TYPEQW, umode, NULL, 0, NULL},
195 {US "msg", TYPETW + TYPEPW + TYPEQW + TYPEMENU, umsg, NULL, 0, NULL},
196 {US "nbuf", TYPETW, unbuf, NULL, 1, US "pbuf"},
197 {US "nedge", TYPETW + TYPEPW + EFIXXCOL, unedge, NULL, 1, US "pedge"},
198 {US "nextpos", TYPETW + TYPEPW + EFIXXCOL + EMID + EPOS, unextpos, NULL, 1, US "prevpos"},
199 {US "nextw", TYPETW + TYPEPW + TYPEMENU + TYPEQW, unextw, NULL, 1, US "prevw"},
200 {US "nextword", TYPETW + TYPEPW + EFIXXCOL, u_goto_next, NULL, 1, US "prevword"},
201 {US "nmark", TYPETW + TYPEPW, unmark, NULL, 0, NULL},
202 {US "nop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, unop, NULL, 0, NULL},
203 {US "notmod", TYPETW, unotmod, NULL, 0, NULL},
204 {US "nxterr", TYPETW, unxterr, NULL, 1, US "prverr"},
205 {US "open", TYPETW + TYPEPW + EFIXXCOL + EMOD, uopen, NULL, 1, US "deleol"},
206 {US "parserr", TYPETW, uparserr, NULL, 0, NULL},
207 {US "pbuf", TYPETW, upbuf, NULL, 1, US "nbuf"},
208 {US "pedge", TYPETW + TYPEPW + EFIXXCOL, upedge, NULL, 1, US "nedge"},
209 {US "pgdn", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, upgdn, NULL, 1, US "pgup"},
210 {US "pgdnmenu", TYPEMENU, umpgdn, NULL, 1, US "pgupmenu"},
211 {US "pgup", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, upgup, NULL, 1, US "pgdn"},
212 {US "pgupmenu", TYPEMENU, umpgup, NULL, 1, US "pgdnmenu"},
213 {US "picokill", TYPETW + TYPEPW + EFIXXCOL + EKILL + EMOD, upicokill, NULL, 1, NULL},
214 {US "play", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uplay, NULL, 1, NULL}, /* EFIXX? */
215 {US "pop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, upop, NULL, 0, NULL},
216 {US "prevpos", TYPETW + TYPEPW + EPOS + EMID + EFIXXCOL, uprevpos, NULL, 1, US "nextpos"},
217 {US "prevw", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uprevw, NULL, 1, US "nextw"},
218 {US "prevword", TYPETW + TYPEPW + EFIXXCOL + ECHKXCOL, u_goto_prev, NULL, 1, US "nextword"},
219 {US "prverr", TYPETW, uprverr, NULL, 1, US "nxterr"},
220 {US "psh", TYPETW + TYPEPW + TYPEMENU + TYPEQW, upsh, NULL, 0, NULL},
221 {US "qrepl", TYPETW + TYPEPW + EMOD, pqrepl, NULL, 0, NULL},
222 {US "query", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uquery, NULL, 0, NULL},
223 {US "querysave", TYPETW, uquerysave, NULL, 0, NULL},
224 {US "quote", TYPETW + TYPEPW + EMOD, uquote, NULL, 0, NULL},
225 {US "quote8", TYPETW + TYPEPW + EMOD, uquote8, NULL, 0, NULL},
226 {US "record", TYPETW + TYPEPW + TYPEMENU + TYPEQW, urecord, NULL, 0, NULL},
227 {US "redo", TYPETW + TYPEPW + EFIXXCOL, uredo, NULL, 1, US "undo"},
228 {US "retype", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uretyp, NULL, 0, NULL},
229 {US "rfirst", TYPETW + TYPEPW, prfirst, NULL, 0, NULL},
230 {US "rindent", TYPETW + TYPEPW + EFIXXCOL + EMOD + EBLOCK, urindent, NULL, 1, US "lindent"},
231 {US "rsrch", TYPETW + TYPEPW, ursrch, NULL, 0, NULL},
232 {US "rtarw", TYPETW + TYPEPW /* + EFIXXCOL */, u_goto_right, NULL, 1, US "ltarw"}, /* EFIX removed for picture mode */
233 {US "rtarwmenu", TYPEMENU, umrtarw, NULL, 1, US "ltarwmenu"},
234 {US "rtn", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOD, urtn, NULL, 1, NULL},
235 {US "run", TYPETW + TYPEPW, urun, NULL, 0, NULL},
236 {US "rvmatch", TYPETW + TYPEPW + EFIXXCOL, urvmatch, NULL, 0, NULL},
237 {US "save", TYPETW, usave, NULL, 0, NULL},
238 {US "scratch", TYPETW + TYPEPW, uscratch, NULL, 0, NULL},
239 {US "select", TYPETW + TYPEPW, uselect, NULL, 0, NULL},
240 {US "setmark", TYPETW + TYPEPW, usetmark, NULL, 0, NULL},
241 {US "shell", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ushell, NULL, 0, NULL},
242 {US "shrinkw", TYPETW, ushrnk, NULL, 1, US "groww"},
243 {US "splitw", TYPETW, usplitw, NULL, 0, NULL},
244 {US "stat", TYPETW + TYPEPW, ustat, NULL, 0, NULL},
245 {US "stop", TYPETW + TYPEPW + TYPEMENU + TYPEQW, ustop, NULL, 0, NULL},
246 {US "swap", TYPETW + TYPEPW + EFIXXCOL, uswap, NULL, 0, NULL},
247 {US "switch", TYPETW + TYPEPW, uswitch, NULL, 0, NULL},
248 {US "tabmenu", TYPEMENU, umtab, NULL, 1, US "ltarwmenu"},
249 {US "tag", TYPETW + TYPEPW, utag, NULL, 0, NULL},
250 {US "toggle_marking", TYPETW + TYPEPW, utoggle_marking, NULL, 0, NULL},
251 {US "tomarkb", TYPETW + TYPEPW + EFIXXCOL + EBLOCK, utomarkb, NULL, 0, NULL},
252 {US "tomarkbk", TYPETW + TYPEPW + EFIXXCOL + EBLOCK, utomarkbk, NULL, 0, NULL},
253 {US "tomarkk", TYPETW + TYPEPW + EFIXXCOL + EBLOCK, utomarkk, NULL, 0, NULL},
254 {US "tomatch", TYPETW + TYPEPW + EFIXXCOL, utomatch, NULL, 0, NULL},
255 {US "tos", TYPETW + TYPEPW + EMOVE, utos, NULL, 0, NULL},
256 {US "tw0", TYPETW + TYPEPW + TYPEQW + TYPEMENU, utw0, NULL, 0, NULL},
257 {US "tw1", TYPETW + TYPEPW + TYPEQW + TYPEMENU, utw1, NULL, 0, NULL},
258 {US "txt", TYPETW + TYPEPW, utxt, NULL, 0, NULL},
259 {US "type", TYPETW + TYPEPW + TYPEQW + TYPEMENU + EMINOR + EMOD, utype, NULL, 1, US "backs"},
260 {US "uarg", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uuarg, NULL, 0, NULL},
261 {US "undo", TYPETW + TYPEPW + EFIXXCOL, uundo, NULL, 1, US "redo"},
262 {US "uparw", TYPETW + TYPEPW + EMOVE, uuparw, NULL, 1, US "dnarw"},
263 {US "uparwmenu", TYPEMENU, umuparw, NULL, 1, US "dnarwmenu"},
264 {US "upper", TYPETW + TYPEPW + EMOD + EBLOCK, uupper, NULL, 0, NULL},
265 {US "upslide", TYPETW + TYPEPW + TYPEMENU + TYPEQW + EMOVE, uupslide, NULL, 1, US "dnslide"},
266 {US "yank", TYPETW + TYPEPW + EFIXXCOL + EMOD, uyank, NULL, 1, NULL},
267 {US "yankpop", TYPETW + TYPEPW + EFIXXCOL + EMOD, uyankpop, NULL, 1, NULL},
268 {US "yapp", TYPETW + TYPEPW + EKILL, uyapp, NULL, 0, NULL}
271 /* Execute a command n with key k */
273 int execmd(CMD *cmd, int k)
275 BW *bw = (BW *) maint->curwin->object;
278 /* Send data to shell window: this is broken ^K ^H (help) sends its ^H to shell */
279 if ((maint->curwin->watom->what & TYPETW) && bw->b->pid && piseof(bw->cursor) &&
280 (k==3 || k==13 || k==8 || k==127 || k==4 || ((cmd->func==utype) && (k>=32) && (k<256)))) {
282 joe_write(bw->b->out, &c, 1);
287 return exmacro(cmd->m, 0);
289 /* We don't execute if we have to fix the column position first
290 * (i.e., left arrow when cursor is in middle of nowhere) */
291 if (cmd->flag & ECHKXCOL) {
293 bw->cursor->xcol = piscol(bw->cursor);
294 else if (bw->cursor->xcol != piscol(bw->cursor))
298 /* Don't execute command if we're in wrong type of window */
299 if (!(cmd->flag & maint->curwin->watom->what))
302 /* Complete selection for block commands */
303 if ((cmd->flag & EBLOCK) && marking)
304 utoggle_marking(maint->curwin->object);
306 if ((maint->curwin->watom->what & TYPETW) && bw->b->rdonly && (cmd->flag & EMOD)) {
307 msgnw(bw->parent, US "Read only");
313 /* Execute command */
314 ret = cmd->func(maint->curwin->object, k);
319 /* Don't update anything if we're going to leave */
323 /* cmd->func could have changed bw on us */
324 bw = (BW *) maint->curwin->object;
326 /* Maintain position history */
327 /* If command was not a positioning command */
328 if (!(cmd->flag & EPOS)
329 && (maint->curwin->watom->what & (TYPETW | TYPEPW)))
332 /* If command was not a movement */
333 if (!(cmd->flag & (EMOVE | EPOS)) && (maint->curwin->watom->what & (TYPETW | TYPEPW)))
334 aftermove(maint->curwin, bw->cursor);
336 if (cmd->flag & EKILL)
343 /* Make dislayed cursor column equal the actual cursor column
344 * for commands which arn't simple vertical movements */
345 if (cmd->flag & EFIXXCOL)
346 bw->cursor->xcol = piscol(bw->cursor);
348 /* Recenter cursor to middle of screen */
349 if (cmd->flag & EMID) {
362 /* Return command table index for given command name */
364 HASH *cmdhash = NULL;
366 static void izcmds(void)
371 for (x = 0; x != sizeof(cmds) / sizeof(CMD); ++x)
372 htadd(cmdhash, cmds[x].name, cmds + x);
375 CMD *findcmd(unsigned char *s)
379 return (CMD *) htfind(cmdhash, s);
382 void addcmd(unsigned char *s, MACRO *m)
384 CMD *cmd = (CMD *) joe_malloc(sizeof(CMD));
388 cmd->name = (unsigned char *)strdup((char *)s);
394 htadd(cmdhash, cmd->name, cmd);
397 static unsigned char **getcmds(void)
399 unsigned char **s = vaensure(NULL, sizeof(cmds) / sizeof(CMD));
403 for (x = 0; x != cmdhash->len; ++x)
404 for (e = cmdhash->tab[x]; e; e = e->next)
405 s = vaadd(s, vsncpy(NULL, 0, sz(e->name)));
412 unsigned char **scmds = NULL; /* Array of command names */
414 static int cmdcmplt(BW *bw)
418 /*XXX simple_cmplt does p_goto_bol, better only to last comma */
419 return simple_cmplt(bw, scmds);
422 static int docmd(BW *bw, unsigned char *s, void *object, int *notify)
428 mac = mparse(NULL, s, &ret);
430 msgnw(bw->parent, US "No such command");
432 ret = exmacro(mac, 1);
436 vsrm(s); /* allocated in pw.c::rtnpw() */
446 if (wmkpw(bw->parent, US "cmd: ", &cmdhist, docmd, US "cmd", NULL, cmdcmplt, NULL, NULL, locale_map)) {
454 * Show help screen at a specific card
456 static int do_helpcard(BASE *base, unsigned char *s, void *object, int *notify)
458 struct help *new_help;
463 while (help_actual->prev != NULL)
464 /* find the first help entry */
465 help_actual = help_actual->prev;
466 help_off(base->parent->t);
469 if ((new_help = find_context_help(s)) != NULL) {
470 help_actual = new_help;
471 return (help_on(base->parent->t));
475 int u_helpcard(BASE *base)
477 if (wmkpw(base->parent, US "Name of help card to show: ", NULL,
478 do_helpcard, NULL, NULL, utypebw, NULL, NULL, locale_map)) {