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