Annotation of OpenXM_contrib2/fep/fep_vi.c, Revision 1.3
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:
1.3 ! noro 162: void initViBindings (FUNC cft[], FUNC aft[])
1.1 noro 163: {
164: register int i;
165: BINDENT *ftp;
166:
167: for (i = 0; i < 256; i++)
168: aft[i] = fep_abort;
169: for (i = 0; i < 256; i++)
170: cft[i] = self_insert;
171:
172: #define import(table,key,fn) if((int)key>0)table[(int)key]=fn
173: #ifdef TERMIOS
174: /* Now, using cbreak mode
175: import (cft, initial_ttymode.c_cc[VSTART], ignore);
176: import (cft, initial_ttymode.c_cc[VSTOP], ignore);
177: */
178: #if 0
179: import (cft, initial_ttymode.c_cc[VINTR], insert_and_flush);
180: import (aft, initial_ttymode.c_cc[VINTR], insert_and_flush);
181: #else
182: /* added by noro */
183: import (cft, initial_ttymode.c_cc[VINTR], send_int_sig);
184: /* XXX : this may not be necessary */
185: import (aft, initial_ttymode.c_cc[VINTR], send_int_sig);
186: #endif
187: import (cft, initial_ttymode.c_cc[VQUIT], insert_and_flush);
188: import (cft, initial_ttymode.c_cc[VEOF], send_eof);
189: #ifdef VSWTC
190: import (cft, initial_ttymode.c_cc[VSWTC], insert_and_flush);
191: #endif
192: import (cft, initial_ttymode.c_cc[VSUSP], insert_and_flush);
193: #ifdef VDSUSP
194: import (cft, initial_ttymode.c_cc[VDSUSP], self_insert);
195: #endif
196: import (cft, initial_ttymode.c_cc[VREPRINT], reprint);
1.2 ohara 197: #ifdef VDISCARD
1.1 noro 198: import (cft, initial_ttymode.c_cc[VDISCARD], self_insert);
1.2 ohara 199: #endif
1.1 noro 200: import (cft, initial_ttymode.c_cc[VWERASE], delete_previous_word);
201: import (cft, initial_ttymode.c_cc[VLNEXT], literal_next);
202: import (cft, initial_ttymode.c_cc[VERASE], delete_previous_character);
203: import (cft, initial_ttymode.c_cc[VKILL], delete_line);
204: #else
205: /* Now, using cbreak mode
206: import (cft, tchars_buf.t_startx, ignore);
207: import (cft, tchars_buf.t_stopc, ignore);
208: */
209: #if 0
210: import (cft, tchars_buf.t_intrc, insert_and_flush);
211: import (aft, tchars_buf.t_intrc, insert_and_flush);
212: #else
213: import (cft, tchars_buf.t_intrc, send_int_sig);
214: import (aft, tchars_buf.t_intrc, send_int_sig);
215: #endif
216: import (cft, tchars_buf.t_quitc, insert_and_flush);
217: import (cft, tchars_buf.t_eofc, send_eof);
218: import (cft, tchars_buf.t_brkc, insert_and_flush);
219: import (cft, ltchars_buf.t_suspc, insert_and_flush);
220: import (cft, ltchars_buf.t_dsuspc, self_insert);
221: import (cft, ltchars_buf.t_rprntc, reprint);
222: import (cft, ltchars_buf.t_flushc, self_insert);
223: import (cft, ltchars_buf.t_werasc, delete_previous_word);
224: import (cft, ltchars_buf.t_lnextc, literal_next);
225: import (cft, initial_ttymode.sg_erase, delete_previous_character);
226: import (cft, initial_ttymode.sg_kill, delete_line);
227: #endif
228:
229: #undef import
230:
231: for (ftp = viComBindings; ftp->bt_s; ftp++)
232: bind_key (aft, ftp->bt_func, ftp->bt_s, fep_abort);
233: for (ftp = viInsertBindings; ftp->bt_s; ftp++)
234: bind_key (cft, ftp->bt_func, ftp->bt_s, fep_abort);
235:
236: viInsTable = cft;
237: viComTable = aft;
238: vi_mode = INSERTMODE;
239: }
240:
1.3 ! noro 241: int vi_edit (int c)
1.1 noro 242: {
243: int count = vi_count ? vi_count : 1;
244:
245: switch (c) {
246: case '~':
247: {
248: char c = CommandLine [CurrentPosition];
249:
250: if (isalpha (c)) {
251: (void) delete_next_character (c);
252: c ^= 0040;
253: (void) self_insert (c);
254: }
255: else
256: (void) forward_character (c);
257: }
258: break;
259:
260: case 'a':
261: if (!is_eol())
262: (void) forward_character (c);
263: case 'i':
264: (void) altenateEditmode (c);
265: break;
266:
267: case 'A':
268: (void) end_of_line (c);
269: (void) altenateEditmode ();
270: break;
271:
272: case 'I':
273: (void) beginning_of_line (c);
274: (void) altenateEditmode ();
275: break;
276:
277: case 'C':
278: (void) kill_to_end_of_line (c);
279: (void) altenateEditmode (c);
280: break;
281:
282: case 'D':
283: (void) kill_to_end_of_line (c);
284: break;
285:
286: case 'S':
287: (void) delete_line (c);
288: (void) altenateEditmode ();
289: break;
290:
291: case 'r':
292: (void) delete_next_character (c);
293: (void) self_insert (getcharacter ());
294: break;
295:
296: case 's':
297: (void) delete_next_n_character (count);
298: (void) altenateEditmode ();
299: break;
300:
301: case 'x':
302: (void) delete_next_n_character (count);
303: break;
304:
305: case 'X':
306: (void) delete_previous_n_character (count);
307: break;
308:
309: case 'p':
310: (void) forward_character ();
311: case 'P':
312: (void) yank_from_kill_buffer ();
313: (void) backward_character ();
314: break;
315:
316: case ctrl('U'):
317: (void) delete_line (c);
318: (void) altenateEditmode ();
319: break;
320: }
321: vi_count = 0;
322: return (0);
323: }
324:
1.3 ! noro 325: int altenateEditmode ()
1.1 noro 326: {
327: FUNC *tmp;
328:
329: tmp = curFuncTab;
330: curFuncTab = altFuncTab;
331: altFuncTab = tmp;
332: vi_mode = (vi_mode == INSERTMODE) ? COMMANDMODE : INSERTMODE;
333:
334: return (0);
335: }
336:
1.3 ! noro 337: int vi_num (int c)
1.1 noro 338: {
339: vi_count = vi_count * 10 + ((int)c - (int)'0');
340: return (0);
341: }
342:
1.3 ! noro 343: int vi_motion (int c)
1.1 noro 344: {
345: int count = vi_count ? vi_count : 1;
346:
347: switch (c) {
348:
349: case 'w':
350: (void) forward_n_word (count);
351: break;
352:
353: case 'W':
354: (void) forward_n_Word (count);
355: break;
356:
357: case 'e':
358: (void) forward_to_end_of_n_word (count);
359: break;
360:
361: case 'E':
362: (void) forward_to_end_of_n_Word (count);
363: break;
364:
365: case 'b':
366: (void) backward_n_word (count);
367: break;
368:
369: case 'B':
370: (void) backward_n_Word (count);
371: break;
372:
373: case 'l':
374: case ' ':
375: (void) forward_n_character (count);
376: break;
377:
378: case 'h':
379: case '\b':
380: (void) backward_n_character (count);
381: break;
382:
383: case 'k':
384: case '-':
385: (void) previous_history (c);
386: break;
387:
388: case 'j':
389: case '+':
390: (void) next_history (c);
391: break;
392:
393: case 'n':
394: (void) search_reverse (c);
395: break;
396:
397: case 'N':
398: (void) search_forward (c);
399: break;
400:
401: case '0':
402: if (vi_count)
403: return (vi_num (c));
404: /* falling down */
405:
406: case '^':
407: (void) beginning_of_line (c);
408: break;
409:
410: case '$':
411: (void) end_of_line (c);
412: break;
413:
414: case '|':
415: (void) moveto (count - 1);
416: /***
417: if (strlen (CommandLine) >= count) {
418: (void) beginning_of_line (c);
419: (void) forward_n_character (count - 1);
420: }
421: else
422: (void) end_of_line (c);
423: ***/
424: break;
425:
426: default:
427: (void) fep_abort (c);
428: break;
429: }
430: vi_count = 0;
431: return (0);
432: }
433:
1.3 ! noro 434: int vi_c (int c)
1.1 noro 435: {
436: int count = vi_count ? vi_count : 1;
437:
438: switch (c) {
439: case '0':
440: case '^':
441: (void) kill_to_top_of_line (c);
442: break;
443:
444: case 'c':
445: delete_line(c);
446: break;
447:
448: case 'w':
449: (void) delete_next_n_word (count);
450: break;
451:
452: case 'W':
453: (void) delete_next_n_Word (count);
454: break;
455:
456: case 'b':
457: (void) delete_previous_n_word (count);
458: break;
459:
460: case 'B':
461: (void) delete_previous_n_Word (count);
462: break;
463:
464: case '$':
465: (void) kill_to_end_of_line(c);
466: break;
467:
468: default:
469: return (fep_abort (c));
470: }
471: vi_count = 0;
472: altenateEditmode ();
473: return (0);
474: }
475:
1.3 ! noro 476: int vi_d (int c)
1.1 noro 477: {
478: int count = vi_count ? vi_count : 1;
479:
480: switch (c) {
481: case '0':
482: case '^':
483: (void) kill_to_top_of_line (c);
484: break;
485:
486: case 'd':
487: delete_line(c);
488: break;
489:
490: case 'w':
491: (void) delete_next_n_word (count);
492: break;
493:
494: case 'W':
495: (void) delete_next_n_Word (count);
496: break;
497:
498: case 'b':
499: (void) delete_previous_n_word (count);
500: break;
501:
502: case 'B':
503: (void) delete_previous_n_Word (count);
504: break;
505:
506: case '$':
507: (void) kill_to_end_of_line(c);
508: break;
509:
510: default:
511: return (fep_abort (c));
512: }
513: vi_count = 0;
514: return (0);
515: }
516:
1.3 ! noro 517: int vi_new_line (int c)
1.1 noro 518: {
519: int count = vi_count ? vi_count : 1;
520:
521: vi_count = 0;
522:
523: (void) new_line (c);
524: if (vi_mode == COMMANDMODE)
525: altenateEditmode ();
526:
527: return (1);
528: }
529:
1.3 ! noro 530: int vi_ins_edit (int c)
1.1 noro 531: {
532: switch (c) {
533:
534: case ctrl('H'):
535: (void) delete_previous_character (c);
536: break;
537:
538: case ctrl('W'):
539: (void) delete_previous_word (c);
540: break;
541:
542: case ctrl('U'):
543: (void) delete_line (c);
544: break;
545:
546: case ctrl('V'):
547: (void) literal_next (c);
548: break;
549:
550: case '\033':
551: (void) altenateEditmode ();
552: (void) backward_character ();
553: break;
554: }
555: return (0);
556: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>