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