Annotation of OpenXM_contrib2/fep/fep_vi.c, Revision 1.2
1.1 noro 1: /* Copyright (c) 1987, 1988 by Software Research Associates, Inc. */
2:
3: #ifndef lint
4: static char rcsid[]=
5: "$Header: fep_vi.c,v 4.7 91/05/29 14:31:10 utashiro Exp $ (SRA)";
6: #endif /* lint */
7:
8: #include <stdio.h>
9: #include <sys/ioctl.h>
10: #ifdef TERMIOS
11: #include <termios.h>
12: #if defined(__linux__) || defined(__CYGWIN__)
13: #ifndef _POSIX_VDISABLE
14: #define _POSIX_VDISABLE '\0'
15: #endif
16: #endif
17: #else
18: #include <sgtty.h>
19: #endif
20: #include <ctype.h>
21: #include "fep_defs.h"
22: #include "fep_glob.h"
23: #include "fep_funcs.h"
24:
25: enum {INSERTMODE, COMMANDMODE} vi_mode = COMMANDMODE;
26: int vi_count;
27:
28: extern char *CommandLine;
29: extern int CurrentPosition;
30:
31: /*
32: * Default binding table
33: */
34: BINDENT viComBindings[] = {
35: /* 1 */ {"1", vi_num},
36: /* 2 */ {"2", vi_num},
37: /* 3 */ {"3", vi_num},
38: /* 4 */ {"4", vi_num},
39: /* 5 */ {"5", vi_num},
40: /* 6 */ {"6", vi_num},
41: /* 7 */ {"7", vi_num},
42: /* 8 */ {"8", vi_num},
43: /* 9 */ {"9", vi_num},
44:
45: /* ~ */ {"~", vi_edit},
46: /* A */ {"A", vi_edit},
47: /* C */ {"C", vi_edit},
48: /* D */ {"D", vi_edit},
49: /* P */ {"P", vi_edit},
50: /* S */ {"S", vi_edit},
51: /* I */ {"I", vi_edit},
52: /* a */ {"a", vi_edit},
53: /* i */ {"i", vi_edit},
54: /* p */ {"p", vi_edit},
55: /* r */ {"r", vi_edit},
56: /* s */ {"s", vi_edit},
57: /* x */ {"x", vi_edit},
58: /* X */ {"X", vi_edit},
59: /* ^U */ {"\\^U", vi_edit},
60:
61: /* */ {" ", vi_motion},
62: /* ^H */ {"\b", vi_motion},
63: /* l */ {"l", vi_motion},
64: /* h */ {"h", vi_motion},
65: /* k */ {"k", vi_motion},
66: /* j */ {"j", vi_motion},
67: /* b */ {"b", vi_motion},
68: /* B */ {"B", vi_motion},
69: /* e */ {"e", vi_motion},
70: /* E */ {"E", vi_motion},
71: /* w */ {"w", vi_motion},
72: /* W */ {"W", vi_motion},
73: /* n */ {"n", vi_motion},
74: /* N */ {"N", vi_motion},
75: /* 0 */ {"0", vi_motion},
76: /* ^ */ {"^", vi_motion},
77: /* $ */ {"$", vi_motion},
78: /* | */ {"|", vi_motion},
79: /* - */ {"-", vi_motion},
80: /* + */ {"+", vi_motion},
81:
82: /* cb */ {"cb", vi_c},
83: /* cB */ {"cb", vi_c},
84: /* cw */ {"cw", vi_c},
85: /* cW */ {"cW", vi_c},
86: /* c0 */ {"c0", vi_c},
87: /* c^ */ {"c^", vi_c},
88: /* c$ */ {"c$", vi_c},
89: /* cc */ {"cc", vi_c},
90:
91: /* db */ {"db", vi_d},
92: /* dB */ {"dB", vi_d},
93: /* dw */ {"dw", vi_d},
94: /* dW */ {"dW", vi_d},
95: /* d0 */ {"d0", vi_d},
96: /* d^ */ {"d^", vi_d},
97: /* d$ */ {"d$", vi_d},
98: /* dd */ {"dd", vi_d},
99:
100: /* ^E */ {"\\^E", expand_file_name},
101: /* ^J */ {"\\^J", vi_new_line},
102: /* ^L */ {"\\^L", list_file_name},
103: /* ^M */ {"\\^M", vi_new_line},
104: /* ^P */ {"\\^P", previous_history},
105: /* ^N */ {"\\^N", next_history},
106: /* ^R */ {"\\^R", reprint},
107: /* ^^ */ {"\\^^", toggle_through},
108: /* ^X-^B */ {"\\^X\\^B", show_bindings},
109: /* ^X-B */ {"\\^XB", show_bindings},
110: /* ^X-b */ {"\\^Xb", show_bindings},
111: /* ^X-^H */ {"\\^X\\^H", show_history},
112: /* ^X-h */ {"\\^Xh", show_history},
113: /* ^X-H */ {"\\^XH", show_history},
114: /* ^X-l */ {"\\^Xl", list_file_name},
115: /* ^X-L */ {"\\^XL", list_file_name},
116: /* ^X-^L */ {"\\^X\\^L", fep_repaint},
117: /* ^X-^V */ {"\\^X\\^V", view_buffer},
118: /* ^X-^X */ {"\\^X\\^X", expand_file_name},
119: /* ^X-? */ {"\\^X?", show_bindings},
120: /* ^X-^C */ {"\\^X\\^C", (FUNC)terminate},
121: /* ^X-^D */ {"\\^X\\^D", send_eof},
122: /* ^X-( */ {"\\^X(", fep_start_script},
123: /* ^X-) */ {"\\^X)", fep_end_script},
124: /* */ {NULL, NULL}
125: };
126:
127: BINDENT viInsertBindings[] = {
128: /* ^H */ {"\\^H", vi_ins_edit},
129: /* ^W */ {"\\^W", vi_ins_edit},
130: /* ^U */ {"\\^U", vi_ins_edit},
131: /* ^V */ {"\\^V", vi_ins_edit},
132: /* ^J */ {"\\^J", vi_new_line},
133: /* ^L */ {"\\^L", list_file_name},
134: /* ^M */ {"\\^M", vi_new_line},
135: /* ^P */ {"\\^P", previous_history},
136: /* ^N */ {"\\^N", next_history},
137: /* ESC */ {"\\^[", vi_ins_edit},
138: /* ^E */ {"\\^E", expand_file_name},
139: /* ^^ */ {"\\^^", toggle_through},
140: /* ^X-^B */ {"\\^X\\^B", show_bindings},
141: /* ^X-B */ {"\\^XB", show_bindings},
142: /* ^X-b */ {"\\^Xb", show_bindings},
143: /* ^X-^H */ {"\\^X\\^H", show_history},
144: /* ^X-h */ {"\\^Xh", show_history},
145: /* ^X-H */ {"\\^XH", show_history},
146: /* ^X-l */ {"\\^Xl", list_file_name},
147: /* ^X-L */ {"\\^XL", list_file_name},
148: /* ^X-^L */ {"\\^X\\^L", fep_repaint},
149: /* ^X-^X */ {"\\^X\\^X", expand_file_name},
150: /* ^X-? */ {"\\^X?", show_bindings},
151: /* ^X-^C */ {"\\^X\\^C", (FUNC)terminate},
152: /* ^X-^D */ {"\\^X\\^D", send_eof},
153: /* ^X-^V */ {"\\^X\\^V", view_buffer},
154: /* ^X-( */ {"\\^X(", fep_start_script},
155: /* ^X-) */ {"\\^X)", fep_end_script},
156: /* */ {NULL, NULL}
157: };
158:
159: FUNC *viComTable;
160: FUNC *viInsTable;
161:
162: initViBindings (cft, aft)
163: FUNC cft[], aft[];
164: {
165: register int i;
166: BINDENT *ftp;
167:
168: for (i = 0; i < 256; i++)
169: aft[i] = fep_abort;
170: for (i = 0; i < 256; i++)
171: cft[i] = self_insert;
172:
173: #define import(table,key,fn) if((int)key>0)table[(int)key]=fn
174: #ifdef TERMIOS
175: /* Now, using cbreak mode
176: import (cft, initial_ttymode.c_cc[VSTART], ignore);
177: import (cft, initial_ttymode.c_cc[VSTOP], ignore);
178: */
179: #if 0
180: import (cft, initial_ttymode.c_cc[VINTR], insert_and_flush);
181: import (aft, initial_ttymode.c_cc[VINTR], insert_and_flush);
182: #else
183: /* added by noro */
184: import (cft, initial_ttymode.c_cc[VINTR], send_int_sig);
185: /* XXX : this may not be necessary */
186: import (aft, initial_ttymode.c_cc[VINTR], send_int_sig);
187: #endif
188: import (cft, initial_ttymode.c_cc[VQUIT], insert_and_flush);
189: import (cft, initial_ttymode.c_cc[VEOF], send_eof);
190: #ifdef VSWTC
191: import (cft, initial_ttymode.c_cc[VSWTC], insert_and_flush);
192: #endif
193: import (cft, initial_ttymode.c_cc[VSUSP], insert_and_flush);
194: #ifdef VDSUSP
195: import (cft, initial_ttymode.c_cc[VDSUSP], self_insert);
196: #endif
197: import (cft, initial_ttymode.c_cc[VREPRINT], reprint);
1.2 ! ohara 198: #ifdef VDISCARD
1.1 noro 199: import (cft, initial_ttymode.c_cc[VDISCARD], self_insert);
1.2 ! ohara 200: #endif
1.1 noro 201: import (cft, initial_ttymode.c_cc[VWERASE], delete_previous_word);
202: import (cft, initial_ttymode.c_cc[VLNEXT], literal_next);
203: import (cft, initial_ttymode.c_cc[VERASE], delete_previous_character);
204: import (cft, initial_ttymode.c_cc[VKILL], delete_line);
205: #else
206: /* Now, using cbreak mode
207: import (cft, tchars_buf.t_startx, ignore);
208: import (cft, tchars_buf.t_stopc, ignore);
209: */
210: #if 0
211: import (cft, tchars_buf.t_intrc, insert_and_flush);
212: import (aft, tchars_buf.t_intrc, insert_and_flush);
213: #else
214: import (cft, tchars_buf.t_intrc, send_int_sig);
215: import (aft, tchars_buf.t_intrc, send_int_sig);
216: #endif
217: import (cft, tchars_buf.t_quitc, insert_and_flush);
218: import (cft, tchars_buf.t_eofc, send_eof);
219: import (cft, tchars_buf.t_brkc, insert_and_flush);
220: import (cft, ltchars_buf.t_suspc, insert_and_flush);
221: import (cft, ltchars_buf.t_dsuspc, self_insert);
222: import (cft, ltchars_buf.t_rprntc, reprint);
223: import (cft, ltchars_buf.t_flushc, self_insert);
224: import (cft, ltchars_buf.t_werasc, delete_previous_word);
225: import (cft, ltchars_buf.t_lnextc, literal_next);
226: import (cft, initial_ttymode.sg_erase, delete_previous_character);
227: import (cft, initial_ttymode.sg_kill, delete_line);
228: #endif
229:
230: #undef import
231:
232: for (ftp = viComBindings; ftp->bt_s; ftp++)
233: bind_key (aft, ftp->bt_func, ftp->bt_s, fep_abort);
234: for (ftp = viInsertBindings; ftp->bt_s; ftp++)
235: bind_key (cft, ftp->bt_func, ftp->bt_s, fep_abort);
236:
237: viInsTable = cft;
238: viComTable = aft;
239: vi_mode = INSERTMODE;
240: }
241:
242: vi_edit (c)
243: int c;
244: {
245: int count = vi_count ? vi_count : 1;
246:
247: switch (c) {
248: case '~':
249: {
250: char c = CommandLine [CurrentPosition];
251:
252: if (isalpha (c)) {
253: (void) delete_next_character (c);
254: c ^= 0040;
255: (void) self_insert (c);
256: }
257: else
258: (void) forward_character (c);
259: }
260: break;
261:
262: case 'a':
263: if (!is_eol())
264: (void) forward_character (c);
265: case 'i':
266: (void) altenateEditmode (c);
267: break;
268:
269: case 'A':
270: (void) end_of_line (c);
271: (void) altenateEditmode ();
272: break;
273:
274: case 'I':
275: (void) beginning_of_line (c);
276: (void) altenateEditmode ();
277: break;
278:
279: case 'C':
280: (void) kill_to_end_of_line (c);
281: (void) altenateEditmode (c);
282: break;
283:
284: case 'D':
285: (void) kill_to_end_of_line (c);
286: break;
287:
288: case 'S':
289: (void) delete_line (c);
290: (void) altenateEditmode ();
291: break;
292:
293: case 'r':
294: (void) delete_next_character (c);
295: (void) self_insert (getcharacter ());
296: break;
297:
298: case 's':
299: (void) delete_next_n_character (count);
300: (void) altenateEditmode ();
301: break;
302:
303: case 'x':
304: (void) delete_next_n_character (count);
305: break;
306:
307: case 'X':
308: (void) delete_previous_n_character (count);
309: break;
310:
311: case 'p':
312: (void) forward_character ();
313: case 'P':
314: (void) yank_from_kill_buffer ();
315: (void) backward_character ();
316: break;
317:
318: case ctrl('U'):
319: (void) delete_line (c);
320: (void) altenateEditmode ();
321: break;
322: }
323: vi_count = 0;
324: return (0);
325: }
326:
327: altenateEditmode ()
328: {
329: FUNC *tmp;
330:
331: tmp = curFuncTab;
332: curFuncTab = altFuncTab;
333: altFuncTab = tmp;
334: vi_mode = (vi_mode == INSERTMODE) ? COMMANDMODE : INSERTMODE;
335:
336: return (0);
337: }
338:
339: vi_num (c)
340: int c;
341: {
342: vi_count = vi_count * 10 + ((int)c - (int)'0');
343: return (0);
344: }
345:
346: vi_motion (c)
347: int c;
348: {
349: int count = vi_count ? vi_count : 1;
350:
351: switch (c) {
352:
353: case 'w':
354: (void) forward_n_word (count);
355: break;
356:
357: case 'W':
358: (void) forward_n_Word (count);
359: break;
360:
361: case 'e':
362: (void) forward_to_end_of_n_word (count);
363: break;
364:
365: case 'E':
366: (void) forward_to_end_of_n_Word (count);
367: break;
368:
369: case 'b':
370: (void) backward_n_word (count);
371: break;
372:
373: case 'B':
374: (void) backward_n_Word (count);
375: break;
376:
377: case 'l':
378: case ' ':
379: (void) forward_n_character (count);
380: break;
381:
382: case 'h':
383: case '\b':
384: (void) backward_n_character (count);
385: break;
386:
387: case 'k':
388: case '-':
389: (void) previous_history (c);
390: break;
391:
392: case 'j':
393: case '+':
394: (void) next_history (c);
395: break;
396:
397: case 'n':
398: (void) search_reverse (c);
399: break;
400:
401: case 'N':
402: (void) search_forward (c);
403: break;
404:
405: case '0':
406: if (vi_count)
407: return (vi_num (c));
408: /* falling down */
409:
410: case '^':
411: (void) beginning_of_line (c);
412: break;
413:
414: case '$':
415: (void) end_of_line (c);
416: break;
417:
418: case '|':
419: (void) moveto (count - 1);
420: /***
421: if (strlen (CommandLine) >= count) {
422: (void) beginning_of_line (c);
423: (void) forward_n_character (count - 1);
424: }
425: else
426: (void) end_of_line (c);
427: ***/
428: break;
429:
430: default:
431: (void) fep_abort (c);
432: break;
433: }
434: vi_count = 0;
435: return (0);
436: }
437:
438: vi_c (c)
439: int c;
440: {
441: int count = vi_count ? vi_count : 1;
442:
443: switch (c) {
444: case '0':
445: case '^':
446: (void) kill_to_top_of_line (c);
447: break;
448:
449: case 'c':
450: delete_line(c);
451: break;
452:
453: case 'w':
454: (void) delete_next_n_word (count);
455: break;
456:
457: case 'W':
458: (void) delete_next_n_Word (count);
459: break;
460:
461: case 'b':
462: (void) delete_previous_n_word (count);
463: break;
464:
465: case 'B':
466: (void) delete_previous_n_Word (count);
467: break;
468:
469: case '$':
470: (void) kill_to_end_of_line(c);
471: break;
472:
473: default:
474: return (fep_abort (c));
475: }
476: vi_count = 0;
477: altenateEditmode ();
478: return (0);
479: }
480:
481: vi_d (c)
482: int c;
483: {
484: int count = vi_count ? vi_count : 1;
485:
486: switch (c) {
487: case '0':
488: case '^':
489: (void) kill_to_top_of_line (c);
490: break;
491:
492: case 'd':
493: delete_line(c);
494: break;
495:
496: case 'w':
497: (void) delete_next_n_word (count);
498: break;
499:
500: case 'W':
501: (void) delete_next_n_Word (count);
502: break;
503:
504: case 'b':
505: (void) delete_previous_n_word (count);
506: break;
507:
508: case 'B':
509: (void) delete_previous_n_Word (count);
510: break;
511:
512: case '$':
513: (void) kill_to_end_of_line(c);
514: break;
515:
516: default:
517: return (fep_abort (c));
518: }
519: vi_count = 0;
520: return (0);
521: }
522:
523: vi_new_line (c)
524: int c;
525: {
526: int count = vi_count ? vi_count : 1;
527:
528: vi_count = 0;
529:
530: (void) new_line (c);
531: if (vi_mode == COMMANDMODE)
532: altenateEditmode ();
533:
534: return (1);
535: }
536:
537: vi_ins_edit (c)
538: int c;
539: {
540: switch (c) {
541:
542: case ctrl('H'):
543: (void) delete_previous_character (c);
544: break;
545:
546: case ctrl('W'):
547: (void) delete_previous_word (c);
548: break;
549:
550: case ctrl('U'):
551: (void) delete_line (c);
552: break;
553:
554: case ctrl('V'):
555: (void) literal_next (c);
556: break;
557:
558: case '\033':
559: (void) altenateEditmode ();
560: (void) backward_character ();
561: break;
562: }
563: return (0);
564: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>