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