1
2 /*
3 emx (small EMacs clone for X)
4 (C) 2002, Jean-Pierre Demailly
5 released in the public domain
6
7 derived from edx ver. 0.56, (C) 2002, Terry Loveall
8 Based upon the original work ee.c of Yijun Ding, (C) 1991 which is
9 in the public domain.
10
11 This program comes with no warranties. Use at your own risk.
12 */
13
14 #define EDIT "xterm -cr green -ms red -fn 9x15 -geometry 80x32 -e emt"
15
16 #ifndef MINIMAL
17 #define DEFAULT_RC "emtrc"
18 #endif
19
20 /* Help screen -- rewrite to suit your own tastes */
21
22 /* include the editor engine */
23 #include "edit.c"
24
25 /* All this stuff consists of the emacs-like bindings */
26
27 #ifdef GREEK
ctrlc_key(int key)28 void ctrlc_key(int key)
29 {
30 key_greek(key);
31 doCtrlC = var_greek;
32 }
33 #endif
34
35 #ifdef MINIMAL
key_binding(int key)36 void key_binding(int key)
37 {
38 switch(key) {
39 case 'c': SYSTEM("xcalc"); break; /* Alt-C xcalc*/
40 case 'd': new_edit("/c/text/phone.dir"); break; /* Alt-D phone Dir */
41 case 'l': SYSTEM("xcalendar"); break; /* Alt-L xcalendar */
42 case 'u': redo(); break; /* Alt-U redo */
43 }
44 }
45 #endif
46
47 /* ctrl X keys */
ctrlx_key(int key)48 void ctrlx_key(int key)
49 {
50 switch(key | 0x60) {
51 case 'c': sys_exit(0); break; /* ^XC exit only if file saved */
52 case 'd': key_delword(0); break; /* ^XD delete word */
53 case 'f': file_save(0,1); break; /* ^XF open new file */
54 case 'h': show_help(0); break; /* ^XH show help menu */
55 case 'i': block_read(); break; /* ^XI read file into cursor pos */
56 case 'k': block_line(); break; /* ^XK delete line */
57 case 'm': key_macros(1); break; /* ^XM record macro */
58 case 'p': key_macros(0); break; /* ^XP play macro */
59 case 'q': sys_exit(2); break; /* ^XQ exit even if file unsaved */
60 case 's': do_save(); break; /* ^XS write block to disk */
61 case 't': tab_size(); break; /* ^XT get tab size */
62 case 'v': block_write(); break; /* ^XV write block to disk */
63 case 'w': file_save(0,-1); break; /* ^XW save file as */
64 case 'x': goto_last(); break; /* ^XX goto last pos */
65 }
66 doCtrlX = 0;
67 show_top();
68 }
69
main_meta(int key)70 void main_meta(int key)
71 {
72 if (key>=1 && key<=10)
73 switch(key) {
74 case 1: show_help(0); break; /* F1 show help */
75 case 2: do_save(); break; /* F2 save file and resume */
76 case 3: file_save(0,1); break; /* F3 open new file */
77 case 4: find_match(); break; /* F4 find {} () [] match */
78 case 5: run(); break; /* F5 get and run cmd */
79 case 6: chgdir(); break; /* F6 get & change to dir */
80 case 7: block_mark(); break; /* F7 set mark block on */
81 case 8: block_mark(); break; /* F8 set mark block on */
82 #ifndef MINIMAL
83 case 9: req_edit(); break; /* F9 open new file in new window */
84 #endif
85 case 10: key_binding('z'); break; /* F10 open rxvt in cur.dir */
86 }
87 else
88 switch(key | 0x60) {
89 case 'b': block_mark(); break; /* F7 set mark block on */
90 case 'c': block_mark(); break; /* F8 set mark block on */
91 case 'd': goto_x(strlen(line_start+1)+1); break;/* End eol */
92 case 'f': file_save(0,-1); break; /* F3 open new file */
93 case 'g': key_delete(); break; /* Del delete cursor char */
94 case 'n': show_flag(OVR, !flag[OVR]); break;/* Ins toggle insert mode */
95 case 'r': do_save(); break; /* F2 save file and resume */
96 case 's': goto_x(1); break; /* Home bol */
97 case 'v': cursor_pageup(); break; /* PgUp */
98 case 'w': cursor_pagedown(); break; /* PgDn */
99 // case 'z': key_shell(0); break; /* F10 execute a shell */
100 }
101 funckey=0;
102 show_top();
103 }
104
105 /* Control keys */
key_control(int key)106 void key_control(int key)
107 {
108 switch(key|0x60) {
109 case 'a': goto_x(1); break; /* bol */
110 case 'b': cursor_left(); break; /* left */
111 #ifdef GREEK
112 case 'c': doCtrlC = 1; break; /* ^C switch */
113 #endif
114 case 'd': key_delete(); break; /* delete cursor char */
115 case 'e': goto_x(strlen(line_start+1)+1); break; /* goto eol */
116 case 'f': cursor_right(); break; /* right */
117 case 'h': key_backspace(); break; /* destructive backspace */
118 case 'j': key_return(); break; /* newline at cursor */
119 case 'k': key_delword(1); break; /* delete to eol */
120 case 'l': scr_update(); break; /* refresh screen */
121 case 'n': cursor_down(); break; /* down */
122 case 'o': show_mode(); break; /* change modes */
123 case 'p': cursor_up(); break; /* up */
124 case 'q': literal = 1; break; /* literal */
125 case 'r': goto_search(1); break; /* ^R find backward */
126 case 's': goto_search(0); break; /* ^S find */
127 case 't': transpose(); break; /* ^T transpose */
128 /*
129 case 'u': block_line(); break; */ /* ^U delete line */
130 case 'u': if (search_mode<=1) /* repeat search */
131 goto_find(cur_pos, search_mode);
132 else /* repeat replace */
133 ask_replace();
134 break; /* search or replace again */
135 case 'v': cursor_pagedown(); break; /* ^V pgdn */
136 case 'x': doCtrlX = 1; break; /* ^X switch */
137 case 'y': block_paste(); break; /* ^Y copy buffer at cursor */
138 case 'w': reset_mark();
139 block_copy(1);
140 mark_off(); break; /* ^W cut block at buffer */
141 case 0x7f: undo(0); break; /* ^_ undo */
142 /* user typed Ctrl-_ */
143 }
144 show_top();
145 }
146
147 /* Escape keys */
key_escape(int key)148 void key_escape(int key)
149 {
150 switch(tolower(key)) {
151 case ' ':
152 case '.': block_mark(); break; /* Esc-BLANK set mark block on */
153 case '_': redo(); break; /* Esc-_ redo */
154 case '%': goto_replace(); break; /* Esc-% replace */
155
156 case '<': top(); break; /* Esc-< bof */
157 case '>': y = screen_height-1; goto_ptr(file_end); break; /* Esc-> eof */
158 case 'b': word_left(); break; /* Esc-B word left */
159 case 'f': word_right(); break; /* Esc-F word right */
160 case 'g': goto_line(); break; /* goto line# */
161 #ifdef JUSTIFY
162 case 'j': block_format(1); break; /* Esc-J reformat & fill block */
163 #endif
164 case 'l': chg_case(0); break; /* Esc-L lower case block */
165 case 'm': window_size(); break; /* Esc-M get right margin */
166 case 'n': scroll_up(); break; /* Esc-N scroll down (!) */
167 case 'p': scroll_down(); break; /* Esc-P scroll up (!) */
168 case 'q': block_format(0); break; /* Esc-Q reformat block */
169 case 'u': chg_case(1); break; /* Esc-U upper case block */
170 case 'v': cursor_pageup(); break; /* Esc-V pgup */
171
172 case 'w': reset_mark(); block_copy(0);
173 mark_off(); break; /* Esc-W copy block to buffer */
174 case 'x': switch_marks(); break; /* Esc-X switch between block marks */
175 }
176 doEscap = 0;
177 show_top();
178 }
179
180 /* single char interpreter */
main_exec(int key)181 void main_exec(int key)
182 {
183 cur_pos = get_cur();
184 if (update_scr) {
185 if(flag[REC]) rec_macro(key);
186 }
187 if (help_done){
188 clrscr();
189 show_top();
190 help_done = 0;
191 flag[SHW] = 1;
192 } else if (literal) {
193 key_normal(key);
194 literal = 0;
195 } else {
196 if (funckey) main_meta(key);
197 else {
198 if (doEscap==1) key_escape(key); else
199 if (doEscap==2) key_binding(key); else
200 #ifdef GREEK
201 if (doCtrlC) ctrlc_key(key); else
202 #endif
203 if (doCtrlX) ctrlx_key(key); else
204 {
205 if (key >= BLNK) {
206 flag[BLK] = 0;
207 key_normal(key);
208 }
209 else key_control(key);
210 }
211 }
212 }
213 if(!doCtrlX && old_pos != line_start) {
214 last_pos = old_pos;
215 old_pos = line_start;
216 }
217 cur_pos = get_cur();
218
219 if(update_scr && exitf && executive == MAIN) scr_update();
220 }
221
222