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)23void 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)31void 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)43void 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)79void 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)103void 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)138void 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)174void 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