aboutsummaryrefslogtreecommitdiff
path: root/lib/libedit/vi.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libedit/vi.c')
-rw-r--r--lib/libedit/vi.c972
1 files changed, 461 insertions, 511 deletions
diff --git a/lib/libedit/vi.c b/lib/libedit/vi.c
index db213c9859a5..c58c5b10cc6e 100644
--- a/lib/libedit/vi.c
+++ b/lib/libedit/vi.c
@@ -32,6 +32,8 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $NetBSD: vi.c,v 1.7 1999/07/02 15:21:28 simonb Exp $
*/
#include <sys/cdefs.h>
@@ -39,6 +41,8 @@ __FBSDID("$FreeBSD$");
#if !defined(lint) && !defined(SCCSID)
static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
#endif /* not lint && not SCCSID */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
/*
* vi.c: Vi mode commands.
@@ -46,58 +50,56 @@ static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
#include "sys.h"
#include "el.h"
-private el_action_t cv_action __P((EditLine *, int));
+private el_action_t cv_action(EditLine *, int);
+private el_action_t cv_paste(EditLine *, int);
/* cv_action():
* Handle vi actions.
*/
private el_action_t
-cv_action(el, c)
- EditLine *el;
- int c;
+cv_action(EditLine *el, int c)
{
- register char *cp, *kp;
-
- if (el->el_chared.c_vcmd.action & DELETE) {
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = 0;
+ char *cp, *kp;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- kp = el->el_chared.c_undo.buf;
- for (cp = el->el_line.buffer; cp < el->el_line.lastchar; cp++) {
- *kp++ = *cp;
- el->el_chared.c_undo.dsize++;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ el->el_chared.c_vcmd.action = NOP;
+ el->el_chared.c_vcmd.pos = 0;
+
+ el->el_chared.c_undo.isize = 0;
+ el->el_chared.c_undo.dsize = 0;
+ kp = el->el_chared.c_undo.buf;
+ for (cp = el->el_line.buffer; cp < el->el_line.lastchar; cp++) {
+ *kp++ = *cp;
+ el->el_chared.c_undo.dsize++;
+ }
+
+ el->el_chared.c_undo.action = INSERT;
+ el->el_chared.c_undo.ptr = el->el_line.buffer;
+ el->el_line.lastchar = el->el_line.buffer;
+ el->el_line.cursor = el->el_line.buffer;
+ if (c & INSERT)
+ el->el_map.current = el->el_map.key;
+
+ return (CC_REFRESH);
}
-
- el->el_chared.c_undo.action = INSERT;
- el->el_chared.c_undo.ptr = el->el_line.buffer;
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- if (c & INSERT)
- el->el_map.current = el->el_map.key;
-
- return CC_REFRESH;
- }
-
- el->el_chared.c_vcmd.pos = el->el_line.cursor;
- el->el_chared.c_vcmd.action = c;
- return CC_ARGHACK;
-
-#ifdef notdef
- /*
- * I don't think that this is needed. But we keep it for now
- */
- else if (el_chared.c_vcmd.action == NOP) {
el->el_chared.c_vcmd.pos = el->el_line.cursor;
el->el_chared.c_vcmd.action = c;
- return CC_ARGHACK;
- }
- else {
- el->el_chared.c_vcmd.action = 0;
- el->el_chared.c_vcmd.pos = 0;
- return CC_ERROR;
- }
+ return (CC_ARGHACK);
+
+#ifdef notdef
+ /*
+ * I don't think that this is needed. But we keep it for now
+ */
+ else
+ if (el_chared.c_vcmd.action == NOP) {
+ el->el_chared.c_vcmd.pos = el->el_line.cursor;
+ el->el_chared.c_vcmd.action = c;
+ return (CC_ARGHACK);
+ } else {
+ el->el_chared.c_vcmd.action = 0;
+ el->el_chared.c_vcmd.pos = 0;
+ return (CC_ERROR);
+ }
#endif
}
@@ -105,29 +107,28 @@ cv_action(el, c)
/* cv_paste():
* Paste previous deletion before or after the cursor
*/
-protected el_action_t
-cv_paste(el, c)
- EditLine *el;
- int c;
+private el_action_t
+cv_paste(EditLine *el, int c)
{
- char *ptr;
- c_undo_t *un = &el->el_chared.c_undo;
+ char *ptr;
+ c_undo_t *un = &el->el_chared.c_undo;
+
#ifdef DEBUG_PASTE
- (void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n",
- un->action, un->buf, un->isize, un->dsize);
+ (void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n",
+ un->action, un->buf, un->isize, un->dsize);
#endif
- if (un->isize == 0)
- return CC_ERROR;
+ if (un->isize == 0)
+ return (CC_ERROR);
- if (!c && el->el_line.cursor < el->el_line.lastchar)
- el->el_line.cursor++;
- ptr = el->el_line.cursor;
+ if (!c && el->el_line.cursor < el->el_line.lastchar)
+ el->el_line.cursor++;
+ ptr = el->el_line.cursor;
- c_insert(el, un->isize);
- if (el->el_line.cursor + un->isize > el->el_line.lastchar)
- return CC_ERROR;
- (void) memcpy(ptr, un->buf, un->isize);
- return CC_REFRESH;
+ c_insert(el, (int) un->isize);
+ if (el->el_line.cursor + un->isize > el->el_line.lastchar)
+ return (CC_ERROR);
+ (void) memcpy(ptr, un->buf, un->isize);
+ return (CC_REFRESH);
}
@@ -137,11 +138,10 @@ cv_paste(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_paste_next(el, c)
- EditLine *el;
- int c;
+vi_paste_next(EditLine *el, int c)
{
- return cv_paste(el, 0);
+
+ return (cv_paste(el, 0));
}
@@ -151,11 +151,10 @@ vi_paste_next(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_paste_prev(el, c)
- EditLine *el;
- int c;
+vi_paste_prev(EditLine *el, int c)
{
- return cv_paste(el, 1);
+
+ return (cv_paste(el, 1));
}
@@ -165,24 +164,22 @@ vi_paste_prev(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_prev_space_word(el, c)
- EditLine *el;
- int c;
+vi_prev_space_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
- el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
- el->el_line.buffer,
- el->el_state.argument,
- c___isword);
+ if (el->el_line.cursor == el->el_line.buffer)
+ return (CC_ERROR);
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
+ el->el_line.buffer,
+ el->el_state.argument,
+ c___isword);
- return CC_CURSOR;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
@@ -192,24 +189,22 @@ vi_prev_space_word(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_prev_word(el, c)
- EditLine *el;
- int c;
+vi_prev_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
- el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
- el->el_line.buffer,
- el->el_state.argument,
- cv__isword);
+ if (el->el_line.cursor == el->el_line.buffer)
+ return (CC_ERROR);
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
+ el->el_line.buffer,
+ el->el_state.argument,
+ cv__isword);
- return CC_CURSOR;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
@@ -219,77 +214,72 @@ vi_prev_word(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_next_space_word(el, c)
- EditLine *el;
- int c;
+vi_next_space_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
- el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar,
- el->el_state.argument,
- c___isword);
+ if (el->el_line.cursor == el->el_line.lastchar)
+ return (CC_ERROR);
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
+ el->el_line.lastchar,
+ el->el_state.argument,
+ c___isword);
- return CC_CURSOR;
+ if (el->el_map.type == MAP_VI)
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
+
/* vi_next_word():
* Vi move to the next word
* [w]
*/
protected el_action_t
/*ARGSUSED*/
-vi_next_word(el, c)
- EditLine *el;
- int c;
+vi_next_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
- el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar,
- el->el_state.argument,
- cv__isword);
+ if (el->el_line.cursor == el->el_line.lastchar)
+ return (CC_ERROR);
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
+ el->el_line.lastchar,
+ el->el_state.argument,
+ cv__isword);
- return CC_CURSOR;
+ if (el->el_map.type == MAP_VI)
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
-
/* vi_change_case():
* Vi change case of character under the cursor and advance one character
* [~]
*/
protected el_action_t
-vi_change_case(el, c)
- EditLine *el;
- int c;
+vi_change_case(EditLine *el, int c)
{
- if (el->el_line.cursor < el->el_line.lastchar) {
- c = (unsigned char)*el->el_line.cursor;
- if (isupper(c))
- *el->el_line.cursor++ = tolower(c);
- else if (islower(c))
- *el->el_line.cursor++ = toupper(c);
- else
- el->el_line.cursor++;
- re_fastaddc(el);
- return CC_NORM;
- }
- return CC_ERROR;
+
+ if (el->el_line.cursor < el->el_line.lastchar) {
+ c = (unsigned char)*el->el_line.cursor;
+ if (isupper(c))
+ *el->el_line.cursor++ = tolower(c);
+ else if (islower(c))
+ *el->el_line.cursor++ = toupper(c);
+ else
+ el->el_line.cursor++;
+ re_fastaddc(el);
+ return (CC_NORM);
+ }
+ return (CC_ERROR);
}
@@ -299,15 +289,14 @@ vi_change_case(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_change_meta(el, c)
- EditLine *el;
- int c;
+vi_change_meta(EditLine *el, int c)
{
- /*
- * Delete with insert == change: first we delete and then we leave in
- * insert mode.
- */
- return cv_action(el, DELETE|INSERT);
+
+ /*
+ * Delete with insert == change: first we delete and then we leave in
+ * insert mode.
+ */
+ return (cv_action(el, DELETE | INSERT));
}
@@ -317,18 +306,17 @@ vi_change_meta(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_insert_at_bol(el, c)
- EditLine *el;
- int c;
+vi_insert_at_bol(EditLine *el, int c)
{
- el->el_line.cursor = el->el_line.buffer;
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
+ el->el_line.cursor = el->el_line.buffer;
+ el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_map.current = el->el_map.key;
- return CC_CURSOR;
+ el->el_chared.c_undo.ptr = el->el_line.cursor;
+ el->el_chared.c_undo.action = DELETE;
+
+ el->el_map.current = el->el_map.key;
+ return (CC_CURSOR);
}
@@ -338,17 +326,16 @@ vi_insert_at_bol(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_replace_char(el, c)
- EditLine *el;
- int c;
+vi_replace_char(EditLine *el, int c)
{
- el->el_map.current = el->el_map.key;
- el->el_state.inputmode = MODE_REPLACE_1;
- el->el_chared.c_undo.action = CHANGE;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- return CC_ARGHACK;
+
+ el->el_map.current = el->el_map.key;
+ el->el_state.inputmode = MODE_REPLACE_1;
+ el->el_chared.c_undo.action = CHANGE;
+ el->el_chared.c_undo.ptr = el->el_line.cursor;
+ el->el_chared.c_undo.isize = 0;
+ el->el_chared.c_undo.dsize = 0;
+ return (CC_ARGHACK);
}
@@ -358,17 +345,16 @@ vi_replace_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_replace_mode(el, c)
- EditLine *el;
- int c;
+vi_replace_mode(EditLine *el, int c)
{
- el->el_map.current = el->el_map.key;
- el->el_state.inputmode = MODE_REPLACE;
- el->el_chared.c_undo.action = CHANGE;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- return CC_ARGHACK;
+
+ el->el_map.current = el->el_map.key;
+ el->el_state.inputmode = MODE_REPLACE;
+ el->el_chared.c_undo.action = CHANGE;
+ el->el_chared.c_undo.ptr = el->el_line.cursor;
+ el->el_chared.c_undo.isize = 0;
+ el->el_chared.c_undo.dsize = 0;
+ return (CC_ARGHACK);
}
@@ -378,13 +364,12 @@ vi_replace_mode(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_substitute_char(el, c)
- EditLine *el;
- int c;
+vi_substitute_char(EditLine *el, int c)
{
- c_delafter(el, el->el_state.argument);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
+
+ c_delafter(el, el->el_state.argument);
+ el->el_map.current = el->el_map.key;
+ return (CC_REFRESH);
}
@@ -394,13 +379,12 @@ vi_substitute_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_substitute_line(el, c)
- EditLine *el;
- int c;
+vi_substitute_line(EditLine *el, int c)
{
- (void) em_kill_line(el, 0);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
+
+ (void) em_kill_line(el, 0);
+ el->el_map.current = el->el_map.key;
+ return (CC_REFRESH);
}
@@ -410,13 +394,12 @@ vi_substitute_line(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_change_to_eol(el, c)
- EditLine *el;
- int c;
+vi_change_to_eol(EditLine *el, int c)
{
- (void) ed_kill_line(el, 0);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
+
+ (void) ed_kill_line(el, 0);
+ el->el_map.current = el->el_map.key;
+ return (CC_REFRESH);
}
@@ -426,17 +409,16 @@ vi_change_to_eol(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_insert(el, c)
- EditLine *el;
- int c;
+vi_insert(EditLine *el, int c)
{
- el->el_map.current = el->el_map.key;
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
+ el->el_map.current = el->el_map.key;
+
+ el->el_chared.c_vcmd.ins = el->el_line.cursor;
+ el->el_chared.c_undo.ptr = el->el_line.cursor;
+ el->el_chared.c_undo.action = DELETE;
- return CC_NORM;
+ return (CC_NORM);
}
@@ -446,27 +428,24 @@ vi_insert(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_add(el, c)
- EditLine *el;
- int c;
+vi_add(EditLine *el, int c)
{
- el_action_t ret;
+ el_action_t ret;
- el->el_map.current = el->el_map.key;
- if (el->el_line.cursor < el->el_line.lastchar) {
- el->el_line.cursor++;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- ret = CC_CURSOR;
- }
- else
- ret = CC_NORM;
+ el->el_map.current = el->el_map.key;
+ if (el->el_line.cursor < el->el_line.lastchar) {
+ el->el_line.cursor++;
+ if (el->el_line.cursor > el->el_line.lastchar)
+ el->el_line.cursor = el->el_line.lastchar;
+ ret = CC_CURSOR;
+ } else
+ ret = CC_NORM;
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
+ el->el_chared.c_vcmd.ins = el->el_line.cursor;
+ el->el_chared.c_undo.ptr = el->el_line.cursor;
+ el->el_chared.c_undo.action = DELETE;
- return ret;
+ return (ret);
}
@@ -476,18 +455,17 @@ vi_add(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_add_at_eol(el, c)
- EditLine *el;
- int c;
+vi_add_at_eol(EditLine *el, int c)
{
- el->el_map.current = el->el_map.key;
- el->el_line.cursor = el->el_line.lastchar;
- /* Mark where insertion begins */
- el->el_chared.c_vcmd.ins = el->el_line.lastchar;
- el->el_chared.c_undo.ptr = el->el_line.lastchar;
- el->el_chared.c_undo.action = DELETE;
- return CC_CURSOR;
+ el->el_map.current = el->el_map.key;
+ el->el_line.cursor = el->el_line.lastchar;
+
+ /* Mark where insertion begins */
+ el->el_chared.c_vcmd.ins = el->el_line.lastchar;
+ el->el_chared.c_undo.ptr = el->el_line.lastchar;
+ el->el_chared.c_undo.action = DELETE;
+ return (CC_CURSOR);
}
@@ -497,11 +475,10 @@ vi_add_at_eol(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_delete_meta(el, c)
- EditLine *el;
- int c;
+vi_delete_meta(EditLine *el, int c)
{
- return cv_action(el, DELETE);
+
+ return (cv_action(el, DELETE));
}
@@ -511,23 +488,21 @@ vi_delete_meta(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_end_word(el, c)
- EditLine *el;
- int c;
+vi_end_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
- el->el_line.cursor = cv__endword(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument);
+ if (el->el_line.cursor == el->el_line.lastchar)
+ return (CC_ERROR);
- if (el->el_chared.c_vcmd.action & DELETE) {
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv__endword(el->el_line.cursor,
+ el->el_line.lastchar, el->el_state.argument);
- return CC_CURSOR;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ el->el_line.cursor++;
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
@@ -537,23 +512,21 @@ vi_end_word(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_to_end_word(el, c)
- EditLine *el;
- int c;
+vi_to_end_word(EditLine *el, int c)
{
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
- el->el_line.cursor = cv__endword(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument);
+ if (el->el_line.cursor == el->el_line.lastchar)
+ return (CC_ERROR);
- if (el->el_chared.c_vcmd.action & DELETE) {
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
+ el->el_line.cursor = cv__endword(el->el_line.cursor,
+ el->el_line.lastchar, el->el_state.argument);
- return CC_CURSOR;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ el->el_line.cursor++;
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
}
@@ -563,107 +536,104 @@ vi_to_end_word(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_undo(el, c)
- EditLine *el;
- int c;
+vi_undo(EditLine *el, int c)
{
- char *cp, *kp;
- char temp;
- int i, size;
- c_undo_t *un = &el->el_chared.c_undo;
+ char *cp, *kp;
+ char temp;
+ int i, size;
+ c_undo_t *un = &el->el_chared.c_undo;
#ifdef DEBUG_UNDO
- (void) fprintf(el->el_errfile, "Undo: %x \"%s\" +%d -%d\n",
- un->action, un->buf, un->isize, un->dsize);
+ (void) fprintf(el->el_errfile, "Undo: %x \"%s\" +%d -%d\n",
+ un->action, un->buf, un->isize, un->dsize);
#endif
- switch (un->action) {
- case DELETE:
- if (un->dsize == 0)
- return CC_NORM;
-
- (void) memcpy(un->buf, un->ptr, un->dsize);
- for (cp = un->ptr; cp <= el->el_line.lastchar; cp++)
- *cp = cp[un->dsize];
-
- el->el_line.lastchar -= un->dsize;
- el->el_line.cursor = un->ptr;
-
- un->action = INSERT;
- un->isize = un->dsize;
- un->dsize = 0;
- break;
-
- case DELETE|INSERT:
- size = un->isize - un->dsize;
- if (size > 0)
- i = un->dsize;
- else
- i = un->isize;
- cp = un->ptr;
- kp = un->buf;
- while (i-- > 0) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
- if (size > 0) {
- el->el_line.cursor = cp;
- c_insert(el, size);
- while (size-- > 0 && cp < el->el_line.lastchar) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
+ switch (un->action) {
+ case DELETE:
+ if (un->dsize == 0)
+ return (CC_NORM);
+
+ (void) memcpy(un->buf, un->ptr, un->dsize);
+ for (cp = un->ptr; cp <= el->el_line.lastchar; cp++)
+ *cp = cp[un->dsize];
+
+ el->el_line.lastchar -= un->dsize;
+ el->el_line.cursor = un->ptr;
+
+ un->action = INSERT;
+ un->isize = un->dsize;
+ un->dsize = 0;
+ break;
+
+ case DELETE | INSERT:
+ size = un->isize - un->dsize;
+ if (size > 0)
+ i = un->dsize;
+ else
+ i = un->isize;
+ cp = un->ptr;
+ kp = un->buf;
+ while (i-- > 0) {
+ temp = *kp;
+ *kp++ = *cp;
+ *cp++ = temp;
+ }
+ if (size > 0) {
+ el->el_line.cursor = cp;
+ c_insert(el, size);
+ while (size-- > 0 && cp < el->el_line.lastchar) {
+ temp = *kp;
+ *kp++ = *cp;
+ *cp++ = temp;
+ }
+ } else if (size < 0) {
+ size = -size;
+ for (; cp <= el->el_line.lastchar; cp++) {
+ *kp++ = *cp;
+ *cp = cp[size];
+ }
+ el->el_line.lastchar -= size;
+ }
+ el->el_line.cursor = un->ptr;
+ i = un->dsize;
+ un->dsize = un->isize;
+ un->isize = i;
+ break;
+
+ case INSERT:
+ if (un->isize == 0)
+ return (CC_NORM);
+
+ el->el_line.cursor = un->ptr;
+ c_insert(el, (int) un->isize);
+ (void) memcpy(un->ptr, un->buf, un->isize);
+ un->action = DELETE;
+ un->dsize = un->isize;
+ un->isize = 0;
+ break;
+
+ case CHANGE:
+ if (un->isize == 0)
+ return (CC_NORM);
+
+ el->el_line.cursor = un->ptr;
+ size = (int) (el->el_line.cursor - el->el_line.lastchar);
+ if (size < un->isize)
+ size = un->isize;
+ cp = un->ptr;
+ kp = un->buf;
+ for (i = 0; i < size; i++) {
+ temp = *kp;
+ *kp++ = *cp;
+ *cp++ = temp;
+ }
+ un->dsize = 0;
+ break;
+
+ default:
+ return (CC_ERROR);
}
- else if (size < 0) {
- size = -size;
- for (; cp <= el->el_line.lastchar; cp++) {
- *kp++ = *cp;
- *cp = cp[size];
- }
- el->el_line.lastchar -= size;
- }
- el->el_line.cursor = un->ptr;
- i = un->dsize;
- un->dsize = un->isize;
- un->isize = i;
- break;
-
- case INSERT:
- if (un->isize == 0)
- return CC_NORM;
-
- el->el_line.cursor = un->ptr;
- c_insert(el, un->isize);
- memcpy(un->ptr, un->buf, un->isize);
- un->action = DELETE;
- un->dsize = un->isize;
- un->isize = 0;
- break;
-
- case CHANGE:
- if (un->isize == 0)
- return CC_NORM;
-
- el->el_line.cursor = un->ptr;
- size = (int) (el->el_line.cursor - el->el_line.lastchar);
- if (size < un->isize)
- size = un->isize;
- cp = un->ptr;
- kp = un->buf;
- for(i = 0; i < size; i++) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
- un->dsize = 0;
- break;
-
- default:
- return CC_ERROR;
- }
- return CC_REFRESH;
+ return (CC_REFRESH);
}
@@ -673,12 +643,10 @@ vi_undo(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_undo_line(el, c)
- EditLine *el;
- int c;
+vi_undo_line(EditLine *el, int c)
{
- return hist_get(el);
+ return hist_get(el);
}
@@ -688,59 +656,57 @@ vi_undo_line(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_command_mode(el, c)
- EditLine *el;
- int c;
+vi_command_mode(EditLine *el, int c)
{
- int size;
- /* [Esc] cancels pending action */
- el->el_chared.c_vcmd.ins = 0;
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = 0;
+ int size;
- el->el_state.doingarg = 0;
- size = el->el_chared.c_undo.ptr - el->el_line.cursor;
- if (size < 0)
- size = -size;
- if (el->el_chared.c_undo.action == (INSERT|DELETE) ||
- el->el_chared.c_undo.action == DELETE)
- el->el_chared.c_undo.dsize = size;
- else
- el->el_chared.c_undo.isize = size;
+ /* [Esc] cancels pending action */
+ el->el_chared.c_vcmd.ins = 0;
+ el->el_chared.c_vcmd.action = NOP;
+ el->el_chared.c_vcmd.pos = 0;
+
+ el->el_state.doingarg = 0;
+ size = el->el_chared.c_undo.ptr - el->el_line.cursor;
+ if (size < 0)
+ size = -size;
+ if (el->el_chared.c_undo.action == (INSERT | DELETE) ||
+ el->el_chared.c_undo.action == DELETE)
+ el->el_chared.c_undo.dsize = size;
+ else
+ el->el_chared.c_undo.isize = size;
- el->el_state.inputmode = MODE_INSERT;
- el->el_map.current = el->el_map.alt;
+ el->el_state.inputmode = MODE_INSERT;
+ el->el_map.current = el->el_map.alt;
#ifdef VI_MOVE
- if (el->el_line.cursor > el->el_line.buffer)
- el->el_line.cursor--;
+ if (el->el_line.cursor > el->el_line.buffer)
+ el->el_line.cursor--;
#endif
- return CC_CURSOR;
+ return (CC_CURSOR);
}
+
/* vi_zero():
* Vi move to the beginning of line
* [0]
*/
protected el_action_t
-vi_zero(el, c)
- EditLine *el;
- int c;
+vi_zero(EditLine *el, int c)
{
- if (el->el_state.doingarg) {
- if (el->el_state.argument > 1000000)
- return CC_ERROR;
- el->el_state.argument =
- (el->el_state.argument * 10) + (c - '0');
- return CC_ARGHACK;
- }
- else {
- el->el_line.cursor = el->el_line.buffer;
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
- }
+
+ if (el->el_state.doingarg) {
+ if (el->el_state.argument > 1000000)
+ return (CC_ERROR);
+ el->el_state.argument =
+ (el->el_state.argument * 10) + (c - '0');
+ return (CC_ARGHACK);
+ } else {
+ el->el_line.cursor = el->el_line.buffer;
+ if (el->el_chared.c_vcmd.action & DELETE) {
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
+ }
}
@@ -750,22 +716,21 @@ vi_zero(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_delete_prev_char(el, c)
- EditLine *el;
- int c;
+vi_delete_prev_char(EditLine *el, int c)
{
- if (el->el_chared.c_vcmd.ins == 0)
- return CC_ERROR;
- if (el->el_chared.c_vcmd.ins >
- el->el_line.cursor - el->el_state.argument)
- return CC_ERROR;
+ if (el->el_chared.c_vcmd.ins == 0)
+ return (CC_ERROR);
- c_delbefore(el, el->el_state.argument);
- el->el_line.cursor -= el->el_state.argument;
+ if (el->el_chared.c_vcmd.ins >
+ el->el_line.cursor - el->el_state.argument)
+ return (CC_ERROR);
- return CC_REFRESH;
-} /* end v_del_char_prev */
+ c_delbefore(el, el->el_state.argument);
+ el->el_line.cursor -= el->el_state.argument;
+
+ return (CC_REFRESH);
+}
/* vi_list_or_eof():
@@ -774,24 +739,22 @@ vi_delete_prev_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_list_or_eof(el, c)
- EditLine *el;
- int c;
+vi_list_or_eof(EditLine *el, int c)
{
+
#ifdef notyet
- if (el->el_line.cursor == el->el_line.lastchar &&
- el->el_line.cursor == el->el_line.buffer) {
+ if (el->el_line.cursor == el->el_line.lastchar &&
+ el->el_line.cursor == el->el_line.buffer) {
#endif
- term_overwrite(el, STReof, 4); /* then do a EOF */
- term__flush();
- return CC_EOF;
+ term_overwrite(el, STReof, 4); /* then do a EOF */
+ term__flush();
+ return (CC_EOF);
#ifdef notyet
- }
- else {
- re_goto_bottom(el);
- *el->el_line.lastchar = '\0'; /* just in case */
- return CC_LIST_CHOICES;
- }
+ } else {
+ re_goto_bottom(el);
+ *el->el_line.lastchar = '\0'; /* just in case */
+ return (CC_LIST_CHOICES);
+ }
#endif
}
@@ -802,20 +765,18 @@ vi_list_or_eof(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_kill_line_prev(el, c)
- EditLine *el;
- int c;
+vi_kill_line_prev(EditLine *el, int c)
{
- char *kp, *cp;
+ char *kp, *cp;
- cp = el->el_line.buffer;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.cursor)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- c_delbefore(el, el->el_line.cursor - el->el_line.buffer);
- el->el_line.cursor = el->el_line.buffer; /* zap! */
- return CC_REFRESH;
+ cp = el->el_line.buffer;
+ kp = el->el_chared.c_kill.buf;
+ while (cp < el->el_line.cursor)
+ *kp++ = *cp++; /* copy it */
+ el->el_chared.c_kill.last = kp;
+ c_delbefore(el, el->el_line.cursor - el->el_line.buffer);
+ el->el_line.cursor = el->el_line.buffer; /* zap! */
+ return (CC_REFRESH);
}
@@ -825,11 +786,10 @@ vi_kill_line_prev(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_search_prev(el, c)
- EditLine *el;
- int c;
+vi_search_prev(EditLine *el, int c)
{
- return cv_search(el, ED_SEARCH_PREV_HISTORY);
+
+ return (cv_search(el, ED_SEARCH_PREV_HISTORY));
}
@@ -839,11 +799,10 @@ vi_search_prev(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_search_next(el, c)
- EditLine *el;
- int c;
+vi_search_next(EditLine *el, int c)
{
- return cv_search(el, ED_SEARCH_NEXT_HISTORY);
+
+ return (cv_search(el, ED_SEARCH_NEXT_HISTORY));
}
@@ -853,14 +812,13 @@ vi_search_next(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_repeat_search_next(el, c)
- EditLine *el;
- int c;
+vi_repeat_search_next(EditLine *el, int c)
{
- if (el->el_search.patlen == 0)
- return CC_ERROR;
- else
- return cv_repeat_srch(el, el->el_search.patdir);
+
+ if (el->el_search.patlen == 0)
+ return (CC_ERROR);
+ else
+ return (cv_repeat_srch(el, el->el_search.patdir));
}
@@ -870,16 +828,15 @@ vi_repeat_search_next(el, c)
*/
/*ARGSUSED*/
protected el_action_t
-vi_repeat_search_prev(el, c)
- EditLine *el;
- int c;
+vi_repeat_search_prev(EditLine *el, int c)
{
- if (el->el_search.patlen == 0)
- return CC_ERROR;
- else
- return cv_repeat_srch(el,
- el->el_search.patdir == ED_SEARCH_PREV_HISTORY ?
- ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY);
+
+ if (el->el_search.patlen == 0)
+ return (CC_ERROR);
+ else
+ return (cv_repeat_srch(el,
+ el->el_search.patdir == ED_SEARCH_PREV_HISTORY ?
+ ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY));
}
@@ -889,19 +846,17 @@ vi_repeat_search_prev(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_next_char(el, c)
- EditLine *el;
- int c;
+vi_next_char(EditLine *el, int c)
{
- char ch;
+ char ch;
- if (el_getc(el, &ch) != 1)
- return ed_end_of_file(el, 0);
+ if (el_getc(el, &ch) != 1)
+ return (ed_end_of_file(el, 0));
- el->el_search.chadir = CHAR_FWD;
- el->el_search.chacha = ch;
+ el->el_search.chadir = CHAR_FWD;
+ el->el_search.chacha = ch;
- return cv_csearch_fwd(el, ch, el->el_state.argument, 0);
+ return (cv_csearch_fwd(el, ch, el->el_state.argument, 0));
}
@@ -912,19 +867,17 @@ vi_next_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_prev_char(el, c)
- EditLine *el;
- int c;
+vi_prev_char(EditLine *el, int c)
{
- char ch;
+ char ch;
- if (el_getc(el, &ch) != 1)
- return ed_end_of_file(el, 0);
+ if (el_getc(el, &ch) != 1)
+ return (ed_end_of_file(el, 0));
- el->el_search.chadir = CHAR_BACK;
- el->el_search.chacha = ch;
+ el->el_search.chadir = CHAR_BACK;
+ el->el_search.chacha = ch;
- return cv_csearch_back(el, ch, el->el_state.argument, 0);
+ return (cv_csearch_back(el, ch, el->el_state.argument, 0));
}
@@ -934,16 +887,14 @@ vi_prev_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_to_next_char(el, c)
- EditLine *el;
- int c;
+vi_to_next_char(EditLine *el, int c)
{
- char ch;
+ char ch;
- if (el_getc(el, &ch) != 1)
- return ed_end_of_file(el, 0);
+ if (el_getc(el, &ch) != 1)
+ return (ed_end_of_file(el, 0));
- return cv_csearch_fwd(el, ch, el->el_state.argument, 1);
+ return (cv_csearch_fwd(el, ch, el->el_state.argument, 1));
}
@@ -954,15 +905,14 @@ vi_to_next_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_to_prev_char(el, c)
- EditLine *el;
- int c;
+vi_to_prev_char(EditLine *el, int c)
{
- char ch;
- if (el_getc(el, &ch) != 1)
- return ed_end_of_file(el, 0);
+ char ch;
+
+ if (el_getc(el, &ch) != 1)
+ return (ed_end_of_file(el, 0));
- return cv_csearch_back(el, ch, el->el_state.argument, 1);
+ return (cv_csearch_back(el, ch, el->el_state.argument, 1));
}
@@ -972,16 +922,17 @@ vi_to_prev_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_repeat_next_char(el, c)
- EditLine *el;
- int c;
+vi_repeat_next_char(EditLine *el, int c)
{
- if (el->el_search.chacha == 0)
- return CC_ERROR;
- return el->el_search.chadir == CHAR_FWD ?
- cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) :
- cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0);
+ if (el->el_search.chacha == 0)
+ return (CC_ERROR);
+
+ return (el->el_search.chadir == CHAR_FWD
+ ? cv_csearch_fwd(el, el->el_search.chacha,
+ el->el_state.argument, 0)
+ : cv_csearch_back(el, el->el_search.chacha,
+ el->el_state.argument, 0));
}
@@ -991,14 +942,13 @@ vi_repeat_next_char(el, c)
*/
protected el_action_t
/*ARGSUSED*/
-vi_repeat_prev_char(el, c)
- EditLine *el;
- int c;
+vi_repeat_prev_char(EditLine *el, int c)
{
- if (el->el_search.chacha == 0)
- return CC_ERROR;
- return el->el_search.chadir == CHAR_BACK ?
- cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) :
- cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0);
+ if (el->el_search.chacha == 0)
+ return (CC_ERROR);
+
+ return el->el_search.chadir == CHAR_BACK ?
+ cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) :
+ cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0);
}