xref: /dflybsd-src/contrib/libedit/src/emacs.c (revision 32fe07f89d87adfc65eebe9f2812a999af20d10f)
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