Annotation of src/usr.bin/mg/keymap.c, Revision 1.2
1.1 deraadt 1: /*
2: * Keyboard maps. This is character set dependent.
3: * The terminal specific parts of building the
4: * keymap has been moved to a better place.
5: */
6: #include "def.h"
7: #include "kbd.h"
8:
9: /*
10: * Defined by "basic.c".
11: */
12: extern int gotobol(); /* Move to start of line */
13: extern int backchar(); /* Move backward by characters */
14: extern int gotoeol(); /* Move to end of line */
15: extern int forwchar(); /* Move forward by characters */
16: extern int gotobob(); /* Move to start of buffer */
17: extern int gotoeob(); /* Move to end of buffer */
18: extern int forwline(); /* Move forward by lines */
19: extern int backline(); /* Move backward by lines */
20: extern int forwpage(); /* Move forward by pages */
21: extern int backpage(); /* Move backward by pages */
22: extern int pagenext(); /* Page forward next window */
23: extern int setmark(); /* Set mark */
24: extern int swapmark(); /* Swap "." and mark */
25: extern int gotoline(); /* Go to a specified line. */
26: #ifdef GOSMACS
27: extern int forw1page(); /* move forward by lines */
28: extern int back1page(); /* move back by lines */
29: #endif
30:
31: /*
32: * Defined by "buffer.c".
33: */
34: extern int listbuffers(); /* Display list of buffers */
35: extern int usebuffer(); /* Switch a window to a buffer */
36: extern int poptobuffer(); /* Other window to a buffer */
37: extern int killbuffer(); /* Make a buffer go away. */
38: extern int savebuffers(); /* Save unmodified buffers */
39: extern int bufferinsert(); /* Insert buffer into another */
40: extern int notmodified(); /* Reset modification flag */
41:
42: #ifndef NO_DIR
43: /*
44: * Defined by "dir.c"
45: */
46: extern int changedir(); /* change current directory */
47: extern int showcwdir(); /* show current directory */
48:
49: #ifndef NO_DIRED
50: /*
51: * defined by "dired.c"
52: */
53: extern int dired(); /* dired */
54: extern int d_findfile(); /* dired find file */
55: extern int d_del(); /* dired mark for deletion */
56: extern int d_undel(); /* dired unmark */
57: extern int d_undelbak(); /* dired unmark backwards */
58: extern int d_expunge(); /* dired expunge */
59: extern int d_copy(); /* dired copy */
60: extern int d_rename(); /* dired rename */
61: extern int d_otherwindow(); /* dired other window */
62: extern int d_ffotherwindow(); /* dired find file other window */
63: #endif
64: #endif
65:
66: /*
67: * Defined by "extend.c".
68: */
69: extern int extend(); /* Extended commands. */
70: extern int bindtokey(); /* Modify global key bindings. */
71: extern int localbind(); /* Modify mode key bindings. */
72: extern int define_key(); /* modify any key map */
73: extern int unbindtokey(); /* delete global binding */
74: extern int localunbind(); /* delete local binding */
75: extern int insert(); /* insert string */
76: #ifndef NO_STARTUP
77: extern int evalexpr(); /* Extended commands (again) */
78: extern int evalbuffer(); /* Evaluate current buffer */
79: extern int evalfile(); /* Evaluate a file */
80: #endif
81:
82: /*
83: * Defined by "file.c".
84: */
85: extern int filevisit(); /* Get a file, read write */
86: extern int poptofile(); /* Get a file, other window */
87: extern int filewrite(); /* Write a file */
88: extern int filesave(); /* Save current file */
89: extern int fileinsert(); /* Insert file into buffer */
90: #ifndef NO_BACKUP
91: extern int makebkfile(); /* Control backups on saves */
92: #endif
93:
94: /*
95: * defined by help.c
96: */
97: #ifndef NO_HELP
98: extern int desckey(); /* describe key */
99: extern int wallchart(); /* Make wall chart. */
100: extern int help_help(); /* help help */
101: extern int apropos_command(); /* apropos */
102: #endif
103:
104: /*
105: * defined by "kbd.c"
106: */
107: #ifdef DO_METAKEY
108: extern int do_meta(); /* interpret meta keys */
109: #endif
110: #ifdef BSMAP
111: extern int bsmap(); /* backspace mapping */
112: #endif
113: extern int universal_argument(); /* Ctrl-U */
114: extern int digit_argument(); /* M-1, etc. */
115: extern int negative_argument(); /* M-- */
116: extern int selfinsert(); /* Insert character */
117: extern int rescan(); /* internal try again function */
118:
119: /*
120: * defined by "macro.c"
121: */
122: #ifndef NO_MACRO
123: extern int definemacro(); /* Begin macro */
124: extern int finishmacro(); /* End macro */
125: extern int executemacro(); /* Execute macro */
126: #endif
127:
128: /*
129: * Defined by "main.c".
130: */
131: extern int ctrlg(); /* Abort out of things */
132: extern int quit(); /* Quit */
133:
134: /*
135: * Defined by "match.c"
136: */
137: extern int showmatch(); /* Hack to show matching paren */
138:
139: /* defined by "modes.c" */
140:
141: extern int indentmode(); /* set auto-indent mode */
142: extern int fillmode(); /* set word-wrap mode */
143: extern int blinkparen(); /* Fake blink-matching-paren var */
144: #ifdef NOTAB
145: extern int notabmode(); /* no tab mode */
146: #endif
147: extern int overwrite(); /* overwrite mode */
148: extern int set_default_mode(); /* set default modes */
149:
150: /*
151: * defined by "paragraph.c" - the paragraph justification code.
152: */
153: extern int gotobop(); /* Move to start of paragraph. */
154: extern int gotoeop(); /* Move to end of paragraph. */
155: extern int fillpara(); /* Justify a paragraph. */
156: extern int killpara(); /* Delete a paragraph. */
157: extern int setfillcol(); /* Set fill column for justify. */
158: extern int fillword(); /* Insert char with word wrap. */
159:
160: /*
161: * Defined by "random.c".
162: */
163: extern int showcpos(); /* Show the cursor position */
164: extern int twiddle(); /* Twiddle characters */
165: extern int quote(); /* Insert literal */
166: extern int openline(); /* Open up a blank line */
167: extern int newline(); /* Insert newline */
168: extern int deblank(); /* Delete blank lines */
169: extern int justone(); /* Delete extra whitespace */
170: extern int delwhite(); /* Delete all whitespace */
171: extern int indent(); /* Insert newline, then indent */
172: extern int forwdel(); /* Forward delete */
173: extern int backdel(); /* Backward delete in */
174: extern int killline(); /* Kill forward */
175: extern int yank(); /* Yank back from killbuffer. */
176: #ifdef NOTAB
177: extern int space_to_tabstop();
178: #endif
179:
180: #ifdef REGEX
181: /*
182: * Defined by "re_search.c"
183: */
184: extern int re_forwsearch(); /* Regex search forward */
185: extern int re_backsearch(); /* Regex search backwards */
186: extern int re_searchagain(); /* Repeat regex search command */
187: extern int re_queryrepl(); /* Regex query replace */
188: extern int setcasefold(); /* Set case fold in searches */
189: extern int delmatchlines(); /* Delete all lines matching */
190: extern int delnonmatchlines(); /* Delete all lines not matching */
191: extern int cntmatchlines(); /* Count matching lines */
192: extern int cntnonmatchlines(); /* Count nonmatching lines */
193: #endif
194:
195: /*
196: * Defined by "region.c".
197: */
198: extern int killregion(); /* Kill region. */
199: extern int copyregion(); /* Copy region to kill buffer. */
200: extern int lowerregion(); /* Lower case region. */
201: extern int upperregion(); /* Upper case region. */
202: #ifdef PREFIXREGION
203: extern int prefixregion(); /* Prefix all lines in region */
204: extern int setprefix(); /* Set line prefix string */
205: #endif
206:
207: /*
208: * Defined by "search.c".
209: */
210: extern int forwsearch(); /* Search forward */
211: extern int backsearch(); /* Search backwards */
212: extern int searchagain(); /* Repeat last search command */
213: extern int forwisearch(); /* Incremental search forward */
214: extern int backisearch(); /* Incremental search backwards */
215: extern int queryrepl(); /* Query replace */
216:
217: /*
218: * Defined by "spawn.c".
219: */
220: extern int spawncli(); /* Run CLI in a subjob. */
1.2 ! millert 221: #ifdef VMS
1.1 deraadt 222: extern int attachtoparent(); /* Attach to parent process */
1.2 ! millert 223: #endif
1.1 deraadt 224:
225: /* defined by "version.c" */
226:
227: extern int showversion(); /* Show version numbers, etc. */
228:
229: /*
230: * Defined by "window.c".
231: */
232: extern int reposition(); /* Reposition window */
233: extern int refresh(); /* Refresh the screen */
234: extern int nextwind(); /* Move to the next window */
235: #ifdef GOSMACS
236: extern int prevwind(); /* Move to the previous window */
237: #endif
238: extern int onlywind(); /* Make current window only one */
239: extern int splitwind(); /* Split current window */
240: extern int delwind(); /* Delete current window */
241: extern int enlargewind(); /* Enlarge display window. */
242: extern int shrinkwind(); /* Shrink window. */
243:
244: /*
245: * Defined by "word.c".
246: */
247: extern int backword(); /* Backup by words */
248: extern int forwword(); /* Advance by words */
249: extern int upperword(); /* Upper case word. */
250: extern int lowerword(); /* Lower case word. */
251: extern int capword(); /* Initial capitalize word. */
252: extern int delfword(); /* Delete forward word. */
253: extern int delbword(); /* Delete backward word. */
254:
255: #ifdef AMIGA
256: #ifdef DO_ICONIFY
257: extern int tticon();
258: #endif
259: #ifdef DO_MENU
260: extern int amigamenu(); /* Menu function */
261: #endif
262: #ifdef MOUSE
263: extern int amigamouse(); /* Amiga mouse functions */
264: extern int mgotobob();
265: extern int mforwdel();
266: extern int mdelwhite();
267: extern int mdelwind();
268: extern int mgotoeob();
269: extern int menlargewind();
270: extern int mkillline();
271: extern int mkillregion();
272: extern int mdelfword();
273: extern int mreposition();
274: extern int mbackpage();
275: extern int mforwpage();
276: extern int mshrinkwind();
277: extern int msplitwind();
278: extern int myank();
279: #endif MOUSE
280:
281: extern int togglewindow(); /* Defined by "ttyio.c" */
282: extern int togglezooms(); /* "" "" */
283:
284: #ifdef CHANGE_FONT
285: extern int setfont(); /* Defined by "ttyio.c" */
286: #endif
287:
288: #ifdef CHANGE_COLOR
289: /* functions to mess with the mode line rendition, window colors*/
290: extern int ttmode(); /* Defined by "tty.c" */
291: extern int tttext(); /* "" */
292: extern int textforeground(); /* "" */
293: extern int textbackground(); /* "" */
294: extern int modeforeground(); /* "" */
295: extern int modebackground(); /* "" */
296: #endif
297:
298: /*
299: * This file contains map segment definitions for adding function keys to
300: * keymap declarations. Currently you can add things to the fundamental
301: * mode keymap and the dired mode keymap. See the declaration of
302: * diredmap and fundmap for details.
303: */
304: #include "amiga_maps.c"
305:
306: #endif /* AMIGA */
307:
308: /* initial keymap declarations, deepest first */
309:
310: #ifndef NO_HELP
311: static PF cHcG[] = {
312: ctrlg, /* ^G */
313: help_help, /* ^H */
314: };
315: static PF cHa[] = {
316: apropos_command,/* a */
317: wallchart, /* b */
318: desckey, /* c */
319: };
320: static struct KEYMAPE(2+IMAPEXT) helpmap = {
321: 2,
322: 2+IMAPEXT,
323: rescan,
324: {
325: {CCHR('G'),CCHR('H'), cHcG, (KEYMAP *)NULL},
326: {'a', 'c', cHa, (KEYMAP *)NULL},
327: }
328: };
329: #endif
330:
331: static struct KEYMAPE(1+IMAPEXT) extramap1 = {
332: 0,
333: 1+IMAPEXT,
334: rescan
335: };
336:
337: static struct KEYMAPE(1+IMAPEXT) extramap2 = {
338: 0,
339: 1+IMAPEXT,
340: rescan
341: };
342:
343: static struct KEYMAPE(1+IMAPEXT) extramap3 = {
344: 0,
345: 1+IMAPEXT,
346: rescan
347: };
348:
349: static struct KEYMAPE(1+IMAPEXT) extramap4 = {
350: 0,
351: 1+IMAPEXT,
352: rescan
353: };
354:
355: static struct KEYMAPE(1+IMAPEXT) extramap5 = {
356: 0,
357: 1+IMAPEXT,
358: rescan
359: };
360:
361: static PF cX4cF[] = {
362: poptofile, /* ^f */
363: ctrlg, /* ^g */
364: };
365: static PF cX4b[] = {
366: poptobuffer, /* b */
367: rescan, /* c */
368: rescan, /* d */
369: rescan, /* e */
370: poptofile, /* f */
371: };
372: static struct KEYMAPE(2+IMAPEXT) cX4map = {
373: 2,
374: 2+IMAPEXT,
375: rescan,
376: {
377: {CCHR('F'),CCHR('G'), cX4cF, (KEYMAP *)NULL},
378: {'b', 'f', cX4b, (KEYMAP *)NULL},
379: }
380: };
381:
382: static PF cXcB[] = {
383: listbuffers, /* ^B */
384: quit, /* ^C */
385: rescan, /* ^D */
386: rescan, /* ^E */
387: filevisit, /* ^F */
388: ctrlg, /* ^G */
389: };
390: static PF cXcL[] = {
391: lowerregion, /* ^L */
392: rescan, /* ^M */
393: rescan, /* ^N */
394: deblank, /* ^O */
395: rescan, /* ^P */
396: rescan, /* ^Q */
397: rescan, /* ^R */
398: filesave, /* ^S */
399: rescan, /* ^T */
400: upperregion, /* ^U */
401: rescan, /* ^V */
402: filewrite, /* ^W */
403: swapmark, /* ^X */
404: };
405: #ifndef NO_MACRO
406: static PF cXlp[] = {
407: definemacro, /* ( */
408: finishmacro, /* ) */
409: };
410: #endif
411: static PF cX0[] = {
412: delwind, /* 0 */
413: onlywind, /* 1 */
414: splitwind, /* 2 */
415: rescan, /* 3 */
416: prefix, /* 4 */
417: };
418: static PF cXeq[] = {
419: showcpos, /* = */
420: };
421: static PF cXcar[] = {
422: enlargewind, /* ^ */
423: rescan, /* _ */
424: rescan, /* ` */
425: rescan, /* a */
426: usebuffer, /* b */
427: rescan, /* c */
428: #ifndef NO_DIRED
429: dired, /* d */
430: #else
431: rescan, /* d */
432: #endif
433: #ifndef NO_MACRO
434: executemacro, /* e */
435: #else
436: rescan, /* e */
437: #endif
438: setfillcol, /* f */
439: rescan, /* g */
440: rescan, /* h */
441: fileinsert, /* i */
442: rescan, /* j */
443: killbuffer, /* k */
444: rescan, /* l */
445: rescan, /* m */
446: rescan, /* n */
447: nextwind, /* o */
448: rescan, /* p */
449: rescan, /* q */
450: rescan, /* r */
451: savebuffers, /* s */
452: };
453: #ifndef NO_MACRO
454: static struct KEYMAPE(6+IMAPEXT) cXmap = {
455: 6,
456: 6+IMAPEXT,
457: #else
458: static struct KEYMAPE(5+IMAPEXT) cXmap = {
459: 5,
460: 5+IMAPEXT,
461: #endif
462: rescan,
463: {
464: {CCHR('B'),CCHR('G'), cXcB, (KEYMAP *)NULL},
465: {CCHR('L'),CCHR('X'), cXcL, (KEYMAP *)NULL},
466: #ifndef NO_MACRO
467: {'(', ')', cXlp, (KEYMAP *)NULL},
468: #endif
469: {'0', '4', cX0, (KEYMAP *)&cX4map},
470: {'=', '=', cXeq, (KEYMAP *)NULL},
471: {'^', 's', cXcar, (KEYMAP *)NULL},
472: }
473: };
474:
475: static PF metacG[] = {
476: ctrlg, /* ^G */
477: };
478: static PF metacV[] = {
479: pagenext, /* ^V */
480: };
481: static PF metasp[] = {
482: justone, /* space */
483: };
484: static PF metapct[] = {
485: queryrepl, /* % */
486: };
487: static PF metami[] = {
488: negative_argument, /* - */
489: rescan, /* . */
490: rescan, /* / */
491: digit_argument, /* 0 */
492: digit_argument, /* 1 */
493: digit_argument, /* 2 */
494: digit_argument, /* 3 */
495: digit_argument, /* 4 */
496: digit_argument, /* 5 */
497: digit_argument, /* 6 */
498: digit_argument, /* 7 */
499: digit_argument, /* 8 */
500: digit_argument, /* 9 */
501: rescan, /* : */
502: rescan, /* ; */
503: gotobob, /* < */
504: rescan, /* = */
505: gotoeob, /* > */
506: };
507: static PF metalb[] = {
508: gotobop, /* [ */
509: delwhite, /* \ */
510: gotoeop, /* ] */
511: rescan, /* ^ */
512: rescan, /* _ */
513: rescan, /* ` */
514: rescan, /* a */
515: backword, /* b */
516: capword, /* c */
517: delfword, /* d */
518: rescan, /* e */
519: forwword, /* f */
520: };
521: static PF metal[] = {
522: lowerword, /* l */
523: rescan, /* m */
524: rescan, /* n */
525: rescan, /* o */
526: rescan, /* p */
527: fillpara, /* q */
528: backsearch, /* r */
529: forwsearch, /* s */
530: rescan, /* t */
531: upperword, /* u */
532: backpage, /* v */
533: copyregion, /* w */
534: extend, /* x */
535: };
536: static PF metatilde[] = {
537: notmodified, /* ~ */
538: delbword, /* DEL */
539: };
540: static struct KEYMAPE(8+IMAPEXT) metamap = {
541: 8,
542: 8+IMAPEXT,
543: rescan,
544: {
545: {CCHR('G'),CCHR('G'), metacG, (KEYMAP *)NULL},
546: {CCHR('V'),CCHR('V'), metacV, (KEYMAP *)NULL},
547: {' ', ' ', metasp, (KEYMAP *)NULL},
548: {'%', '%', metapct,(KEYMAP *)NULL},
549: {'-', '>', metami, (KEYMAP *)NULL},
550: {'[', 'f', metalb, (KEYMAP *)NULL},
551: {'l', 'x', metal, (KEYMAP *)NULL},
552: {'~', CCHR('?'), metatilde,(KEYMAP *)NULL},
553: }
554: };
555:
556: static PF fund_at[] = {
557: setmark, /* ^@ */
558: gotobol, /* ^A */
559: backchar, /* ^B */
560: rescan, /* ^C */
561: forwdel, /* ^D */
562: gotoeol, /* ^E */
563: forwchar, /* ^F */
564: ctrlg, /* ^G */
565: #ifndef NO_HELP
566: prefix, /* ^H */
567: #else
568: rescan, /* ^H */
569: #endif
570: };
571: /* ^I is selfinsert */
572: static PF fund_CJ[] = {
573: indent, /* ^J */
574: killline, /* ^K */
575: reposition, /* ^L */
576: newline, /* ^M */
577: forwline, /* ^N */
578: openline, /* ^O */
579: backline, /* ^P */
580: quote, /* ^Q */
581: backisearch, /* ^R */
582: forwisearch, /* ^S */
583: twiddle, /* ^T */
584: universal_argument, /* ^U */
585: forwpage, /* ^V */
586: killregion, /* ^W */
587: prefix, /* ^X */
588: yank, /* ^Y */
1.2 ! millert 589: #ifndef VMS
! 590: spawncli, /* ^Z */
! 591: #else
1.1 deraadt 592: attachtoparent, /* ^Z */
1.2 ! millert 593: #endif
1.1 deraadt 594: };
595: static PF fund_esc[] = {
596: prefix, /* esc */
597: rescan, /* ^\ */ /* selfinsert is default on fundamental */
598: rescan, /* ^] */
599: rescan, /* ^^ */
600: rescan, /* ^_ */
601: };
602: static PF fund_del[] = {
603: backdel, /* DEL */
604: };
605:
606: #ifndef FUND_XMAPS
607: #define NFUND_XMAPS 0 /* extra map sections after normal ones */
608: #endif
609:
610: static struct KEYMAPE(4+NFUND_XMAPS+IMAPEXT) fundmap = {
611: 4 + NFUND_XMAPS,
612: 4 + NFUND_XMAPS + IMAPEXT,
613: selfinsert,
614: {
615: #ifndef NO_HELP
616: {CCHR('@'),CCHR('H'), fund_at, (KEYMAP *)&helpmap},
617: #else
618: {CCHR('@'),CCHR('H'), fund_at, (KEYMAP *)NULL},
619: #endif
620: {CCHR('J'),CCHR('Z'), fund_CJ, (KEYMAP *)&cXmap},
621: {CCHR('['),CCHR('_'), fund_esc,(KEYMAP *)&metamap},
622: {CCHR('?'),CCHR('?'), fund_del,(KEYMAP *)NULL},
623: #ifdef FUND_XMAPS
624: FUND_XMAPS,
625: #endif
626: }
627: };
628:
629: static PF fill_sp[] = {
630: fillword, /* ' ' */
631: };
632: static struct KEYMAPE(1+IMAPEXT) fillmap = {
633: 1,
634: 1+IMAPEXT,
635: rescan,
636: {
637: {' ', ' ', fill_sp, (KEYMAP *)NULL},
638: }
639: };
640:
641: static PF indent_lf[] = {
642: newline, /* ^J */
643: rescan, /* ^K */
644: rescan, /* ^L */
645: indent, /* ^M */
646: };
647: static struct KEYMAPE(1+IMAPEXT) indntmap = {
648: 1,
649: 1+IMAPEXT,
650: rescan,
651: {
652: {CCHR('J'), CCHR('M'), indent_lf, (KEYMAP *)NULL},
653: }
654: };
655: static PF blink_rp[] = {
656: showmatch, /* ) */
657: };
658: static struct KEYMAPE(1+IMAPEXT) blinkmap = {
659: 1,
660: 1+IMAPEXT,
661: rescan,
662: {
663: {')', ')', blink_rp, (KEYMAP *)NULL},
664: }
665: };
666:
667: #ifdef NOTAB
668: static PF notab_tab[] = {
669: space_to_tabstop, /* ^I */
670: };
671: static struct KEYMAPE(1+IMAPEXT) notabmap = {
672: 1,
673: 1+IMAPEXT,
674: rescan,
675: {
676: {CCHR('I'),CCHR('I'), notab_tab, (KEYMAP *)NULL},
677: }
678: };
679: #endif
680:
681: static struct KEYMAPE(1+IMAPEXT) overwmap = {
682: 0,
683: 1+IMAPEXT, /* 1 to avoid 0 sized array */
684: rescan,
685: {
686: /* unused dummy entry for VMS C */
687: {(KCHAR)0, (KCHAR)0, (PF *)NULL, (KEYMAP *)NULL},
688: }
689: };
690:
691: #ifndef NO_DIRED
692: static PF dirednul[] = {
693: setmark, /* ^@ */
694: gotobol, /* ^A */
695: backchar, /* ^B */
696: rescan, /* ^C */
697: d_del, /* ^D */
698: gotoeol, /* ^E */
699: forwchar, /* ^F */
700: ctrlg, /* ^G */
701: #ifndef NO_HELP
702: prefix, /* ^H */
703: #endif
704: };
705: static PF diredcl[] = {
706: reposition, /* ^L */
707: forwline, /* ^M */
708: forwline, /* ^N */
709: rescan, /* ^O */
710: backline, /* ^P */
711: rescan, /* ^Q */
712: backisearch, /* ^R */
713: forwisearch, /* ^S */
714: rescan, /* ^T */
715: universal_argument, /* ^U */
716: forwpage, /* ^V */
717: rescan, /* ^W */
718: prefix, /* ^X */
719: };
720: static PF diredcz[] = {
1.2 ! millert 721: #ifndef VMS
! 722: spawncli, /* ^Z */
! 723: #else
1.1 deraadt 724: attachtoparent, /* ^Z */
1.2 ! millert 725: #endif
1.1 deraadt 726: prefix, /* esc */
727: rescan, /* ^\ */
728: rescan, /* ^] */
729: rescan, /* ^^ */
730: rescan, /* ^_ */
731: forwline, /* SP */
732: };
733: static PF diredc[] = {
734: d_copy, /* c */
735: d_del, /* d */
736: d_findfile, /* e */
737: d_findfile, /* f */
738: };
739: static PF diredn[] = {
740: forwline, /* n */
741: d_ffotherwindow,/* o */
742: backline, /* p */
743: rescan, /* q */
744: d_rename, /* r */
745: rescan, /* s */
746: rescan, /* t */
747: d_undel, /* u */
748: rescan, /* v */
749: rescan, /* w */
750: d_expunge, /* x */
751: };
752: static PF direddl[] = {
753: d_undelbak, /* del */
754: };
755:
756: #ifndef DIRED_XMAPS
757: #define NDIRED_XMAPS 0 /* number of extra map sections */
758: #endif
759:
760: static struct KEYMAPE(6 + NDIRED_XMAPS + IMAPEXT) diredmap = {
761: 6 + NDIRED_XMAPS,
762: 6 + NDIRED_XMAPS + IMAPEXT,
763: rescan,
764: {
765: #ifndef NO_HELP
766: {CCHR('@'), CCHR('H'), dirednul, (KEYMAP *)&helpmap},
767: #else
768: {CCHR('@'), CCHR('G'), dirednul, (KEYMAP *)NULL},
769: #endif
770: {CCHR('L'), CCHR('X'), diredcl, (KEYMAP *)&cXmap},
771: {CCHR('Z'), ' ', diredcz, (KEYMAP *)&metamap},
772: {'c', 'f', diredc, (KEYMAP *)NULL},
773: {'n', 'x', diredn, (KEYMAP *)NULL},
774: {CCHR('?'), CCHR('?'), direddl, (KEYMAP *)NULL},
775: #ifdef DIRED_XMAPS
776: DIRED_XMAPS, /* map sections for dired mode keys */
777: #endif
778: }
779: };
780: #endif
781:
782: /* give names to the maps, for use by help etc.
783: * If the map is to be bindable, it must also be listed in the
784: * function name table below with the same name.
785: * Maps created dynamicly currently don't get added here, thus are unnamed.
786: * Modes are just named keymaps with functions to add/subtract them from
787: * a buffer's list of modes. If you change a mode name, change it in
788: * modes.c also.
789: */
790:
791: MAPS map_table[] = {
792: /* fundamental map MUST be first entry */
793: {(KEYMAP *)&fundmap, "fundamental"},
794: {(KEYMAP *)&fillmap, "fill"},
795: {(KEYMAP *)&indntmap, "indent"},
796: {(KEYMAP *)&blinkmap, "blink"},
797: #ifdef NOTAB
798: {(KEYMAP *)¬abmap, "notab"},
799: #endif
800: {(KEYMAP *)&overwmap, "overwrite"},
801: {(KEYMAP *)&metamap, "esc prefix"},
802: {(KEYMAP *)&cXmap, "c-x prefix"},
803: {(KEYMAP *)&cX4map, "c-x 4 prefix"},
804: {(KEYMAP *)&extramap1, "extra prefix 1"},
805: {(KEYMAP *)&extramap2, "extra prefix 2"},
806: {(KEYMAP *)&extramap3, "extra prefix 3"},
807: {(KEYMAP *)&extramap4, "extra prefix 4"},
808: {(KEYMAP *)&extramap5, "extra prefix 5"},
809: #ifndef NO_HELP
810: {(KEYMAP *)&helpmap, "help"},
811: #endif
812: #ifndef NO_DIRED
813: {(KEYMAP *)&diredmap, "dired"},
814: #endif
815: };
816:
817: #define NMAPS (sizeof map_table/sizeof(MAPS))
818: int nmaps = NMAPS; /* for use by rebind in extend.c */
819:
820: char *map_name(map)
821: KEYMAP *map;
822: {
823: MAPS *mp = &map_table[0];
824:
825: do {
826: if(mp->p_map == map) return mp->p_name;
827: } while(++mp < &map_table[NMAPS]);
828: return (char *)NULL;
829: }
830:
831: MAPS *name_mode(name)
832: char *name;
833: {
834: MAPS *mp = &map_table[0];
835:
836: do {
837: if(strcmp(mp->p_name,name)==0) return mp;
838: } while(++mp < &map_table[NMAPS]);
839: return (MAPS *)NULL;
840: }
841:
842: KEYMAP *name_map(name)
843: char *name;
844: {
845: MAPS *mp;
846: return (mp=name_mode(name))==NULL ? (KEYMAP *)NULL : mp->p_map;
847: }
848:
849: /* Warning: functnames MUST be in alphabetical order! (due to binary
850: * search in name_function.) If the function is prefix, it must be listed
851: * with the same name in the map_table above.
852: */
853:
854: FUNCTNAMES functnames[] = {
855: #ifdef AMIGA
856: #ifdef DO_ICONIFY
857: {tticon, "amiga-iconify"},
858: #endif
859: #ifdef DO_MENU
860: {amigamenu, "amiga-menu"},
861: #endif
862: #ifdef CHANGE_COLOR
863: {modebackground,"amiga-mode-background"},
864: {modeforeground,"amiga-mode-foreground"},
865: {ttmode, "amiga-mode-rendition"},
866: #endif
867: #ifdef CHANGE_FONT
868: {setfont, "amiga-set-font"},
869: #endif
870: #ifdef CHANGE_COLOR
871: {textbackground,"amiga-text-background"},
872: {textforeground,"amiga-text-foreground"},
873: {tttext, "amiga-text-rendition"},
874: #endif
875: {togglewindow, "amiga-toggle-border"},
876: {togglezooms, "amiga-zoom-mode"},
877: #endif /* AMIGA */
878: #ifndef NO_HELP
879: {apropos_command, "apropos"},
880: #endif
881: {fillmode, "auto-fill-mode"},
882: {indentmode, "auto-indent-mode"},
883: {backchar, "backward-char"},
884: {delbword, "backward-kill-word"},
885: {gotobop, "backward-paragraph"},
886: {backword, "backward-word"},
887: {gotobob, "beginning-of-buffer"},
888: {gotobol, "beginning-of-line"},
889: {blinkparen, "blink-matching-paren"},
890: {showmatch, "blink-matching-paren-hack"},
891: #ifdef BSMAP
892: {bsmap, "bsmap-mode"},
893: #endif
894: {prefix, "c-x 4 prefix"},
895: {prefix, "c-x prefix"},
896: #ifndef NO_MACRO
897: {executemacro, "call-last-kbd-macro"},
898: #endif
899: {capword, "capitalize-word"},
900: #ifndef NO_DIR
901: {changedir, "cd"},
902: #endif
903: {copyregion, "copy-region-as-kill"},
904: #ifdef REGEX
905: {cntmatchlines, "count-matches"},
906: {cntnonmatchlines,"count-non-matches"},
907: #endif
908: {define_key, "define-key"},
909: {backdel, "delete-backward-char"},
910: {deblank, "delete-blank-lines"},
911: {forwdel, "delete-char"},
912: {delwhite, "delete-horizontal-space"},
913: #ifdef REGEX
914: {delmatchlines, "delete-matching-lines"},
915: {delnonmatchlines,"delete-non-matching-lines"},
916: #endif
917: {onlywind, "delete-other-windows"},
918: {delwind, "delete-window"},
919: #ifndef NO_HELP
920: {wallchart, "describe-bindings"},
921: {desckey, "describe-key-briefly"},
922: #endif
923: {digit_argument,"digit-argument"},
924: #ifndef NO_DIRED
925: {dired, "dired"},
926: {d_undelbak, "dired-backup-unflag"},
927: {d_copy, "dired-copy-file"},
928: {d_expunge, "dired-do-deletions"},
929: {d_findfile, "dired-find-file"},
930: {d_ffotherwindow, "dired-find-file-other-window"},
931: {d_del, "dired-flag-file-deleted"},
932: {d_otherwindow, "dired-other-window"},
933: {d_rename, "dired-rename-file"},
934: {d_undel, "dired-unflag"},
935: #endif
936: {lowerregion, "downcase-region"},
937: {lowerword, "downcase-word"},
938: {showversion, "emacs-version"},
939: #ifndef NO_MACRO
940: {finishmacro, "end-kbd-macro"},
941: #endif
942: {gotoeob, "end-of-buffer"},
943: {gotoeol, "end-of-line"},
944: {enlargewind, "enlarge-window"},
945: {prefix, "esc prefix"},
946: #ifndef NO_STARTUP
947: {evalbuffer, "eval-current-buffer"},
948: {evalexpr, "eval-expression"},
949: #endif
950: {swapmark, "exchange-point-and-mark"},
951: {extend, "execute-extended-command"},
952: {prefix, "extra prefix 1"},
953: {prefix, "extra prefix 2"},
954: {prefix, "extra prefix 3"},
955: {prefix, "extra prefix 4"},
956: {prefix, "extra prefix 5"},
957: {fillpara, "fill-paragraph"},
958: {filevisit, "find-file"},
959: {poptofile, "find-file-other-window"},
960: {forwchar, "forward-char"},
961: {gotoeop, "forward-paragraph"},
962: {forwword, "forward-word"},
963: {bindtokey, "global-set-key"},
964: {unbindtokey, "global-unset-key"},
965: {gotoline, "goto-line"},
966: #ifndef NO_HELP
967: {prefix, "help"},
968: {help_help, "help-help"},
969: #endif
970: {insert, "insert"},
971: {bufferinsert, "insert-buffer"},
972: {fileinsert, "insert-file"},
973: {fillword, "insert-with-wrap"},
974: {backisearch, "isearch-backward"},
975: {forwisearch, "isearch-forward"},
976: {justone, "just-one-space"},
977: {ctrlg, "keyboard-quit"},
978: {killbuffer, "kill-buffer"},
979: {killline, "kill-line"},
980: {killpara, "kill-paragraph"},
981: {killregion, "kill-region"},
982: {delfword, "kill-word"},
983: {listbuffers, "list-buffers"},
984: #ifndef NO_STARTUP
985: {evalfile, "load"},
986: #endif
987: {localbind, "local-set-key"},
988: {localunbind, "local-unset-key"},
989: #ifndef NO_BACKUP
990: {makebkfile, "make-backup-files"},
991: #endif
992: #ifdef DO_METAKEY
993: {do_meta, "meta-key-mode"}, /* better name, anyone? */
994: #endif
995: #ifdef AMIGA
996: #ifdef MOUSE
997: {mgotobob, "mouse-beginning-of-buffer"},
998: {mforwdel, "mouse-delete-char"},
999: {mdelwhite, "mouse-delete-horizontal-space"},
1000: {mdelwind, "mouse-delete-window"},
1001: {mgotoeob, "mouse-end-of-buffer"},
1002: {menlargewind, "mouse-enlarge-window"},
1003: {mkillline, "mouse-kill-line"},
1004: {mkillregion, "mouse-kill-region"},
1005: {mdelfword, "mouse-kill-word"},
1006: {mreposition, "mouse-recenter"},
1007: {mbackpage, "mouse-scroll-down"},
1008: {mforwpage, "mouse-scroll-up"},
1009: {amigamouse, "mouse-set-point"},
1010: {mshrinkwind, "mouse-shrink-window"},
1011: {msplitwind, "mouse-split-window-vertically"},
1012: {myank, "mouse-yank"},
1013: #endif
1014: #endif
1015: {negative_argument, "negative-argument"},
1016: {newline, "newline"},
1017: {indent, "newline-and-indent"},
1018: {forwline, "next-line"},
1019: #ifdef NOTAB
1020: {notabmode, "no-tab-mode"},
1021: #endif
1022: {notmodified, "not-modified"},
1023: {openline, "open-line"},
1024: {nextwind, "other-window"},
1025: {overwrite, "overwrite-mode"},
1026: #ifdef PREFIXREGION
1027: {prefixregion, "prefix-region"},
1028: #endif
1029: {backline, "previous-line"},
1030: #ifdef GOSMACS
1031: {prevwind, "previous-window"},
1032: #endif
1033: #ifdef VMS
1034: {spawncli, "push-to-dcl"},
1035: #else
1036: {spawncli, "push-shell"},
1037: #endif
1038: #ifndef NO_DIR
1039: {showcwdir, "pwd"},
1040: #endif
1041: {queryrepl, "query-replace"},
1042: #ifdef REGEX
1043: {re_queryrepl, "query-replace-regexp"},
1044: #endif
1045: {quote, "quoted-insert"},
1046: #ifdef REGEX
1047: {re_searchagain,"re-search-again"},
1048: {re_backsearch, "re-search-backward"},
1049: {re_forwsearch, "re-search-forward"},
1050: #endif
1051: {reposition, "recenter"},
1052: {refresh, "redraw-display"},
1053: {filesave, "save-buffer"},
1054: {quit, "save-buffers-kill-emacs"},
1055: {savebuffers, "save-some-buffers"},
1056: {backpage, "scroll-down"},
1057: #ifdef GOSMACS
1058: {back1page, "scroll-one-line-down"},
1059: {forw1page, "scroll-one-line-up"},
1060: #endif
1061: {pagenext, "scroll-other-window"},
1062: {forwpage, "scroll-up"},
1063: {searchagain, "search-again"},
1064: {backsearch, "search-backward"},
1065: {forwsearch, "search-forward"},
1066: {selfinsert, "self-insert-command"},
1067: #ifdef REGEX
1068: {setcasefold, "set-case-fold-search"},
1069: #endif
1070: {set_default_mode, "set-default-mode"},
1071: {setfillcol, "set-fill-column"},
1072: {setmark, "set-mark-command"},
1073: #ifdef PREFIXREGION
1074: {setprefix, "set-prefix-string"},
1075: #endif
1076: {shrinkwind, "shrink-window"},
1077: #ifdef NOTAB
1078: {space_to_tabstop, "space-to-tabstop"},
1079: #endif
1080: {splitwind, "split-window-vertically"},
1081: #ifndef NO_MACRO
1082: {definemacro, "start-kbd-macro"},
1083: #endif
1.2 ! millert 1084: #ifdef VMS
1.1 deraadt 1085: {attachtoparent,"suspend-emacs"},
1.2 ! millert 1086: #else
! 1087: {spawncli, "suspend-emacs"},
! 1088: #endif
1.1 deraadt 1089: {usebuffer, "switch-to-buffer"},
1090: {poptobuffer, "switch-to-buffer-other-window"},
1091: {twiddle, "transpose-chars"},
1092: {universal_argument, "universal-argument"},
1093: {upperregion, "upcase-region"},
1094: {upperword, "upcase-word"},
1095: {showcpos, "what-cursor-position"},
1096: {filewrite, "write-file"},
1097: {yank, "yank"},
1098: };
1099:
1100: #define NFUNCT (sizeof(functnames)/sizeof(FUNCTNAMES))
1101:
1102: int nfunct = NFUNCT; /* used by help.c */
1103:
1104: /*
1105: * The general-purpose version of ROUND2 blows osk C (2.0) out of the water.
1106: * (reboot required) If you need to build a version of mg with less than 32
1107: * or more than 511 functions, something better must be done.
1108: * The version that should work, but doesn't is:
1109: * #define ROUND2(x) (1+((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)|\
1110: * (x>>8)|(x>>9)|(x>>10)|(x>>11)|(x>>12)|(x>>13)|(x>>14)|(x>>15)))
1111: */
1112: #define ROUND2(x) (x<128?(x<64?32:64):(x<256?128:256))
1113:
1114: static name_fent(fname, flag)
1115: register char *fname;
1116: int flag;
1117: {
1118: register int try;
1119: register int x = ROUND2(NFUNCT);
1120: register int base = 0;
1121: register int notit;
1122:
1123: do {
1124: /* + can be used instead of | here if more efficent. */
1125: if((try = base | x) < NFUNCT) {
1126: if((notit = strcmp(fname, functnames[try].n_name)) >= 0) {
1127: if(!notit) return try;
1128: base = try;
1129: }
1130: }
1131: } while((x>>=1) || (try==1 && base==0)); /* try 0 once if needed */
1132: return flag ? base : -1;
1133: }
1134:
1135: /*
1136: * Translate from function name to function pointer, using binary search.
1137: */
1138:
1139: PF name_function(fname)
1140: char *fname;
1141: {
1142: int i;
1143: if((i = name_fent(fname, FALSE)) >= 0) return functnames[i].n_funct;
1144: return (PF)NULL;
1145: }
1146:
1147: /* complete function name */
1148:
1149: complete_function(fname, c)
1150: register char *fname;
1151: {
1152: register int i, j, k, l;
1153: int oj;
1154:
1155: i = name_fent(fname, TRUE);
1156: for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
1157: if(fname[j]!='\0') {
1158: if(++i >= NFUNCT) return -2; /* no match */
1159: for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
1160: if(fname[j]!='\0') return -2; /* no match */
1161: }
1162: if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1;
1163: for(k=i+1; k<NFUNCT; k++) { /* find last match */
1164: for(l=0; functnames[k].n_name[l]==fname[l]; l++) {}
1165: if(l<j) break;
1166: }
1167: k--;
1168: oj = j;
1169: if(k>i) { /* multiple matches */
1170: while((l = functnames[i].n_name[j]) == functnames[k].n_name[j]) {
1171: fname[j++] = l;
1172: if(l=='-' && c==' ') break;
1173: }
1174: if(j==oj) return -3; /* ambiguous */
1175: } else { /* single match */
1176: while(l = functnames[i].n_name[j]) {
1177: fname[j++] = l;
1178: if(l=='-' && c==' ') break;
1179: }
1180: }
1181: fname[j] = '\0';
1182: return j - oj;
1183: }
1184:
1185: /* list possible function name completions */
1186:
1187: LIST *complete_function_list(fname, c)
1188: register char *fname;
1189: {
1190: register int i, j, k, l;
1191: int oj;
1192: LIST *current,*last;
1193:
1194: i = name_fent(fname, TRUE);
1195: for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
1196: if(fname[j]!='\0') {
1197: if(++i >= NFUNCT) return NULL; /* no match */
1198: for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
1199: if(fname[j]!='\0') return NULL; /* no match */
1200: }
1201: /*
1202: * if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1;
1203: */
1204: for(k=i+1; k<NFUNCT; k++) { /* find last match */
1205: for(l=0; functnames[k].n_name[l]==fname[l]; l++) {}
1206: if(l<j) break;
1207: }
1208: k--;
1209: last = NULL;
1210: for (; k >= i; k--) {
1211: current = (LIST *)malloc(sizeof(LIST));
1212: current->l_next = last;
1213: current->l_name = functnames[k].n_name;
1214: last = current;
1215: }
1216: return(last);
1217: }
1218:
1219: /* translate from function pointer to function name. */
1220:
1221: char *function_name(fpoint)
1222: register PF fpoint;
1223: {
1224: register FUNCTNAMES *fnp = &functnames[0];
1225:
1226: if(fpoint == prefix) return (char *)NULL; /* ambiguous */
1227: do {
1228: if(fnp->n_funct == fpoint) return fnp->n_name;
1229: } while(++fnp < &functnames[NFUNCT]);
1230: return (char *)NULL;
1231: }