1*32fe07f8SJohn Marino /* $NetBSD: emacs.c,v 1.25 2011/07/29 15:16:33 christos Exp $ */ 2*32fe07f8SJohn Marino 3*32fe07f8SJohn Marino /*- 4*32fe07f8SJohn Marino * Copyright (c) 1992, 1993 5*32fe07f8SJohn Marino * The Regents of the University of California. All rights reserved. 6*32fe07f8SJohn Marino * 7*32fe07f8SJohn Marino * This code is derived from software contributed to Berkeley by 8*32fe07f8SJohn Marino * Christos Zoulas of Cornell University. 9*32fe07f8SJohn Marino * 10*32fe07f8SJohn Marino * Redistribution and use in source and binary forms, with or without 11*32fe07f8SJohn Marino * modification, are permitted provided that the following conditions 12*32fe07f8SJohn Marino * are met: 13*32fe07f8SJohn Marino * 1. Redistributions of source code must retain the above copyright 14*32fe07f8SJohn Marino * notice, this list of conditions and the following disclaimer. 15*32fe07f8SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 16*32fe07f8SJohn Marino * notice, this list of conditions and the following disclaimer in the 17*32fe07f8SJohn Marino * documentation and/or other materials provided with the distribution. 18*32fe07f8SJohn Marino * 3. Neither the name of the University nor the names of its contributors 19*32fe07f8SJohn Marino * may be used to endorse or promote products derived from this software 20*32fe07f8SJohn Marino * without specific prior written permission. 21*32fe07f8SJohn Marino * 22*32fe07f8SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23*32fe07f8SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*32fe07f8SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*32fe07f8SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26*32fe07f8SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*32fe07f8SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*32fe07f8SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*32fe07f8SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*32fe07f8SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*32fe07f8SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*32fe07f8SJohn Marino * SUCH DAMAGE. 33*32fe07f8SJohn Marino */ 34*32fe07f8SJohn Marino 35*32fe07f8SJohn Marino #include "config.h" 36*32fe07f8SJohn Marino #if !defined(lint) && !defined(SCCSID) 37*32fe07f8SJohn Marino #if 0 38*32fe07f8SJohn Marino static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93"; 39*32fe07f8SJohn Marino #else 40*32fe07f8SJohn Marino __RCSID("$NetBSD: emacs.c,v 1.25 2011/07/29 15:16:33 christos Exp $"); 41*32fe07f8SJohn Marino #endif 42*32fe07f8SJohn Marino #endif /* not lint && not SCCSID */ 43*32fe07f8SJohn Marino 44*32fe07f8SJohn Marino /* 45*32fe07f8SJohn Marino * emacs.c: Emacs functions 46*32fe07f8SJohn Marino */ 47*32fe07f8SJohn Marino #include "el.h" 48*32fe07f8SJohn Marino 49*32fe07f8SJohn Marino /* em_delete_or_list(): 50*32fe07f8SJohn Marino * Delete character under cursor or list completions if at end of line 51*32fe07f8SJohn Marino * [^D] 52*32fe07f8SJohn Marino */ 53*32fe07f8SJohn Marino protected el_action_t 54*32fe07f8SJohn Marino /*ARGSUSED*/ 55*32fe07f8SJohn Marino em_delete_or_list(EditLine *el, Int c) 56*32fe07f8SJohn Marino { 57*32fe07f8SJohn Marino 58*32fe07f8SJohn Marino if (el->el_line.cursor == el->el_line.lastchar) { 59*32fe07f8SJohn Marino /* if I'm at the end */ 60*32fe07f8SJohn Marino if (el->el_line.cursor == el->el_line.buffer) { 61*32fe07f8SJohn Marino /* and the beginning */ 62*32fe07f8SJohn Marino terminal_writec(el, c); /* then do an EOF */ 63*32fe07f8SJohn Marino return CC_EOF; 64*32fe07f8SJohn Marino } else { 65*32fe07f8SJohn Marino /* 66*32fe07f8SJohn Marino * Here we could list completions, but it is an 67*32fe07f8SJohn Marino * error right now 68*32fe07f8SJohn Marino */ 69*32fe07f8SJohn Marino terminal_beep(el); 70*32fe07f8SJohn Marino return CC_ERROR; 71*32fe07f8SJohn Marino } 72*32fe07f8SJohn Marino } else { 73*32fe07f8SJohn Marino if (el->el_state.doingarg) 74*32fe07f8SJohn Marino c_delafter(el, el->el_state.argument); 75*32fe07f8SJohn Marino else 76*32fe07f8SJohn Marino c_delafter1(el); 77*32fe07f8SJohn Marino if (el->el_line.cursor > el->el_line.lastchar) 78*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.lastchar; 79*32fe07f8SJohn Marino /* bounds check */ 80*32fe07f8SJohn Marino return CC_REFRESH; 81*32fe07f8SJohn Marino } 82*32fe07f8SJohn Marino } 83*32fe07f8SJohn Marino 84*32fe07f8SJohn Marino 85*32fe07f8SJohn Marino /* em_delete_next_word(): 86*32fe07f8SJohn Marino * Cut from cursor to end of current word 87*32fe07f8SJohn Marino * [M-d] 88*32fe07f8SJohn Marino */ 89*32fe07f8SJohn Marino protected el_action_t 90*32fe07f8SJohn Marino /*ARGSUSED*/ 91*32fe07f8SJohn Marino em_delete_next_word(EditLine *el, Int c __attribute__((__unused__))) 92*32fe07f8SJohn Marino { 93*32fe07f8SJohn Marino Char *cp, *p, *kp; 94*32fe07f8SJohn Marino 95*32fe07f8SJohn Marino if (el->el_line.cursor == el->el_line.lastchar) 96*32fe07f8SJohn Marino return CC_ERROR; 97*32fe07f8SJohn Marino 98*32fe07f8SJohn Marino cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, 99*32fe07f8SJohn Marino el->el_state.argument, ce__isword); 100*32fe07f8SJohn Marino 101*32fe07f8SJohn Marino for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) 102*32fe07f8SJohn Marino /* save the text */ 103*32fe07f8SJohn Marino *kp++ = *p; 104*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 105*32fe07f8SJohn Marino 106*32fe07f8SJohn Marino c_delafter(el, (int)(cp - el->el_line.cursor)); /* delete after dot */ 107*32fe07f8SJohn Marino if (el->el_line.cursor > el->el_line.lastchar) 108*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.lastchar; 109*32fe07f8SJohn Marino /* bounds check */ 110*32fe07f8SJohn Marino return CC_REFRESH; 111*32fe07f8SJohn Marino } 112*32fe07f8SJohn Marino 113*32fe07f8SJohn Marino 114*32fe07f8SJohn Marino /* em_yank(): 115*32fe07f8SJohn Marino * Paste cut buffer at cursor position 116*32fe07f8SJohn Marino * [^Y] 117*32fe07f8SJohn Marino */ 118*32fe07f8SJohn Marino protected el_action_t 119*32fe07f8SJohn Marino /*ARGSUSED*/ 120*32fe07f8SJohn Marino em_yank(EditLine *el, Int c __attribute__((__unused__))) 121*32fe07f8SJohn Marino { 122*32fe07f8SJohn Marino Char *kp, *cp; 123*32fe07f8SJohn Marino 124*32fe07f8SJohn Marino if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) 125*32fe07f8SJohn Marino return CC_NORM; 126*32fe07f8SJohn Marino 127*32fe07f8SJohn Marino if (el->el_line.lastchar + 128*32fe07f8SJohn Marino (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= 129*32fe07f8SJohn Marino el->el_line.limit) 130*32fe07f8SJohn Marino return CC_ERROR; 131*32fe07f8SJohn Marino 132*32fe07f8SJohn Marino el->el_chared.c_kill.mark = el->el_line.cursor; 133*32fe07f8SJohn Marino cp = el->el_line.cursor; 134*32fe07f8SJohn Marino 135*32fe07f8SJohn Marino /* open the space, */ 136*32fe07f8SJohn Marino c_insert(el, 137*32fe07f8SJohn Marino (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf)); 138*32fe07f8SJohn Marino /* copy the chars */ 139*32fe07f8SJohn Marino for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++) 140*32fe07f8SJohn Marino *cp++ = *kp; 141*32fe07f8SJohn Marino 142*32fe07f8SJohn Marino /* if an arg, cursor at beginning else cursor at end */ 143*32fe07f8SJohn Marino if (el->el_state.argument == 1) 144*32fe07f8SJohn Marino el->el_line.cursor = cp; 145*32fe07f8SJohn Marino 146*32fe07f8SJohn Marino return CC_REFRESH; 147*32fe07f8SJohn Marino } 148*32fe07f8SJohn Marino 149*32fe07f8SJohn Marino 150*32fe07f8SJohn Marino /* em_kill_line(): 151*32fe07f8SJohn Marino * Cut the entire line and save in cut buffer 152*32fe07f8SJohn Marino * [^U] 153*32fe07f8SJohn Marino */ 154*32fe07f8SJohn Marino protected el_action_t 155*32fe07f8SJohn Marino /*ARGSUSED*/ 156*32fe07f8SJohn Marino em_kill_line(EditLine *el, Int c __attribute__((__unused__))) 157*32fe07f8SJohn Marino { 158*32fe07f8SJohn Marino Char *kp, *cp; 159*32fe07f8SJohn Marino 160*32fe07f8SJohn Marino cp = el->el_line.buffer; 161*32fe07f8SJohn Marino kp = el->el_chared.c_kill.buf; 162*32fe07f8SJohn Marino while (cp < el->el_line.lastchar) 163*32fe07f8SJohn Marino *kp++ = *cp++; /* copy it */ 164*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 165*32fe07f8SJohn Marino /* zap! -- delete all of it */ 166*32fe07f8SJohn Marino el->el_line.lastchar = el->el_line.buffer; 167*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.buffer; 168*32fe07f8SJohn Marino return CC_REFRESH; 169*32fe07f8SJohn Marino } 170*32fe07f8SJohn Marino 171*32fe07f8SJohn Marino 172*32fe07f8SJohn Marino /* em_kill_region(): 173*32fe07f8SJohn Marino * Cut area between mark and cursor and save in cut buffer 174*32fe07f8SJohn Marino * [^W] 175*32fe07f8SJohn Marino */ 176*32fe07f8SJohn Marino protected el_action_t 177*32fe07f8SJohn Marino /*ARGSUSED*/ 178*32fe07f8SJohn Marino em_kill_region(EditLine *el, Int c __attribute__((__unused__))) 179*32fe07f8SJohn Marino { 180*32fe07f8SJohn Marino Char *kp, *cp; 181*32fe07f8SJohn Marino 182*32fe07f8SJohn Marino if (!el->el_chared.c_kill.mark) 183*32fe07f8SJohn Marino return CC_ERROR; 184*32fe07f8SJohn Marino 185*32fe07f8SJohn Marino if (el->el_chared.c_kill.mark > el->el_line.cursor) { 186*32fe07f8SJohn Marino cp = el->el_line.cursor; 187*32fe07f8SJohn Marino kp = el->el_chared.c_kill.buf; 188*32fe07f8SJohn Marino while (cp < el->el_chared.c_kill.mark) 189*32fe07f8SJohn Marino *kp++ = *cp++; /* copy it */ 190*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 191*32fe07f8SJohn Marino c_delafter(el, (int)(cp - el->el_line.cursor)); 192*32fe07f8SJohn Marino } else { /* mark is before cursor */ 193*32fe07f8SJohn Marino cp = el->el_chared.c_kill.mark; 194*32fe07f8SJohn Marino kp = el->el_chared.c_kill.buf; 195*32fe07f8SJohn Marino while (cp < el->el_line.cursor) 196*32fe07f8SJohn Marino *kp++ = *cp++; /* copy it */ 197*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 198*32fe07f8SJohn Marino c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark)); 199*32fe07f8SJohn Marino el->el_line.cursor = el->el_chared.c_kill.mark; 200*32fe07f8SJohn Marino } 201*32fe07f8SJohn Marino return CC_REFRESH; 202*32fe07f8SJohn Marino } 203*32fe07f8SJohn Marino 204*32fe07f8SJohn Marino 205*32fe07f8SJohn Marino /* em_copy_region(): 206*32fe07f8SJohn Marino * Copy area between mark and cursor to cut buffer 207*32fe07f8SJohn Marino * [M-W] 208*32fe07f8SJohn Marino */ 209*32fe07f8SJohn Marino protected el_action_t 210*32fe07f8SJohn Marino /*ARGSUSED*/ 211*32fe07f8SJohn Marino em_copy_region(EditLine *el, Int c __attribute__((__unused__))) 212*32fe07f8SJohn Marino { 213*32fe07f8SJohn Marino Char *kp, *cp; 214*32fe07f8SJohn Marino 215*32fe07f8SJohn Marino if (!el->el_chared.c_kill.mark) 216*32fe07f8SJohn Marino return CC_ERROR; 217*32fe07f8SJohn Marino 218*32fe07f8SJohn Marino if (el->el_chared.c_kill.mark > el->el_line.cursor) { 219*32fe07f8SJohn Marino cp = el->el_line.cursor; 220*32fe07f8SJohn Marino kp = el->el_chared.c_kill.buf; 221*32fe07f8SJohn Marino while (cp < el->el_chared.c_kill.mark) 222*32fe07f8SJohn Marino *kp++ = *cp++; /* copy it */ 223*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 224*32fe07f8SJohn Marino } else { 225*32fe07f8SJohn Marino cp = el->el_chared.c_kill.mark; 226*32fe07f8SJohn Marino kp = el->el_chared.c_kill.buf; 227*32fe07f8SJohn Marino while (cp < el->el_line.cursor) 228*32fe07f8SJohn Marino *kp++ = *cp++; /* copy it */ 229*32fe07f8SJohn Marino el->el_chared.c_kill.last = kp; 230*32fe07f8SJohn Marino } 231*32fe07f8SJohn Marino return CC_NORM; 232*32fe07f8SJohn Marino } 233*32fe07f8SJohn Marino 234*32fe07f8SJohn Marino 235*32fe07f8SJohn Marino /* em_gosmacs_transpose(): 236*32fe07f8SJohn Marino * Exchange the two characters before the cursor 237*32fe07f8SJohn Marino * Gosling emacs transpose chars [^T] 238*32fe07f8SJohn Marino */ 239*32fe07f8SJohn Marino protected el_action_t 240*32fe07f8SJohn Marino em_gosmacs_transpose(EditLine *el, Int c) 241*32fe07f8SJohn Marino { 242*32fe07f8SJohn Marino 243*32fe07f8SJohn Marino if (el->el_line.cursor > &el->el_line.buffer[1]) { 244*32fe07f8SJohn Marino /* must have at least two chars entered */ 245*32fe07f8SJohn Marino c = el->el_line.cursor[-2]; 246*32fe07f8SJohn Marino el->el_line.cursor[-2] = el->el_line.cursor[-1]; 247*32fe07f8SJohn Marino el->el_line.cursor[-1] = c; 248*32fe07f8SJohn Marino return CC_REFRESH; 249*32fe07f8SJohn Marino } else 250*32fe07f8SJohn Marino return CC_ERROR; 251*32fe07f8SJohn Marino } 252*32fe07f8SJohn Marino 253*32fe07f8SJohn Marino 254*32fe07f8SJohn Marino /* em_next_word(): 255*32fe07f8SJohn Marino * Move next to end of current word 256*32fe07f8SJohn Marino * [M-f] 257*32fe07f8SJohn Marino */ 258*32fe07f8SJohn Marino protected el_action_t 259*32fe07f8SJohn Marino /*ARGSUSED*/ 260*32fe07f8SJohn Marino em_next_word(EditLine *el, Int c __attribute__((__unused__))) 261*32fe07f8SJohn Marino { 262*32fe07f8SJohn Marino if (el->el_line.cursor == el->el_line.lastchar) 263*32fe07f8SJohn Marino return CC_ERROR; 264*32fe07f8SJohn Marino 265*32fe07f8SJohn Marino el->el_line.cursor = c__next_word(el->el_line.cursor, 266*32fe07f8SJohn Marino el->el_line.lastchar, 267*32fe07f8SJohn Marino el->el_state.argument, 268*32fe07f8SJohn Marino ce__isword); 269*32fe07f8SJohn Marino 270*32fe07f8SJohn Marino if (el->el_map.type == MAP_VI) 271*32fe07f8SJohn Marino if (el->el_chared.c_vcmd.action != NOP) { 272*32fe07f8SJohn Marino cv_delfini(el); 273*32fe07f8SJohn Marino return CC_REFRESH; 274*32fe07f8SJohn Marino } 275*32fe07f8SJohn Marino return CC_CURSOR; 276*32fe07f8SJohn Marino } 277*32fe07f8SJohn Marino 278*32fe07f8SJohn Marino 279*32fe07f8SJohn Marino /* em_upper_case(): 280*32fe07f8SJohn Marino * Uppercase the characters from cursor to end of current word 281*32fe07f8SJohn Marino * [M-u] 282*32fe07f8SJohn Marino */ 283*32fe07f8SJohn Marino protected el_action_t 284*32fe07f8SJohn Marino /*ARGSUSED*/ 285*32fe07f8SJohn Marino em_upper_case(EditLine *el, Int c __attribute__((__unused__))) 286*32fe07f8SJohn Marino { 287*32fe07f8SJohn Marino Char *cp, *ep; 288*32fe07f8SJohn Marino 289*32fe07f8SJohn Marino ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, 290*32fe07f8SJohn Marino el->el_state.argument, ce__isword); 291*32fe07f8SJohn Marino 292*32fe07f8SJohn Marino for (cp = el->el_line.cursor; cp < ep; cp++) 293*32fe07f8SJohn Marino if (Islower(*cp)) 294*32fe07f8SJohn Marino *cp = Toupper(*cp); 295*32fe07f8SJohn Marino 296*32fe07f8SJohn Marino el->el_line.cursor = ep; 297*32fe07f8SJohn Marino if (el->el_line.cursor > el->el_line.lastchar) 298*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.lastchar; 299*32fe07f8SJohn Marino return CC_REFRESH; 300*32fe07f8SJohn Marino } 301*32fe07f8SJohn Marino 302*32fe07f8SJohn Marino 303*32fe07f8SJohn Marino /* em_capitol_case(): 304*32fe07f8SJohn Marino * Capitalize the characters from cursor to end of current word 305*32fe07f8SJohn Marino * [M-c] 306*32fe07f8SJohn Marino */ 307*32fe07f8SJohn Marino protected el_action_t 308*32fe07f8SJohn Marino /*ARGSUSED*/ 309*32fe07f8SJohn Marino em_capitol_case(EditLine *el, Int c __attribute__((__unused__))) 310*32fe07f8SJohn Marino { 311*32fe07f8SJohn Marino Char *cp, *ep; 312*32fe07f8SJohn Marino 313*32fe07f8SJohn Marino ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, 314*32fe07f8SJohn Marino el->el_state.argument, ce__isword); 315*32fe07f8SJohn Marino 316*32fe07f8SJohn Marino for (cp = el->el_line.cursor; cp < ep; cp++) { 317*32fe07f8SJohn Marino if (Isalpha(*cp)) { 318*32fe07f8SJohn Marino if (Islower(*cp)) 319*32fe07f8SJohn Marino *cp = Toupper(*cp); 320*32fe07f8SJohn Marino cp++; 321*32fe07f8SJohn Marino break; 322*32fe07f8SJohn Marino } 323*32fe07f8SJohn Marino } 324*32fe07f8SJohn Marino for (; cp < ep; cp++) 325*32fe07f8SJohn Marino if (Isupper(*cp)) 326*32fe07f8SJohn Marino *cp = Tolower(*cp); 327*32fe07f8SJohn Marino 328*32fe07f8SJohn Marino el->el_line.cursor = ep; 329*32fe07f8SJohn Marino if (el->el_line.cursor > el->el_line.lastchar) 330*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.lastchar; 331*32fe07f8SJohn Marino return CC_REFRESH; 332*32fe07f8SJohn Marino } 333*32fe07f8SJohn Marino 334*32fe07f8SJohn Marino 335*32fe07f8SJohn Marino /* em_lower_case(): 336*32fe07f8SJohn Marino * Lowercase the characters from cursor to end of current word 337*32fe07f8SJohn Marino * [M-l] 338*32fe07f8SJohn Marino */ 339*32fe07f8SJohn Marino protected el_action_t 340*32fe07f8SJohn Marino /*ARGSUSED*/ 341*32fe07f8SJohn Marino em_lower_case(EditLine *el, Int c __attribute__((__unused__))) 342*32fe07f8SJohn Marino { 343*32fe07f8SJohn Marino Char *cp, *ep; 344*32fe07f8SJohn Marino 345*32fe07f8SJohn Marino ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, 346*32fe07f8SJohn Marino el->el_state.argument, ce__isword); 347*32fe07f8SJohn Marino 348*32fe07f8SJohn Marino for (cp = el->el_line.cursor; cp < ep; cp++) 349*32fe07f8SJohn Marino if (Isupper(*cp)) 350*32fe07f8SJohn Marino *cp = Tolower(*cp); 351*32fe07f8SJohn Marino 352*32fe07f8SJohn Marino el->el_line.cursor = ep; 353*32fe07f8SJohn Marino if (el->el_line.cursor > el->el_line.lastchar) 354*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.lastchar; 355*32fe07f8SJohn Marino return CC_REFRESH; 356*32fe07f8SJohn Marino } 357*32fe07f8SJohn Marino 358*32fe07f8SJohn Marino 359*32fe07f8SJohn Marino /* em_set_mark(): 360*32fe07f8SJohn Marino * Set the mark at cursor 361*32fe07f8SJohn Marino * [^@] 362*32fe07f8SJohn Marino */ 363*32fe07f8SJohn Marino protected el_action_t 364*32fe07f8SJohn Marino /*ARGSUSED*/ 365*32fe07f8SJohn Marino em_set_mark(EditLine *el, Int c __attribute__((__unused__))) 366*32fe07f8SJohn Marino { 367*32fe07f8SJohn Marino 368*32fe07f8SJohn Marino el->el_chared.c_kill.mark = el->el_line.cursor; 369*32fe07f8SJohn Marino return CC_NORM; 370*32fe07f8SJohn Marino } 371*32fe07f8SJohn Marino 372*32fe07f8SJohn Marino 373*32fe07f8SJohn Marino /* em_exchange_mark(): 374*32fe07f8SJohn Marino * Exchange the cursor and mark 375*32fe07f8SJohn Marino * [^X^X] 376*32fe07f8SJohn Marino */ 377*32fe07f8SJohn Marino protected el_action_t 378*32fe07f8SJohn Marino /*ARGSUSED*/ 379*32fe07f8SJohn Marino em_exchange_mark(EditLine *el, Int c __attribute__((__unused__))) 380*32fe07f8SJohn Marino { 381*32fe07f8SJohn Marino Char *cp; 382*32fe07f8SJohn Marino 383*32fe07f8SJohn Marino cp = el->el_line.cursor; 384*32fe07f8SJohn Marino el->el_line.cursor = el->el_chared.c_kill.mark; 385*32fe07f8SJohn Marino el->el_chared.c_kill.mark = cp; 386*32fe07f8SJohn Marino return CC_CURSOR; 387*32fe07f8SJohn Marino } 388*32fe07f8SJohn Marino 389*32fe07f8SJohn Marino 390*32fe07f8SJohn Marino /* em_universal_argument(): 391*32fe07f8SJohn Marino * Universal argument (argument times 4) 392*32fe07f8SJohn Marino * [^U] 393*32fe07f8SJohn Marino */ 394*32fe07f8SJohn Marino protected el_action_t 395*32fe07f8SJohn Marino /*ARGSUSED*/ 396*32fe07f8SJohn Marino em_universal_argument(EditLine *el, Int c __attribute__((__unused__))) 397*32fe07f8SJohn Marino { /* multiply current argument by 4 */ 398*32fe07f8SJohn Marino 399*32fe07f8SJohn Marino if (el->el_state.argument > 1000000) 400*32fe07f8SJohn Marino return CC_ERROR; 401*32fe07f8SJohn Marino el->el_state.doingarg = 1; 402*32fe07f8SJohn Marino el->el_state.argument *= 4; 403*32fe07f8SJohn Marino return CC_ARGHACK; 404*32fe07f8SJohn Marino } 405*32fe07f8SJohn Marino 406*32fe07f8SJohn Marino 407*32fe07f8SJohn Marino /* em_meta_next(): 408*32fe07f8SJohn Marino * Add 8th bit to next character typed 409*32fe07f8SJohn Marino * [<ESC>] 410*32fe07f8SJohn Marino */ 411*32fe07f8SJohn Marino protected el_action_t 412*32fe07f8SJohn Marino /*ARGSUSED*/ 413*32fe07f8SJohn Marino em_meta_next(EditLine *el, Int c __attribute__((__unused__))) 414*32fe07f8SJohn Marino { 415*32fe07f8SJohn Marino 416*32fe07f8SJohn Marino el->el_state.metanext = 1; 417*32fe07f8SJohn Marino return CC_ARGHACK; 418*32fe07f8SJohn Marino } 419*32fe07f8SJohn Marino 420*32fe07f8SJohn Marino 421*32fe07f8SJohn Marino /* em_toggle_overwrite(): 422*32fe07f8SJohn Marino * Switch from insert to overwrite mode or vice versa 423*32fe07f8SJohn Marino */ 424*32fe07f8SJohn Marino protected el_action_t 425*32fe07f8SJohn Marino /*ARGSUSED*/ 426*32fe07f8SJohn Marino em_toggle_overwrite(EditLine *el, Int c __attribute__((__unused__))) 427*32fe07f8SJohn Marino { 428*32fe07f8SJohn Marino 429*32fe07f8SJohn Marino el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? 430*32fe07f8SJohn Marino MODE_REPLACE : MODE_INSERT; 431*32fe07f8SJohn Marino return CC_NORM; 432*32fe07f8SJohn Marino } 433*32fe07f8SJohn Marino 434*32fe07f8SJohn Marino 435*32fe07f8SJohn Marino /* em_copy_prev_word(): 436*32fe07f8SJohn Marino * Copy current word to cursor 437*32fe07f8SJohn Marino */ 438*32fe07f8SJohn Marino protected el_action_t 439*32fe07f8SJohn Marino /*ARGSUSED*/ 440*32fe07f8SJohn Marino em_copy_prev_word(EditLine *el, Int c __attribute__((__unused__))) 441*32fe07f8SJohn Marino { 442*32fe07f8SJohn Marino Char *cp, *oldc, *dp; 443*32fe07f8SJohn Marino 444*32fe07f8SJohn Marino if (el->el_line.cursor == el->el_line.buffer) 445*32fe07f8SJohn Marino return CC_ERROR; 446*32fe07f8SJohn Marino 447*32fe07f8SJohn Marino oldc = el->el_line.cursor; 448*32fe07f8SJohn Marino /* does a bounds check */ 449*32fe07f8SJohn Marino cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, 450*32fe07f8SJohn Marino el->el_state.argument, ce__isword); 451*32fe07f8SJohn Marino 452*32fe07f8SJohn Marino c_insert(el, (int)(oldc - cp)); 453*32fe07f8SJohn Marino for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) 454*32fe07f8SJohn Marino *dp++ = *cp; 455*32fe07f8SJohn Marino 456*32fe07f8SJohn Marino el->el_line.cursor = dp;/* put cursor at end */ 457*32fe07f8SJohn Marino 458*32fe07f8SJohn Marino return CC_REFRESH; 459*32fe07f8SJohn Marino } 460*32fe07f8SJohn Marino 461*32fe07f8SJohn Marino 462*32fe07f8SJohn Marino /* em_inc_search_next(): 463*32fe07f8SJohn Marino * Emacs incremental next search 464*32fe07f8SJohn Marino */ 465*32fe07f8SJohn Marino protected el_action_t 466*32fe07f8SJohn Marino /*ARGSUSED*/ 467*32fe07f8SJohn Marino em_inc_search_next(EditLine *el, Int c __attribute__((__unused__))) 468*32fe07f8SJohn Marino { 469*32fe07f8SJohn Marino 470*32fe07f8SJohn Marino el->el_search.patlen = 0; 471*32fe07f8SJohn Marino return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); 472*32fe07f8SJohn Marino } 473*32fe07f8SJohn Marino 474*32fe07f8SJohn Marino 475*32fe07f8SJohn Marino /* em_inc_search_prev(): 476*32fe07f8SJohn Marino * Emacs incremental reverse search 477*32fe07f8SJohn Marino */ 478*32fe07f8SJohn Marino protected el_action_t 479*32fe07f8SJohn Marino /*ARGSUSED*/ 480*32fe07f8SJohn Marino em_inc_search_prev(EditLine *el, Int c __attribute__((__unused__))) 481*32fe07f8SJohn Marino { 482*32fe07f8SJohn Marino 483*32fe07f8SJohn Marino el->el_search.patlen = 0; 484*32fe07f8SJohn Marino return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); 485*32fe07f8SJohn Marino } 486*32fe07f8SJohn Marino 487*32fe07f8SJohn Marino 488*32fe07f8SJohn Marino /* em_delete_prev_char(): 489*32fe07f8SJohn Marino * Delete the character to the left of the cursor 490*32fe07f8SJohn Marino * [^?] 491*32fe07f8SJohn Marino */ 492*32fe07f8SJohn Marino protected el_action_t 493*32fe07f8SJohn Marino /*ARGSUSED*/ 494*32fe07f8SJohn Marino em_delete_prev_char(EditLine *el, Int c __attribute__((__unused__))) 495*32fe07f8SJohn Marino { 496*32fe07f8SJohn Marino 497*32fe07f8SJohn Marino if (el->el_line.cursor <= el->el_line.buffer) 498*32fe07f8SJohn Marino return CC_ERROR; 499*32fe07f8SJohn Marino 500*32fe07f8SJohn Marino if (el->el_state.doingarg) 501*32fe07f8SJohn Marino c_delbefore(el, el->el_state.argument); 502*32fe07f8SJohn Marino else 503*32fe07f8SJohn Marino c_delbefore1(el); 504*32fe07f8SJohn Marino el->el_line.cursor -= el->el_state.argument; 505*32fe07f8SJohn Marino if (el->el_line.cursor < el->el_line.buffer) 506*32fe07f8SJohn Marino el->el_line.cursor = el->el_line.buffer; 507*32fe07f8SJohn Marino return CC_REFRESH; 508*32fe07f8SJohn Marino } 509