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