blob: b2991221d3790fd4687e225ab8fa185bd068f2cd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#define _POSIX_C_SOURCE 200809L
#include <ctype.h>
#include <termios.h>
#include <unistd.h>
#include "shed.h"
int shed_handle_non_vi(struct shed *e, struct termios *t, char c)
{
if (c == t->c_cc[VEOF]) {
if (shed_eof(e) == 0) {
return 0;
}
}
if (c == t->c_cc[VINTR]) {
return shed_cancel(e);
}
if (c == t->c_cc[VEOL]) {
return shed_move_end(e);
}
if (c == t->c_cc[VERASE]) {
return shed_backspace(e);
}
if (c == t->c_cc[VQUIT]) {
/* ^\ */
return 1;
}
if (c == t->c_cc[VSTART]) {
/* ^Q */
return 1;
}
if (c == t->c_cc[VSTOP]) {
/* ^S */
return 1;
}
if (c == t->c_cc[VSUSP]) {
/* ^Z */
return 1;
}
if (c == '\033') {
char esc[2];
read(STDIN_FILENO, esc, 2);
if (esc[1] == 'A') {
return shed_history_backward(e);
}
if (esc[1] == 'B') {
return shed_history_forward(e);
}
if (esc[1] == 'C') {
return shed_move_forward(e);
}
if (esc[1] == 'D' && e->cur->pos > 0) {
return shed_move_backward(e);
}
return 1;
}
if (c == '\n') {
return shed_execute(e);
}
if (CTRL_A <= c && c <= CTRL_Z) {
switch (c) {
case CTRL_A: return shed_move_0(e);
case CTRL_B: return shed_move_backward(e);
case CTRL_C: return shed_cancel(e);
case CTRL_D: return shed_delete(e);
case CTRL_E: return shed_move_end(e);
case CTRL_F: return shed_move_forward(e);
case CTRL_G: break; // return abort(e)?
case CTRL_H: return shed_backspace(e);
case CTRL_I: break; // return complete_wordexp(e);
case CTRL_J: return shed_execute(e);
case CTRL_K: return shed_delete_toend(e);
case CTRL_L: return shed_redraw(e);
case CTRL_M: return shed_execute(e);
case CTRL_N: return shed_history_forward(e);
case CTRL_O: // return ??? /* ??? */
case CTRL_P: return shed_history_backward(e);
case CTRL_Q: // /* TTY START */
case CTRL_R: // return history_backsearch(e);
case CTRL_S: // /* TTY STOP */
case CTRL_T: break; // /* ??? */
case CTRL_U: return shed_erase(e);
case CTRL_V: break; // return quote(e);
case CTRL_W: return shed_worderase(e);
case CTRL_X: // /* ??? */
case CTRL_Y: // /* ??? */
case CTRL_Z: // /* ??? */
break;
}
return 1;
}
/* regular character */
shed_insert_char(e->cur, c);
return 1;
}
|