11573Srgrimes/*-
21573Srgrimes * Copyright (c) 1992, 1993
31573Srgrimes *	The Regents of the University of California.  All rights reserved.
41573Srgrimes *
51573Srgrimes * This code is derived from software contributed to Berkeley by
61573Srgrimes * Christos Zoulas of Cornell University.
71573Srgrimes *
81573Srgrimes * Redistribution and use in source and binary forms, with or without
91573Srgrimes * modification, are permitted provided that the following conditions
101573Srgrimes * are met:
111573Srgrimes * 1. Redistributions of source code must retain the above copyright
121573Srgrimes *    notice, this list of conditions and the following disclaimer.
131573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
141573Srgrimes *    notice, this list of conditions and the following disclaimer in the
151573Srgrimes *    documentation and/or other materials provided with the distribution.
16148834Sstefanf * 3. Neither the name of the University nor the names of its contributors
171573Srgrimes *    may be used to endorse or promote products derived from this software
181573Srgrimes *    without specific prior written permission.
191573Srgrimes *
201573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
211573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
221573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
231573Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
241573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
251573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
261573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
271573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
281573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
291573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
301573Srgrimes * SUCH DAMAGE.
3184260Sobrien *
32167457Sstefanf *	$NetBSD: emacs.c,v 1.21 2006/03/06 21:11:56 christos Exp $
331573Srgrimes */
341573Srgrimes
351573Srgrimes#if !defined(lint) && !defined(SCCSID)
361573Srgrimesstatic char sccsid[] = "@(#)emacs.c	8.1 (Berkeley) 6/4/93";
371573Srgrimes#endif /* not lint && not SCCSID */
3884260Sobrien#include <sys/cdefs.h>
3984260Sobrien__FBSDID("$FreeBSD$");
401573Srgrimes
418870Srgrimes/*
421573Srgrimes * emacs.c: Emacs functions
431573Srgrimes */
441573Srgrimes#include "sys.h"
451573Srgrimes#include "el.h"
461573Srgrimes
471573Srgrimes/* em_delete_or_list():
481573Srgrimes *	Delete character under cursor or list completions if at end of line
491573Srgrimes *	[^D]
501573Srgrimes */
511573Srgrimesprotected el_action_t
521573Srgrimes/*ARGSUSED*/
53167457Sstefanfem_delete_or_list(EditLine *el, int c)
541573Srgrimes{
5584260Sobrien
5684260Sobrien	if (el->el_line.cursor == el->el_line.lastchar) {
5784260Sobrien					/* if I'm at the end */
5884260Sobrien		if (el->el_line.cursor == el->el_line.buffer) {
5984260Sobrien					/* and the beginning */
60167457Sstefanf			term_writec(el, c);	/* then do an EOF */
6184260Sobrien			return (CC_EOF);
6284260Sobrien		} else {
6384260Sobrien			/*
6484260Sobrien			 * Here we could list completions, but it is an
6584260Sobrien			 * error right now
6684260Sobrien			 */
6784260Sobrien			term_beep(el);
6884260Sobrien			return (CC_ERROR);
6984260Sobrien		}
7084260Sobrien	} else {
71148834Sstefanf		if (el->el_state.doingarg)
72148834Sstefanf			c_delafter(el, el->el_state.argument);
73148834Sstefanf		else
74148834Sstefanf			c_delafter1(el);
7584260Sobrien		if (el->el_line.cursor > el->el_line.lastchar)
7684260Sobrien			el->el_line.cursor = el->el_line.lastchar;
7784260Sobrien				/* bounds check */
7884260Sobrien		return (CC_REFRESH);
791573Srgrimes	}
801573Srgrimes}
811573Srgrimes
821573Srgrimes
831573Srgrimes/* em_delete_next_word():
841573Srgrimes *	Cut from cursor to end of current word
851573Srgrimes *	[M-d]
861573Srgrimes */
871573Srgrimesprotected el_action_t
881573Srgrimes/*ARGSUSED*/
89148834Sstefanfem_delete_next_word(EditLine *el, int c __unused)
901573Srgrimes{
9184260Sobrien	char *cp, *p, *kp;
921573Srgrimes
9384260Sobrien	if (el->el_line.cursor == el->el_line.lastchar)
9484260Sobrien		return (CC_ERROR);
951573Srgrimes
9684260Sobrien	cp = c__next_word(el->el_line.cursor, el->el_line.lastchar,
9784260Sobrien	    el->el_state.argument, ce__isword);
981573Srgrimes
9984260Sobrien	for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++)
10084260Sobrien				/* save the text */
10184260Sobrien		*kp++ = *p;
10284260Sobrien	el->el_chared.c_kill.last = kp;
1031573Srgrimes
10484260Sobrien	c_delafter(el, cp - el->el_line.cursor);	/* delete after dot */
10584260Sobrien	if (el->el_line.cursor > el->el_line.lastchar)
10684260Sobrien		el->el_line.cursor = el->el_line.lastchar;
10784260Sobrien				/* bounds check */
10884260Sobrien	return (CC_REFRESH);
1091573Srgrimes}
1101573Srgrimes
1111573Srgrimes
1121573Srgrimes/* em_yank():
1131573Srgrimes *	Paste cut buffer at cursor position
1141573Srgrimes *	[^Y]
1151573Srgrimes */
1161573Srgrimesprotected el_action_t
1171573Srgrimes/*ARGSUSED*/
118148834Sstefanfem_yank(EditLine *el, int c __unused)
1191573Srgrimes{
12084260Sobrien	char *kp, *cp;
1211573Srgrimes
122148834Sstefanf	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
123148834Sstefanf		return (CC_NORM);
1241573Srgrimes
12584260Sobrien	if (el->el_line.lastchar +
12684260Sobrien	    (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >=
12784260Sobrien	    el->el_line.limit)
12884260Sobrien		return (CC_ERROR);
1291573Srgrimes
13084260Sobrien	el->el_chared.c_kill.mark = el->el_line.cursor;
13184260Sobrien	cp = el->el_line.cursor;
1321573Srgrimes
13384260Sobrien	/* open the space, */
13484260Sobrien	c_insert(el, el->el_chared.c_kill.last - el->el_chared.c_kill.buf);
13584260Sobrien	/* copy the chars */
13684260Sobrien	for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
13784260Sobrien		*cp++ = *kp;
1381573Srgrimes
13984260Sobrien	/* if an arg, cursor at beginning else cursor at end */
14084260Sobrien	if (el->el_state.argument == 1)
14184260Sobrien		el->el_line.cursor = cp;
1421573Srgrimes
14384260Sobrien	return (CC_REFRESH);
1441573Srgrimes}
1451573Srgrimes
1461573Srgrimes
1471573Srgrimes/* em_kill_line():
1481573Srgrimes *	Cut the entire line and save in cut buffer
1491573Srgrimes *	[^U]
1501573Srgrimes */
1511573Srgrimesprotected el_action_t
1521573Srgrimes/*ARGSUSED*/
153148834Sstefanfem_kill_line(EditLine *el, int c __unused)
1541573Srgrimes{
15584260Sobrien	char *kp, *cp;
1561573Srgrimes
15784260Sobrien	cp = el->el_line.buffer;
15884260Sobrien	kp = el->el_chared.c_kill.buf;
15984260Sobrien	while (cp < el->el_line.lastchar)
16084260Sobrien		*kp++ = *cp++;	/* copy it */
16184260Sobrien	el->el_chared.c_kill.last = kp;
16284260Sobrien				/* zap! -- delete all of it */
16384260Sobrien	el->el_line.lastchar = el->el_line.buffer;
16484260Sobrien	el->el_line.cursor = el->el_line.buffer;
16584260Sobrien	return (CC_REFRESH);
1661573Srgrimes}
1671573Srgrimes
1681573Srgrimes
1691573Srgrimes/* em_kill_region():
1701573Srgrimes *	Cut area between mark and cursor and save in cut buffer
1711573Srgrimes *	[^W]
1721573Srgrimes */
1731573Srgrimesprotected el_action_t
1741573Srgrimes/*ARGSUSED*/
175148834Sstefanfem_kill_region(EditLine *el, int c __unused)
1761573Srgrimes{
17784260Sobrien	char *kp, *cp;
1781573Srgrimes
17984260Sobrien	if (!el->el_chared.c_kill.mark)
18084260Sobrien		return (CC_ERROR);
1811573Srgrimes
18284260Sobrien	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
18384260Sobrien		cp = el->el_line.cursor;
18484260Sobrien		kp = el->el_chared.c_kill.buf;
18584260Sobrien		while (cp < el->el_chared.c_kill.mark)
18684260Sobrien			*kp++ = *cp++;	/* copy it */
18784260Sobrien		el->el_chared.c_kill.last = kp;
18884260Sobrien		c_delafter(el, cp - el->el_line.cursor);
18984260Sobrien	} else {		/* mark is before cursor */
19084260Sobrien		cp = el->el_chared.c_kill.mark;
19184260Sobrien		kp = el->el_chared.c_kill.buf;
19284260Sobrien		while (cp < el->el_line.cursor)
19384260Sobrien			*kp++ = *cp++;	/* copy it */
19484260Sobrien		el->el_chared.c_kill.last = kp;
19584260Sobrien		c_delbefore(el, cp - el->el_chared.c_kill.mark);
19684260Sobrien		el->el_line.cursor = el->el_chared.c_kill.mark;
19784260Sobrien	}
19884260Sobrien	return (CC_REFRESH);
1991573Srgrimes}
2001573Srgrimes
2011573Srgrimes
2021573Srgrimes/* em_copy_region():
2031573Srgrimes *	Copy area between mark and cursor to cut buffer
2041573Srgrimes *	[M-W]
2051573Srgrimes */
2061573Srgrimesprotected el_action_t
2071573Srgrimes/*ARGSUSED*/
208148834Sstefanfem_copy_region(EditLine *el, int c __unused)
2091573Srgrimes{
21084260Sobrien	char *kp, *cp;
2111573Srgrimes
212148834Sstefanf	if (!el->el_chared.c_kill.mark)
21384260Sobrien		return (CC_ERROR);
2141573Srgrimes
21584260Sobrien	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
21684260Sobrien		cp = el->el_line.cursor;
21784260Sobrien		kp = el->el_chared.c_kill.buf;
21884260Sobrien		while (cp < el->el_chared.c_kill.mark)
21984260Sobrien			*kp++ = *cp++;	/* copy it */
22084260Sobrien		el->el_chared.c_kill.last = kp;
22184260Sobrien	} else {
22284260Sobrien		cp = el->el_chared.c_kill.mark;
22384260Sobrien		kp = el->el_chared.c_kill.buf;
22484260Sobrien		while (cp < el->el_line.cursor)
22584260Sobrien			*kp++ = *cp++;	/* copy it */
22684260Sobrien		el->el_chared.c_kill.last = kp;
22784260Sobrien	}
22884260Sobrien	return (CC_NORM);
2291573Srgrimes}
2301573Srgrimes
2311573Srgrimes
232148834Sstefanf/* em_gosmacs_transpose():
2331573Srgrimes *	Exchange the two characters before the cursor
2341573Srgrimes *	Gosling emacs transpose chars [^T]
2351573Srgrimes */
2361573Srgrimesprotected el_action_t
237148834Sstefanfem_gosmacs_transpose(EditLine *el, int c)
2381573Srgrimes{
2391573Srgrimes
24084260Sobrien	if (el->el_line.cursor > &el->el_line.buffer[1]) {
24184260Sobrien		/* must have at least two chars entered */
24284260Sobrien		c = el->el_line.cursor[-2];
24384260Sobrien		el->el_line.cursor[-2] = el->el_line.cursor[-1];
24484260Sobrien		el->el_line.cursor[-1] = c;
24584260Sobrien		return (CC_REFRESH);
24684260Sobrien	} else
24784260Sobrien		return (CC_ERROR);
2481573Srgrimes}
2491573Srgrimes
2501573Srgrimes
2511573Srgrimes/* em_next_word():
2521573Srgrimes *	Move next to end of current word
2531573Srgrimes *	[M-f]
2541573Srgrimes */
2551573Srgrimesprotected el_action_t
2561573Srgrimes/*ARGSUSED*/
257148834Sstefanfem_next_word(EditLine *el, int c __unused)
2581573Srgrimes{
25984260Sobrien	if (el->el_line.cursor == el->el_line.lastchar)
26084260Sobrien		return (CC_ERROR);
2611573Srgrimes
26284260Sobrien	el->el_line.cursor = c__next_word(el->el_line.cursor,
26384260Sobrien	    el->el_line.lastchar,
26484260Sobrien	    el->el_state.argument,
26584260Sobrien	    ce__isword);
2661573Srgrimes
26784260Sobrien	if (el->el_map.type == MAP_VI)
268148834Sstefanf		if (el->el_chared.c_vcmd.action != NOP) {
26984260Sobrien			cv_delfini(el);
27084260Sobrien			return (CC_REFRESH);
27184260Sobrien		}
27284260Sobrien	return (CC_CURSOR);
2731573Srgrimes}
2741573Srgrimes
27584260Sobrien
2761573Srgrimes/* em_upper_case():
2771573Srgrimes *	Uppercase the characters from cursor to end of current word
2781573Srgrimes *	[M-u]
2791573Srgrimes */
2801573Srgrimesprotected el_action_t
2811573Srgrimes/*ARGSUSED*/
282148834Sstefanfem_upper_case(EditLine *el, int c __unused)
2831573Srgrimes{
28484260Sobrien	char *cp, *ep;
2851573Srgrimes
28684260Sobrien	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
28784260Sobrien	    el->el_state.argument, ce__isword);
2881573Srgrimes
28984260Sobrien	for (cp = el->el_line.cursor; cp < ep; cp++)
290148834Sstefanf		if (islower((unsigned char)*cp))
291148834Sstefanf			*cp = toupper((unsigned char)*cp);
2921573Srgrimes
29384260Sobrien	el->el_line.cursor = ep;
29484260Sobrien	if (el->el_line.cursor > el->el_line.lastchar)
29584260Sobrien		el->el_line.cursor = el->el_line.lastchar;
29684260Sobrien	return (CC_REFRESH);
2971573Srgrimes}
2981573Srgrimes
2991573Srgrimes
3001573Srgrimes/* em_capitol_case():
3011573Srgrimes *	Capitalize the characters from cursor to end of current word
3021573Srgrimes *	[M-c]
3031573Srgrimes */
3041573Srgrimesprotected el_action_t
3051573Srgrimes/*ARGSUSED*/
306148834Sstefanfem_capitol_case(EditLine *el, int c __unused)
3071573Srgrimes{
30884260Sobrien	char *cp, *ep;
3091573Srgrimes
31084260Sobrien	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
31184260Sobrien	    el->el_state.argument, ce__isword);
3121573Srgrimes
31384260Sobrien	for (cp = el->el_line.cursor; cp < ep; cp++) {
314148834Sstefanf		if (isalpha((unsigned char)*cp)) {
315148834Sstefanf			if (islower((unsigned char)*cp))
316148834Sstefanf				*cp = toupper((unsigned char)*cp);
31784260Sobrien			cp++;
31884260Sobrien			break;
31984260Sobrien		}
3201573Srgrimes	}
32184260Sobrien	for (; cp < ep; cp++)
322148834Sstefanf		if (isupper((unsigned char)*cp))
323148834Sstefanf			*cp = tolower((unsigned char)*cp);
3241573Srgrimes
32584260Sobrien	el->el_line.cursor = ep;
32684260Sobrien	if (el->el_line.cursor > el->el_line.lastchar)
32784260Sobrien		el->el_line.cursor = el->el_line.lastchar;
32884260Sobrien	return (CC_REFRESH);
3291573Srgrimes}
3301573Srgrimes
33184260Sobrien
3321573Srgrimes/* em_lower_case():
3331573Srgrimes *	Lowercase the characters from cursor to end of current word
3341573Srgrimes *	[M-l]
3351573Srgrimes */
3361573Srgrimesprotected el_action_t
3371573Srgrimes/*ARGSUSED*/
338148834Sstefanfem_lower_case(EditLine *el, int c __unused)
3391573Srgrimes{
34084260Sobrien	char *cp, *ep;
3411573Srgrimes
34284260Sobrien	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
34384260Sobrien	    el->el_state.argument, ce__isword);
3441573Srgrimes
34584260Sobrien	for (cp = el->el_line.cursor; cp < ep; cp++)
346148834Sstefanf		if (isupper((unsigned char)*cp))
347148834Sstefanf			*cp = tolower((unsigned char)*cp);
3481573Srgrimes
34984260Sobrien	el->el_line.cursor = ep;
35084260Sobrien	if (el->el_line.cursor > el->el_line.lastchar)
35184260Sobrien		el->el_line.cursor = el->el_line.lastchar;
35284260Sobrien	return (CC_REFRESH);
3531573Srgrimes}
3541573Srgrimes
3551573Srgrimes
3561573Srgrimes/* em_set_mark():
3571573Srgrimes *	Set the mark at cursor
3581573Srgrimes *	[^@]
3591573Srgrimes */
3601573Srgrimesprotected el_action_t
3611573Srgrimes/*ARGSUSED*/
362148834Sstefanfem_set_mark(EditLine *el, int c __unused)
3631573Srgrimes{
36484260Sobrien
36584260Sobrien	el->el_chared.c_kill.mark = el->el_line.cursor;
36684260Sobrien	return (CC_NORM);
3671573Srgrimes}
3681573Srgrimes
3691573Srgrimes
3701573Srgrimes/* em_exchange_mark():
3718870Srgrimes *	Exchange the cursor and mark
3721573Srgrimes *	[^X^X]
3731573Srgrimes */
3741573Srgrimesprotected el_action_t
3751573Srgrimes/*ARGSUSED*/
376148834Sstefanfem_exchange_mark(EditLine *el, int c __unused)
3771573Srgrimes{
37884260Sobrien	char *cp;
3791573Srgrimes
38084260Sobrien	cp = el->el_line.cursor;
38184260Sobrien	el->el_line.cursor = el->el_chared.c_kill.mark;
38284260Sobrien	el->el_chared.c_kill.mark = cp;
38384260Sobrien	return (CC_CURSOR);
3841573Srgrimes}
3851573Srgrimes
38684260Sobrien
3871573Srgrimes/* em_universal_argument():
3881573Srgrimes *	Universal argument (argument times 4)
3891573Srgrimes *	[^U]
3901573Srgrimes */
3911573Srgrimesprotected el_action_t
3921573Srgrimes/*ARGSUSED*/
393148834Sstefanfem_universal_argument(EditLine *el, int c __unused)
3941573Srgrimes{				/* multiply current argument by 4 */
39584260Sobrien
39684260Sobrien	if (el->el_state.argument > 1000000)
39784260Sobrien		return (CC_ERROR);
39884260Sobrien	el->el_state.doingarg = 1;
39984260Sobrien	el->el_state.argument *= 4;
40084260Sobrien	return (CC_ARGHACK);
4011573Srgrimes}
4021573Srgrimes
40384260Sobrien
4041573Srgrimes/* em_meta_next():
4051573Srgrimes *	Add 8th bit to next character typed
4061573Srgrimes *	[<ESC>]
4071573Srgrimes */
4081573Srgrimesprotected el_action_t
4091573Srgrimes/*ARGSUSED*/
410148834Sstefanfem_meta_next(EditLine *el, int c __unused)
4111573Srgrimes{
41284260Sobrien
41384260Sobrien	el->el_state.metanext = 1;
41484260Sobrien	return (CC_ARGHACK);
4151573Srgrimes}
4161573Srgrimes
4171573Srgrimes
4181573Srgrimes/* em_toggle_overwrite():
4191573Srgrimes *	Switch from insert to overwrite mode or vice versa
4201573Srgrimes */
4211573Srgrimesprotected el_action_t
4221573Srgrimes/*ARGSUSED*/
423148834Sstefanfem_toggle_overwrite(EditLine *el, int c __unused)
4241573Srgrimes{
42584260Sobrien
42684260Sobrien	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
42784260Sobrien	    MODE_REPLACE : MODE_INSERT;
42884260Sobrien	return (CC_NORM);
4291573Srgrimes}
4301573Srgrimes
4311573Srgrimes
4321573Srgrimes/* em_copy_prev_word():
4331573Srgrimes *	Copy current word to cursor
4341573Srgrimes */
4351573Srgrimesprotected el_action_t
4361573Srgrimes/*ARGSUSED*/
437148834Sstefanfem_copy_prev_word(EditLine *el, int c __unused)
4381573Srgrimes{
43984260Sobrien	char *cp, *oldc, *dp;
4401573Srgrimes
44184260Sobrien	if (el->el_line.cursor == el->el_line.buffer)
44284260Sobrien		return (CC_ERROR);
4431573Srgrimes
44484260Sobrien	oldc = el->el_line.cursor;
44584260Sobrien	/* does a bounds check */
44684260Sobrien	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
44784260Sobrien	    el->el_state.argument, ce__isword);
4481573Srgrimes
44984260Sobrien	c_insert(el, oldc - cp);
45084260Sobrien	for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
45184260Sobrien		*dp++ = *cp;
4521573Srgrimes
45384260Sobrien	el->el_line.cursor = dp;/* put cursor at end */
4541573Srgrimes
45584260Sobrien	return (CC_REFRESH);
4561573Srgrimes}
4571573Srgrimes
4581573Srgrimes
4591573Srgrimes/* em_inc_search_next():
4601573Srgrimes *	Emacs incremental next search
4611573Srgrimes */
4621573Srgrimesprotected el_action_t
4631573Srgrimes/*ARGSUSED*/
464148834Sstefanfem_inc_search_next(EditLine *el, int c __unused)
4651573Srgrimes{
46684260Sobrien
46784260Sobrien	el->el_search.patlen = 0;
46884260Sobrien	return (ce_inc_search(el, ED_SEARCH_NEXT_HISTORY));
4691573Srgrimes}
4701573Srgrimes
4711573Srgrimes
4721573Srgrimes/* em_inc_search_prev():
4731573Srgrimes *	Emacs incremental reverse search
4741573Srgrimes */
4751573Srgrimesprotected el_action_t
4761573Srgrimes/*ARGSUSED*/
477148834Sstefanfem_inc_search_prev(EditLine *el, int c __unused)
4781573Srgrimes{
47984260Sobrien
48084260Sobrien	el->el_search.patlen = 0;
48184260Sobrien	return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY));
4821573Srgrimes}
483148834Sstefanf
484148834Sstefanf
485148834Sstefanf/* em_delete_prev_char():
486148834Sstefanf *	Delete the character to the left of the cursor
487148834Sstefanf *	[^?]
488148834Sstefanf */
489148834Sstefanfprotected el_action_t
490148834Sstefanf/*ARGSUSED*/
491148834Sstefanfem_delete_prev_char(EditLine *el, int c __unused)
492148834Sstefanf{
493148834Sstefanf
494148834Sstefanf	if (el->el_line.cursor <= el->el_line.buffer)
495148834Sstefanf		return (CC_ERROR);
496148834Sstefanf
497148834Sstefanf	if (el->el_state.doingarg)
498148834Sstefanf		c_delbefore(el, el->el_state.argument);
499148834Sstefanf	else
500148834Sstefanf		c_delbefore1(el);
501148834Sstefanf	el->el_line.cursor -= el->el_state.argument;
502148834Sstefanf	if (el->el_line.cursor < el->el_line.buffer)
503148834Sstefanf		el->el_line.cursor = el->el_line.buffer;
504148834Sstefanf	return (CC_REFRESH);
505148834Sstefanf}
506