112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*	$NetBSD: vi.c,v 1.43 2012/01/16 14:57:45 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#include <stdlib.h>
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <unistd.h>
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <limits.h>
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/wait.h>
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID)
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char sccsid[] = "@(#)vi.c	8.1 (Berkeley) 6/4/93";
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: vi.c,v 1.43 2012/01/16 14:57:45 christos Exp $");
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * vi.c: Vi mode commands.
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "el.h"
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate el_action_t	cv_action(EditLine *, Int);
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate el_action_t	cv_paste(EditLine *, Int);
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* cv_action():
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Handle vi actions.
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate el_action_t
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacv_action(EditLine *el, Int c)
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* 'cc', 'dd' and (possibly) friends */
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (c != (Int)el->el_chared.c_vcmd.action)
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (!(c & YANK))
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			cv_undo(el);
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_yank(el, el->el_line.buffer,
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    (int)(el->el_line.lastchar - el->el_line.buffer));
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_vcmd.action = NOP;
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_chared.c_vcmd.pos = 0;
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (!(c & YANK)) {
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.lastchar = el->el_line.buffer;
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.cursor = el->el_line.buffer;
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (c & INSERT)
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_map.current = el->el_map.key;
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.pos = el->el_line.cursor;
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.action = c;
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ARGHACK;
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* cv_paste():
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Paste previous deletion before or after the cursor
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate el_action_t
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacv_paste(EditLine *el, Int c)
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_kill_t *k = &el->el_chared.c_kill;
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len = (size_t)(k->last - k->buf);
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (k->buf == NULL || len == 0)
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG_PASTE
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", (int)len, k->buf);
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!c && el->el_line.cursor < el->el_line.lastchar)
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor++;
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_insert(el, (int)len);
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor + len > el->el_line.lastchar)
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) memcpy(el->el_line.cursor, k->buf, len *
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    sizeof(*el->el_line.cursor));
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_paste_next():
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi paste previous deletion to the right of the cursor
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[p]
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_paste_next(EditLine *el, Int c __attribute__((__unused__)))
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_paste(el, 0);
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_paste_prev():
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi paste previous deletion to the left of the cursor
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[P]
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_paste_prev(EditLine *el, Int c __attribute__((__unused__)))
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_paste(el, 1);
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_prev_big_word():
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the previous space delimited word
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[B]
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_prev_big_word(EditLine *el, Int c __attribute__((__unused__)))
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.buffer)
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv_prev_word(el->el_line.cursor,
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.buffer,
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument,
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    cv__isWord);
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_prev_word():
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the previous word
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[b]
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_prev_word(EditLine *el, Int c __attribute__((__unused__)))
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.buffer)
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv_prev_word(el->el_line.cursor,
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.buffer,
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_state.argument,
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    cv__isword);
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_next_big_word():
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the next space delimited word
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[W]
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_next_big_word(EditLine *el, Int c __attribute__((__unused__)))
20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor >= el->el_line.lastchar - 1)
20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.lastchar, el->el_state.argument, cv__isWord);
20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_map.type == MAP_VI)
21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_chared.c_vcmd.action != NOP) {
21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			cv_delfini(el);
21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_REFRESH;
21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_next_word():
22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the next word
22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[w]
22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_next_word(EditLine *el, Int c __attribute__((__unused__)))
22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor >= el->el_line.lastchar - 1)
22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.lastchar, el->el_state.argument, cv__isword);
23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_map.type == MAP_VI)
23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_chared.c_vcmd.action != NOP) {
23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			cv_delfini(el);
23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_REFRESH;
23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_change_case():
24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi change case of character under the cursor and advance one character
24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[~]
24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_change_case(EditLine *el, Int c)
24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int i;
25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor >= el->el_line.lastchar)
25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0; i < el->el_state.argument; i++) {
25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		c = *el->el_line.cursor;
25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Isupper(c))
25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*el->el_line.cursor = Tolower(c);
26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (Islower(c))
26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*el->el_line.cursor = Toupper(c);
26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (++el->el_line.cursor >= el->el_line.lastchar) {
26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.cursor--;
26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			re_fastaddc(el);
26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		re_fastaddc(el);
26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_change_meta():
27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi change prefix command
27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[c]
27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_change_meta(EditLine *el, Int c __attribute__((__unused__)))
28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         * Delete with insert == change: first we delete and then we leave in
28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         * insert mode.
28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         */
28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_action(el, DELETE | INSERT);
28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_insert_at_bol():
29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter insert mode at the beginning of line
29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[I]
29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_insert_at_bol(EditLine *el, Int c __attribute__((__unused__)))
29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;
30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_replace_char():
30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi replace character under the cursor with the next character typed
30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[r]
31012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
31112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
31212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
31312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_replace_char(EditLine *el, Int c __attribute__((__unused__)))
31412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
31512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor >= el->el_line.lastchar)
31712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
31812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
32012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.inputmode = MODE_REPLACE_1;
32112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
32212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ARGHACK;
32312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
32412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_replace_mode():
32712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter replace mode
32812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[R]
32912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
33012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
33112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
33212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_replace_mode(EditLine *el, Int c __attribute__((__unused__)))
33312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
33412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
33512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
33612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.inputmode = MODE_REPLACE;
33712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
33812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
33912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
34012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_substitute_char():
34312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi replace character under the cursor and enter insert mode
34412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[s]
34512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
34612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
34712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
34812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_substitute_char(EditLine *el, Int c __attribute__((__unused__)))
34912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
35012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_delafter(el, el->el_state.argument);
35212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
35312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
35412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
35512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_substitute_line():
35812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi substitute entire line
35912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[S]
36012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
36112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
36212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
36312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_substitute_line(EditLine *el, Int c __attribute__((__unused__)))
36412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
36512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
36612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
36712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_yank(el, el->el_line.buffer,
36812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int)(el->el_line.lastchar - el->el_line.buffer));
36912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) em_kill_line(el, 0);
37012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
37112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
37212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
37312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_change_to_eol():
37612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi change to end of line
37712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[C]
37812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
37912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
38012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
38112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_change_to_eol(EditLine *el, Int c __attribute__((__unused__)))
38212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
38312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
38512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_yank(el, el->el_line.cursor,
38612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int)(el->el_line.lastchar - el->el_line.cursor));
38712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) ed_kill_line(el, 0);
38812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
38912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
39012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
39112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_insert():
39412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter insert mode
39512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[i]
39612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
39712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
39812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
39912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_insert(EditLine *el, Int c __attribute__((__unused__)))
40012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
40112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
40312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
40412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
40512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
40612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_add():
40912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter insert mode after the cursor
41012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[a]
41112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
41212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
41312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
41412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_add(EditLine *el, Int c __attribute__((__unused__)))
41512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
41612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int ret;
41712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
41912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor < el->el_line.lastchar) {
42012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor++;
42112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_line.cursor > el->el_line.lastchar)
42212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.cursor = el->el_line.lastchar;
42312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = CC_CURSOR;
42412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else
42512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = CC_NORM;
42612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
42812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (el_action_t)ret;
43012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
43112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_add_at_eol():
43412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter insert mode at end of line
43512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[A]
43612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
43712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
43812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
43912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_add_at_eol(EditLine *el, Int c __attribute__((__unused__)))
44012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
44112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
44312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.lastchar;
44412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
44512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
44612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
44712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_delete_meta():
45012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi delete prefix command
45112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[d]
45212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
45312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
45412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
45512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_delete_meta(EditLine *el, Int c __attribute__((__unused__)))
45612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
45712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_action(el, DELETE);
45912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
46012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_end_big_word():
46312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the end of the current space delimited word
46412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[E]
46512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
46612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
46712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
46812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_end_big_word(EditLine *el, Int c __attribute__((__unused__)))
46912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
47012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar)
47212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
47312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv__endword(el->el_line.cursor,
47512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.lastchar, el->el_state.argument, cv__isWord);
47612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
47812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor++;
47912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
48012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
48112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
48212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
48312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
48412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_end_word():
48712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the end of the current word
48812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[e]
48912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
49012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
49112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
49212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_end_word(EditLine *el, Int c __attribute__((__unused__)))
49312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
49412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar)
49612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
49712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cv__endword(el->el_line.cursor,
49912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    el->el_line.lastchar, el->el_state.argument, cv__isword);
50012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
50212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor++;
50312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
50412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
50512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
50612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
50712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
50812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_undo():
51112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi undo last change
51212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[u]
51312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
51412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
51512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
51612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_undo(EditLine *el, Int c __attribute__((__unused__)))
51712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
51812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_undo_t un = el->el_chared.c_undo;
51912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
52012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (un.len == -1)
52112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
52212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
52312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* switch line buffer and undo buffer */
52412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_undo.buf = el->el_line.buffer;
52512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer;
52612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_undo.cursor =
52712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int)(el->el_line.cursor - el->el_line.buffer);
52812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer);
52912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.buffer = un.buf;
53012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = un.buf + un.cursor;
53112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.lastchar = un.buf + un.len;
53212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
53412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
53512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_command_mode():
53812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi enter command mode (use alternative key bindings)
53912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[<ESC>]
54012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
54112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
54212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
54312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_command_mode(EditLine *el, Int c __attribute__((__unused__)))
54412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
54512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
54612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* [Esc] cancels pending action */
54712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.action = NOP;
54812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.pos = 0;
54912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
55012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.doingarg = 0;
55112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
55212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.inputmode = MODE_INSERT;
55312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.alt;
55412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef VI_MOVE
55512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor > el->el_line.buffer)
55612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor--;
55712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
55812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
55912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
56012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_zero():
56312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the beginning of line
56412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[0]
56512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
56612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
56712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_zero(EditLine *el, Int c)
56812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
56912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
57012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_state.doingarg)
57112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return ed_argument_digit(el, c);
57212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
57312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;
57412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
57512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
57612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
57712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
57812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
57912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
58012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
58112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
58212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_delete_prev_char():
58312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 	Vi move to previous character (backspace)
58412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^H] in insert mode only
58512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
58612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
58712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
58812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
58912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
59012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor <= el->el_line.buffer)
59212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
59312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_delbefore1(el);
59512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor--;
59612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
59712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
59812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
60012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_list_or_eof():
60112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi list choices for completion or indicate end of file if empty line
60212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^D]
60312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
60412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
60512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
60612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_list_or_eof(EditLine *el, Int c)
60712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
60812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
60912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor == el->el_line.lastchar) {
61012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_line.cursor == el->el_line.buffer) {
61112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			terminal_writec(el, c);	/* then do a EOF */
61212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_EOF;
61312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else {
61412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			/*
61512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 * Here we could list completions, but it is an
61612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 * error right now
61712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 */
61812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			terminal_beep(el);
61912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
62012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
62112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
62212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef notyet
62312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		re_goto_bottom(el);
62412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*el->el_line.lastchar = '\0';	/* just in case */
62512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_LIST_CHOICES;
62612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
62712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/*
62812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 * Just complain for now.
62912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 */
63012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		terminal_beep(el);
63112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
63212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
63312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
63412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
63512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
63612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
63712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_kill_line_prev():
63812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi cut from beginning of line to cursor
63912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[^U]
64012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
64112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
64212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
64312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_kill_line_prev(EditLine *el, Int c __attribute__((__unused__)))
64412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
64512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *kp, *cp;
64612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
64712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el->el_line.buffer;
64812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	kp = el->el_chared.c_kill.buf;
64912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (cp < el->el_line.cursor)
65012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*kp++ = *cp++;	/* copy it */
65112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_kill.last = kp;
65212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer));
65312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;	/* zap! */
65412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
65512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
65612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_search_prev():
65912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi search history previous
66012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[?]
66112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
66212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
66312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
66412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_search_prev(EditLine *el, Int c __attribute__((__unused__)))
66512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
66612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
66712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_search(el, ED_SEARCH_PREV_HISTORY);
66812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
66912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
67012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
67112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_search_next():
67212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi search history next
67312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[/]
67412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
67512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
67612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
67712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_search_next(EditLine *el, Int c __attribute__((__unused__)))
67812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
67912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_search(el, ED_SEARCH_NEXT_HISTORY);
68112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
68212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_repeat_search_next():
68512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi repeat current search in the same search direction
68612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[n]
68712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
68812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
68912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
69012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_repeat_search_next(EditLine *el, Int c __attribute__((__unused__)))
69112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
69212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_search.patlen == 0)
69412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
69512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
69612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return cv_repeat_srch(el, el->el_search.patdir);
69712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
69812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
70012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_repeat_search_prev():
70112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi repeat current search in the opposite search direction
70212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[N]
70312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
70412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
70512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
70612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_repeat_search_prev(EditLine *el, Int c __attribute__((__unused__)))
70712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
70812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
70912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_search.patlen == 0)
71012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
71112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
71212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return (cv_repeat_srch(el,
71312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    el->el_search.patdir == ED_SEARCH_PREV_HISTORY ?
71412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY));
71512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
71612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
71712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
71812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_next_char():
71912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the character specified next
72012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[f]
72112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
72212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
72312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
72412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_next_char(EditLine *el, Int c __attribute__((__unused__)))
72512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
72612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
72712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
72812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
72912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
73012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_prev_char():
73112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move to the character specified previous
73212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[F]
73312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
73412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
73512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
73612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_prev_char(EditLine *el, Int c __attribute__((__unused__)))
73712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
73812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
73912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
74012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_to_next_char():
74312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move up to the character specified next
74412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[t]
74512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
74612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
74712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
74812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_to_next_char(EditLine *el, Int c __attribute__((__unused__)))
74912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
75012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
75112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
75212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
75312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
75412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_to_prev_char():
75512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi move up to the character specified previous
75612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[T]
75712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
75812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
75912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
76012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_to_prev_char(EditLine *el, Int c __attribute__((__unused__)))
76112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
76212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
76312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
76412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
76512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
76612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_repeat_next_char():
76712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi repeat current character search in the same search direction
76812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[;]
76912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
77012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
77112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
77212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_repeat_next_char(EditLine *el, Int c __attribute__((__unused__)))
77312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
77412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
77512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
77612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_state.argument, el->el_search.chatflg);
77712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
77812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
77912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
78012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_repeat_prev_char():
78112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi repeat current character search in the opposite search direction
78212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[,]
78312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
78412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
78512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
78612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_repeat_prev_char(EditLine *el, Int c __attribute__((__unused__)))
78712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
78812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_action_t r;
78912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int dir = el->el_search.chadir;
79012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
79112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	r = cv_csearch(el, -dir, el->el_search.chacha,
79212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_state.argument, el->el_search.chatflg);
79312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_search.chadir = dir;
79412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return r;
79512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
79612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
79712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
79812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_match():
79912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi go to matching () {} or []
80012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[%]
80112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
80212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
80312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
80412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_match(EditLine *el, Int c __attribute__((__unused__)))
80512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
80612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const Char match_chars[] = STR("()[]{}");
80712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp;
80812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t delta, i, count;
80912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char o_ch, c_ch;
81012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
81112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*el->el_line.lastchar = '\0';		/* just in case */
81212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
81312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	i = Strcspn(el->el_line.cursor, match_chars);
81412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	o_ch = el->el_line.cursor[i];
81512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (o_ch == 0)
81612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
81712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	delta = (size_t)(Strchr(match_chars, o_ch) - match_chars);
81812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_ch = match_chars[delta ^ 1];
81912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	count = 1;
82012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	delta = 1 - (delta & 1) * 2;
82112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
82212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (cp = &el->el_line.cursor[i]; count; ) {
82312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp += delta;
82412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (cp < el->el_line.buffer || cp >= el->el_line.lastchar)
82512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
82612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*cp == o_ch)
82712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			count++;
82812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cp == c_ch)
82912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			count--;
83012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
83112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
83212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cp;
83312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
83412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_chared.c_vcmd.action != NOP) {
83512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* NB posix says char under cursor should NOT be deleted
83612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   for -ve delta - this is different to netbsd vi. */
83712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (delta > 0)
83812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_line.cursor++;
83912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cv_delfini(el);
84012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
84112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
84212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_CURSOR;
84312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
84412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
84512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_undo_line():
84612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi undo all changes to line
84712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[U]
84812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
84912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
85012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
85112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_undo_line(EditLine *el, Int c __attribute__((__unused__)))
85212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
85312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
85512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return hist_get(el);
85612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
85712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_to_column():
85912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi go to specified column
86012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[|]
86112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * NB netbsd vi goes to screen column 'n', posix says nth character
86212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
86312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
86412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
86512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_to_column(EditLine *el, Int c __attribute__((__unused__)))
86612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
86712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
86812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;
86912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.argument--;
87012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ed_next_char(el, 0);
87112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
87212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
87312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_yank_end():
87412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi yank to end of line
87512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[Y]
87612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
87712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
87812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
87912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_yank_end(EditLine *el, Int c __attribute__((__unused__)))
88012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
88112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_yank(el, el->el_line.cursor,
88312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int)(el->el_line.lastchar - el->el_line.cursor));
88412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
88512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
88612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_yank():
88812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi yank
88912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[y]
89012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
89112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
89212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
89312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_yank(EditLine *el, Int c __attribute__((__unused__)))
89412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
89512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return cv_action(el, YANK);
89712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
89812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_comment_out():
90012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi comment out current command
90112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[#]
90212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
90312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
90412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
90512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_comment_out(EditLine *el, Int c __attribute__((__unused__)))
90612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
90712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
90812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = el->el_line.buffer;
90912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_insert(el, 1);
91012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*el->el_line.cursor = '#';
91112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	re_refresh(el);
91212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ed_newline(el, 0);
91312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
91412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
91512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_alias():
91612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi include shell alias
91712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[@]
91812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * NB: posix implies that we should enter insert mode, however
91912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * this is against historical precedent...
92012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
92112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef __weak_reference
92212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__weakref_visible char *my_get_alias_text(const char *)
92312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    __weak_reference(get_alias_text);
92412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
92512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
92612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
92712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_alias(EditLine *el __attribute__((__unused__)), Int c __attribute__((__unused__)))
92812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
92912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef __weak_reference
93012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char alias_name[3];
93112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *alias_text;
93212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
93312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (my_get_alias_text == 0) {
93412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
93512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
93612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
93712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	alias_name[0] = '_';
93812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	alias_name[2] = 0;
93912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el_getc(el, &alias_name[1]) != 1)
94012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
94112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
94212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	alias_text = my_get_alias_text(alias_name);
94312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (alias_text != NULL)
94412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		FUN(el,push)(el, ct_decode_string(alias_text, &el->el_scratch));
94512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
94612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
94712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ERROR;
94812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
94912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
95012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
95112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_to_history_line():
95212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi go to specified history file line.
95312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[G]
95412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
95512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
95612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
95712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_to_history_line(EditLine *el, Int c __attribute__((__unused__)))
95812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
95912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int sv_event_no = el->el_history.eventno;
96012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_action_t rval;
96112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_history.eventno == 0) {
96412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 (void) Strncpy(el->el_history.buf, el->el_line.buffer,
96512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		     EL_BUFSIZ);
96612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 el->el_history.last = el->el_history.buf +
96712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			 (el->el_line.lastchar - el->el_line.buffer);
96812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
96912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
97012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* Lack of a 'count' means oldest, not 1 */
97112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!el->el_state.doingarg) {
97212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_history.eventno = 0x7fffffff;
97312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hist_get(el);
97412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
97512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* This is brain dead, all the rest of this code counts
97612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 * upwards going into the past.  Here we need count in the
97712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 * other direction (to match the output of fc -l).
97812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 * I could change the world, but this seems to suffice.
97912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		 */
98012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_history.eventno = 1;
98112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (hist_get(el) == CC_ERROR)
98212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
98312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_history.eventno = 1 + el->el_history.ev.num
98412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					- el->el_state.argument;
98512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (el->el_history.eventno < 0) {
98612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el->el_history.eventno = sv_event_no;
98712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
98812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
98912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
99012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rval = hist_get(el);
99112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rval == CC_ERROR)
99212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_history.eventno = sv_event_no;
99312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return rval;
99412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
99512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
99612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_histedit():
99712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi edit history line with vi
99812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[v]
99912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
100012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
100112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
100212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_histedit(EditLine *el, Int c __attribute__((__unused__)))
100312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
100412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int fd;
100512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	pid_t pid;
100612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ssize_t st;
100712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int status;
100812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
100912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *cp = NULL;
101012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len;
101112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *line = NULL;
101212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_state.doingarg) {
101412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (vi_to_history_line(el, 0) == CC_ERROR)
101512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return CC_ERROR;
101612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
101712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fd = mkstemp(tempfile);
101912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (fd < 0)
102012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
102112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = (size_t)(el->el_line.lastchar - el->el_line.buffer);
102212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)
102312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el_malloc(TMP_BUFSIZ * sizeof(*cp));
102412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cp == NULL)
102512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto error;
102612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	line = el_malloc(len * sizeof(*line) + 1);
102712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (line == NULL)
102812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto error;
102912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Strncpy(line, el->el_line.buffer, len);
103012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	line[len] = '\0';
103112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ct_wcstombs(cp, line, TMP_BUFSIZ - 1);
103212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp[TMP_BUFSIZ - 1] = '\0';
103312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = strlen(cp);
103412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	write(fd, cp, len);
103512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	write(fd, "\n", (size_t)1);
103612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	pid = fork();
103712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	switch (pid) {
103812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case -1:
103912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto error;
104012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case 0:
104112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		close(fd);
104212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		execlp("vi", "vi", tempfile, (char *)NULL);
104312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		exit(0);
104412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/*NOTREACHED*/
104512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	default:
104612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (waitpid(pid, &status, 0) != pid)
104712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
104812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		lseek(fd, (off_t)0, SEEK_SET);
104912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		st = read(fd, cp, TMP_BUFSIZ);
105012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (st > 0) {
105112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len = (size_t)(el->el_line.lastchar -
105212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    el->el_line.buffer);
105312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len = ct_mbstowcs(el->el_line.buffer, cp, len);
105412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (len > 0 && el->el_line.buffer[len -1] == '\n')
105512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				--len;
105612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
105712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
105812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len = 0;
105912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala                el->el_line.cursor = el->el_line.buffer;
106012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala                el->el_line.lastchar = el->el_line.buffer + len;
106112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(cp);
106212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala                el_free(line);
106312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
106412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
106512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	close(fd);
106712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	unlink(tempfile);
106812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* return CC_REFRESH; */
106912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ed_newline(el, 0);
107012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaerror:
107112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(line);
107212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(cp);
107312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	close(fd);
107412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	unlink(tempfile);
107512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_ERROR;
107612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
107712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
107812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_history_word():
107912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi append word from previous input line
108012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[_]
108112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Who knows where this one came from!
108212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * '_' in vi means 'entire current line', so 'cc' is a synonym for 'c_'
108312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
108412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
108512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
108612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_history_word(EditLine *el, Int c __attribute__((__unused__)))
108712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
108812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const Char *wp = HIST_FIRST(el);
108912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const Char *wep, *wsp;
109012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int len;
109112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *cp;
109212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const Char *lim;
109312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
109412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (wp == NULL)
109512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
109612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
109712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	wep = wsp = 0;
109812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	do {
109912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (Isspace(*wp))
110012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			wp++;
110112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*wp == 0)
110212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
110312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		wsp = wp;
110412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (*wp && !Isspace(*wp))
110512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			wp++;
110612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		wep = wp;
110712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} while ((!el->el_state.doingarg || --el->el_state.argument > 0)
110812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    && *wp != 0);
110912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
111012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (wsp == 0 || (el->el_state.doingarg && el->el_state.argument != 0))
111112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_ERROR;
111212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
111312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cv_undo(el);
111412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = (int)(wep - wsp);
111512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el->el_line.cursor < el->el_line.lastchar)
111612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_line.cursor++;
111712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_insert(el, len + 1);
111812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = el->el_line.cursor;
111912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	lim = el->el_line.limit;
112012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cp < lim)
112112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*cp++ = ' ';
112212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (wsp < wep && cp < lim)
112312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*cp++ = *wsp++;
112412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_line.cursor = cp;
112512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
112612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_map.current = el->el_map.key;
112712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_REFRESH;
112812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
112912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
113012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* vi_redo():
113112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Vi redo last non-motion command
113212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	[.]
113312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
113412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected el_action_t
113512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
113612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavi_redo(EditLine *el, Int c __attribute__((__unused__)))
113712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
113812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c_redo_t *r = &el->el_chared.c_redo;
113912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
114012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!el->el_state.doingarg && r->count) {
114112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_state.doingarg = 1;
114212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el->el_state.argument = r->count;
114312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
114412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
114512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.pos = el->el_line.cursor;
114612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_chared.c_vcmd.action = r->action;
114712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (r->pos != r->buf) {
114812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (r->pos + 1 > r->lim)
114912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			/* sanity */
115012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			r->pos = r->lim - 1;
115112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		r->pos[0] = 0;
115212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		FUN(el,push)(el, r->buf);
115312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
115412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
115512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.thiscmd = r->cmd;
115612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_state.thisch = r->ch;
115712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (*el->el_map.func[r->cmd])(el, r->ch);
115812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
1159