112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*	$NetBSD: emacs.c,v 1.25 2011/07/29 15:16:33 christos Exp $	*/
212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*-
412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Copyright (c) 1992, 1993
512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	The Regents of the University of California.  All rights reserved.
612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This code is derived from software contributed to Berkeley by
812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Christos Zoulas of Cornell University.
912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Redistribution and use in source and binary forms, with or without
1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * modification, are permitted provided that the following conditions
1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * are met:
1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1. Redistributions of source code must retain the above copyright
1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer.
1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2. Redistributions in binary form must reproduce the above copyright
1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer in the
1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    documentation and/or other materials provided with the distribution.
1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 3. Neither the name of the University nor the names of its contributors
1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    may be used to endorse or promote products derived from this software
2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    without specific prior written permission.
2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * SUCH DAMAGE.
3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "config.h"
3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID)
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char sccsid[] = "@(#)emacs.c	8.1 (Berkeley) 6/4/93";
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: emacs.c,v 1.25 2011/07/29 15:16:33 christos Exp $");
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * emacs.c: Emacs functions
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "el.h"
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_delete_or_list():
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Delete character under cursor or list completions if at end of line
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^D]
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_delete_or_list(EditLine *el, Int c)
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar) {
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					/* if I'm at the end */
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_line.cursor == el->el_line.buffer) {
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					/* and the beginning */
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			terminal_writec(el, c);	/* then do an EOF */
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_EOF;
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else {
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			/*
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 * Here we could list completions, but it is an
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 * error right now
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 */
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			terminal_beep(el);
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_state.doingarg)
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			c_delafter(el, el->el_state.argument);
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			c_delafter1(el);
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_line.cursor > el->el_line.lastchar)
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.cursor = el->el_line.lastchar;
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				/* bounds check */
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_delete_next_word():
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Cut from cursor to end of current word
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-d]
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_delete_next_word(EditLine *el, Int c __attribute__((__unused__)))
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp, *p, *kp;
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar)
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = c__next_word(el->el_line.cursor, el->el_line.lastchar,
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument, ce__isword);
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++)
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				/* save the text */
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*kp++ = *p;
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.last = kp;
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_delafter(el, (int)(cp - el->el_line.cursor));	/* delete after dot */
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > el->el_line.lastchar)
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_line.lastchar;
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				/* bounds check */
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_yank():
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Paste cut buffer at cursor position
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^Y]
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_yank(EditLine *el, Int c __attribute__((__unused__)))
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *kp, *cp;
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_NORM;
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.lastchar +
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >=
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.limit)
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.mark = el->el_line.cursor;
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el->el_line.cursor;
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* open the space, */
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_insert(el,
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf));
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* copy the chars */
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*cp++ = *kp;
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* if an arg, cursor at beginning else cursor at end */
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_state.argument == 1)
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = cp;
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_kill_line():
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Cut the entire line and save in cut buffer
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^U]
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_kill_line(EditLine *el, Int c __attribute__((__unused__)))
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *kp, *cp;
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el->el_line.buffer;
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	kp = el->el_chared.c_kill.buf;
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (cp < el->el_line.lastchar)
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*kp++ = *cp++;	/* copy it */
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.last = kp;
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				/* zap! -- delete all of it */
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.lastchar = el->el_line.buffer;
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_kill_region():
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Cut area between mark and cursor and save in cut buffer
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^W]
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_kill_region(EditLine *el, Int c __attribute__((__unused__)))
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *kp, *cp;
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!el->el_chared.c_kill.mark)
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp = el->el_line.cursor;
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		kp = el->el_chared.c_kill.buf;
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (cp < el->el_chared.c_kill.mark)
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*kp++ = *cp++;	/* copy it */
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_kill.last = kp;
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c_delafter(el, (int)(cp - el->el_line.cursor));
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {		/* mark is before cursor */
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp = el->el_chared.c_kill.mark;
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		kp = el->el_chared.c_kill.buf;
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (cp < el->el_line.cursor)
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*kp++ = *cp++;	/* copy it */
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_kill.last = kp;
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark));
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_chared.c_kill.mark;
20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_copy_region():
20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Copy area between mark and cursor to cut buffer
20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-W]
20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_copy_region(EditLine *el, Int c __attribute__((__unused__)))
21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *kp, *cp;
21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!el->el_chared.c_kill.mark)
21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp = el->el_line.cursor;
22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		kp = el->el_chared.c_kill.buf;
22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (cp < el->el_chared.c_kill.mark)
22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*kp++ = *cp++;	/* copy it */
22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_kill.last = kp;
22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp = el->el_chared.c_kill.mark;
22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		kp = el->el_chared.c_kill.buf;
22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (cp < el->el_line.cursor)
22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*kp++ = *cp++;	/* copy it */
22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_kill.last = kp;
23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_gosmacs_transpose():
23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Exchange the two characters before the cursor
23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Gosling emacs transpose chars [^T]
23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_gosmacs_transpose(EditLine *el, Int c)
24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > &el->el_line.buffer[1]) {
24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* must have at least two chars entered */
24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c = el->el_line.cursor[-2];
24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor[-2] = el->el_line.cursor[-1];
24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor[-1] = c;
24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else
25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_next_word():
25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Move next to end of current word
25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-f]
25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_next_word(EditLine *el, Int c __attribute__((__unused__)))
26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar)
26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = c__next_word(el->el_line.cursor,
26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.lastchar,
26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument,
26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    ce__isword);
26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_map.type == MAP_VI)
27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_chared.c_vcmd.action != NOP) {
27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			cv_delfini(el);
27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_REFRESH;
27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_upper_case():
28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Uppercase the characters from cursor to end of current word
28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-u]
28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_upper_case(EditLine *el, Int c __attribute__((__unused__)))
28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp, *ep;
28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument, ce__isword);
29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (cp = el->el_line.cursor; cp < ep; cp++)
29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Islower(*cp))
29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*cp = Toupper(*cp);
29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = ep;
29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > el->el_line.lastchar)
29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_line.lastchar;
29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_capitol_case():
30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Capitalize the characters from cursor to end of current word
30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-c]
30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_capitol_case(EditLine *el, Int c __attribute__((__unused__)))
31012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
31112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp, *ep;
31212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
31412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument, ce__isword);
31512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (cp = el->el_line.cursor; cp < ep; cp++) {
31712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Isalpha(*cp)) {
31812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (Islower(*cp))
31912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				*cp = Toupper(*cp);
32012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			cp++;
32112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
32212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
32312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
32412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (; cp < ep; cp++)
32512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Isupper(*cp))
32612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*cp = Tolower(*cp);
32712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = ep;
32912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > el->el_line.lastchar)
33012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_line.lastchar;
33112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
33212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
33312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
33412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
33512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_lower_case():
33612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Lowercase the characters from cursor to end of current word
33712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[M-l]
33812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
33912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
34012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
34112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_lower_case(EditLine *el, Int c __attribute__((__unused__)))
34212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
34312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp, *ep;
34412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
34612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument, ce__isword);
34712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (cp = el->el_line.cursor; cp < ep; cp++)
34912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Isupper(*cp))
35012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*cp = Tolower(*cp);
35112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = ep;
35312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > el->el_line.lastchar)
35412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_line.lastchar;
35512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
35612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
35712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_set_mark():
36012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Set the mark at cursor
36112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^@]
36212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
36312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
36412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
36512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_set_mark(EditLine *el, Int c __attribute__((__unused__)))
36612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
36712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
36812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.mark = el->el_line.cursor;
36912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
37012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
37112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_exchange_mark():
37412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Exchange the cursor and mark
37512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^X^X]
37612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
37712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
37812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
37912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_exchange_mark(EditLine *el, Int c __attribute__((__unused__)))
38012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
38112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp;
38212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el->el_line.cursor;
38412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_chared.c_kill.mark;
38512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.mark = cp;
38612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
38712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
38812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_universal_argument():
39112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Universal argument (argument times 4)
39212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^U]
39312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
39412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
39512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
39612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_universal_argument(EditLine *el, Int c __attribute__((__unused__)))
39712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{				/* multiply current argument by 4 */
39812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_state.argument > 1000000)
40012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
40112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.doingarg = 1;
40212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.argument *= 4;
40312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ARGHACK;
40412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
40512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_meta_next():
40812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Add 8th bit to next character typed
40912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[<ESC>]
41012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
41112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
41212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
41312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_meta_next(EditLine *el, Int c __attribute__((__unused__)))
41412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
41512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.metanext = 1;
41712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ARGHACK;
41812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
41912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_toggle_overwrite():
42212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Switch from insert to overwrite mode or vice versa
42312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
42412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
42512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
42612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_toggle_overwrite(EditLine *el, Int c __attribute__((__unused__)))
42712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
42812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
43012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    MODE_REPLACE : MODE_INSERT;
43112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
43212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
43312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_copy_prev_word():
43612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Copy current word to cursor
43712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
43812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
43912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
44012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_copy_prev_word(EditLine *el, Int c __attribute__((__unused__)))
44112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
44212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp, *oldc, *dp;
44312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.buffer)
44512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
44612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	oldc = el->el_line.cursor;
44812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* does a bounds check */
44912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
45012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument, ce__isword);
45112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_insert(el, (int)(oldc - cp));
45312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
45412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*dp++ = *cp;
45512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = dp;/* put cursor at end */
45712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
45912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
46012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_inc_search_next():
46312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Emacs incremental next search
46412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
46512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
46612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
46712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_inc_search_next(EditLine *el, Int c __attribute__((__unused__)))
46812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
46912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_search.patlen = 0;
47112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY);
47212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
47312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_inc_search_prev():
47612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Emacs incremental reverse search
47712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
47812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
47912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
48012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_inc_search_prev(EditLine *el, Int c __attribute__((__unused__)))
48112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
48212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_search.patlen = 0;
48412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ce_inc_search(el, ED_SEARCH_PREV_HISTORY);
48512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
48612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* em_delete_prev_char():
48912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Delete the character to the left of the cursor
49012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^?]
49112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
49212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
49312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
49412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaem_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
49512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
49612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor <= el->el_line.buffer)
49812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
49912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_state.doingarg)
50112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c_delbefore(el, el->el_state.argument);
50212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
50312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c_delbefore1(el);
50412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor -= el->el_state.argument;
50512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor < el->el_line.buffer)
50612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor = el->el_line.buffer;
50712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
50812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
509