diff options
Diffstat (limited to 'lib/libedit/emacs.c')
-rw-r--r-- | lib/libedit/emacs.c | 500 |
1 files changed, 239 insertions, 261 deletions
diff --git a/lib/libedit/emacs.c b/lib/libedit/emacs.c index b4d92cf5aa1..59b01ac31fc 100644 --- a/lib/libedit/emacs.c +++ b/lib/libedit/emacs.c @@ -1,5 +1,5 @@ -/* $OpenBSD: emacs.c,v 1.5 2003/06/02 20:18:40 millert Exp $ */ -/* $NetBSD: emacs.c,v 1.3 1997/01/11 06:47:54 lukem Exp $ */ +/* $OpenBSD: emacs.c,v 1.6 2003/10/31 08:42:24 otto Exp $ */ +/* $NetBSD: emacs.c,v 1.15 2003/08/07 16:44:31 agc Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -33,18 +33,18 @@ * SUCH DAMAGE. */ +#include "config.h" #if !defined(lint) && !defined(SCCSID) #if 0 static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93"; #else -static const char rcsid[] = "$OpenBSD: emacs.c,v 1.5 2003/06/02 20:18:40 millert Exp $"; +static const char rcsid[] = "$OpenBSD: emacs.c,v 1.6 2003/10/31 08:42:24 otto Exp $"; #endif #endif /* not lint && not SCCSID */ -/* +/* * emacs.c: Emacs functions */ -#include "sys.h" #include "el.h" /* em_delete_or_list(): @@ -53,28 +53,31 @@ static const char rcsid[] = "$OpenBSD: emacs.c,v 1.5 2003/06/02 20:18:40 millert */ protected el_action_t /*ARGSUSED*/ -em_delete_or_list(el, c) - EditLine *el; - int c; +em_delete_or_list(EditLine *el, int c __attribute__((__unused__))) { - if (el->el_line.cursor == el->el_line.lastchar) { /* if I'm at the end */ - if (el->el_line.cursor == el->el_line.buffer) { /* and the beginning */ - term_overwrite(el, STReof, 4);/* then do a EOF */ - term__flush(); - return CC_EOF; - } - else { - /* Here we could list completions, but it is an error right now */ - term_beep(el); - return CC_ERROR; + + if (el->el_line.cursor == el->el_line.lastchar) { + /* if I'm at the end */ + if (el->el_line.cursor == el->el_line.buffer) { + /* and the beginning */ + term_overwrite(el, STReof, 4); /* then do a EOF */ + term__flush(); + return (CC_EOF); + } else { + /* + * Here we could list completions, but it is an + * error right now + */ + term_beep(el); + return (CC_ERROR); + } + } else { + c_delafter(el, el->el_state.argument); /* delete after dot */ + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + /* bounds check */ + return (CC_REFRESH); } - } - else { - c_delafter(el, el->el_state.argument); /* delete after dot */ - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; /* bounds check */ - return CC_REFRESH; - } } @@ -84,27 +87,26 @@ em_delete_or_list(el, c) */ protected el_action_t /*ARGSUSED*/ -em_delete_next_word(el, c) - EditLine *el; - int c; +em_delete_next_word(EditLine *el, int c __attribute__((__unused__))) { - char *cp, *p, *kp; + char *cp, *p, *kp; - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); - cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument, ce__isword); + cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); - for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) - /* save the text */ - *kp++ = *p; - el->el_chared.c_kill.last = kp; + for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) + /* save the text */ + *kp++ = *p; + el->el_chared.c_kill.last = kp; - c_delafter(el, cp - el->el_line.cursor); /* delete after dot */ - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; /* bounds check */ - return CC_REFRESH; + c_delafter(el, cp - el->el_line.cursor); /* delete after dot */ + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + /* bounds check */ + return (CC_REFRESH); } @@ -114,34 +116,34 @@ em_delete_next_word(el, c) */ protected el_action_t /*ARGSUSED*/ -em_yank(el, c) - EditLine *el; - int c; +em_yank(EditLine *el, int c __attribute__((__unused__))) { - char *kp, *cp; + char *kp, *cp; - if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) - return CC_ERROR; + if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) { + if (!ch_enlargebufs(el, 1)) + return (CC_ERROR); + } - if (el->el_line.lastchar + - (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= - el->el_line.limit) - return CC_ERROR; + if (el->el_line.lastchar + + (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= + el->el_line.limit) + return (CC_ERROR); - el->el_chared.c_kill.mark = el->el_line.cursor; - cp = el->el_line.cursor; + el->el_chared.c_kill.mark = el->el_line.cursor; + cp = el->el_line.cursor; - /* open the space, */ - c_insert(el, el->el_chared.c_kill.last - el->el_chared.c_kill.buf); - /* copy the chars */ - for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++) - *cp++ = *kp; + /* open the space, */ + c_insert(el, el->el_chared.c_kill.last - el->el_chared.c_kill.buf); + /* copy the chars */ + for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++) + *cp++ = *kp; - /* if an arg, cursor at beginning else cursor at end */ - if (el->el_state.argument == 1) - el->el_line.cursor = cp; + /* if an arg, cursor at beginning else cursor at end */ + if (el->el_state.argument == 1) + el->el_line.cursor = cp; - return CC_REFRESH; + return (CC_REFRESH); } @@ -151,20 +153,19 @@ em_yank(el, c) */ protected el_action_t /*ARGSUSED*/ -em_kill_line(el, c) - EditLine *el; - int c; +em_kill_line(EditLine *el, int c __attribute__((__unused__))) { - char *kp, *cp; - - cp = el->el_line.buffer; - kp = el->el_chared.c_kill.buf; - while (cp < el->el_line.lastchar) - *kp++ = *cp++; /* copy it */ - el->el_chared.c_kill.last = kp; - el->el_line.lastchar = el->el_line.buffer; /* zap! -- delete all of it */ - el->el_line.cursor = el->el_line.buffer; - return CC_REFRESH; + char *kp, *cp; + + cp = el->el_line.buffer; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.lastchar) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + /* zap! -- delete all of it */ + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + return (CC_REFRESH); } @@ -174,33 +175,30 @@ em_kill_line(el, c) */ protected el_action_t /*ARGSUSED*/ -em_kill_region(el, c) - EditLine *el; - int c; +em_kill_region(EditLine *el, int c __attribute__((__unused__))) { - char *kp, *cp; - - if (!el->el_chared.c_kill.mark) - return CC_ERROR; - - if (el->el_chared.c_kill.mark > el->el_line.cursor) { - cp = el->el_line.cursor; - kp = el->el_chared.c_kill.buf; - while (cp < el->el_chared.c_kill.mark) - *kp++ = *cp++; /* copy it */ - el->el_chared.c_kill.last = kp; - c_delafter(el, cp - el->el_line.cursor); - } - else { /* mark is before cursor */ - cp = el->el_chared.c_kill.mark; - 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, cp - el->el_chared.c_kill.mark); - el->el_line.cursor = el->el_chared.c_kill.mark; - } - return CC_REFRESH; + char *kp, *cp; + + if (!el->el_chared.c_kill.mark) + return (CC_ERROR); + + if (el->el_chared.c_kill.mark > el->el_line.cursor) { + cp = el->el_line.cursor; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_chared.c_kill.mark) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + c_delafter(el, cp - el->el_line.cursor); + } else { /* mark is before cursor */ + cp = el->el_chared.c_kill.mark; + 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, cp - el->el_chared.c_kill.mark); + el->el_line.cursor = el->el_chared.c_kill.mark; + } + return (CC_REFRESH); } @@ -210,52 +208,46 @@ em_kill_region(el, c) */ protected el_action_t /*ARGSUSED*/ -em_copy_region(el, c) - EditLine *el; - int c; +em_copy_region(EditLine *el, int c __attribute__((__unused__))) { - char *kp, *cp; - - if (el->el_chared.c_kill.mark) - return CC_ERROR; - - if (el->el_chared.c_kill.mark > el->el_line.cursor) { - cp = el->el_line.cursor; - kp = el->el_chared.c_kill.buf; - while (cp < el->el_chared.c_kill.mark) - *kp++ = *cp++; /* copy it */ - el->el_chared.c_kill.last = kp; - } - else { - cp = el->el_chared.c_kill.mark; - kp = el->el_chared.c_kill.buf; - while (cp < el->el_line.cursor) - *kp++ = *cp++; /* copy it */ - el->el_chared.c_kill.last = kp; - } - return CC_NORM; + char *kp, *cp; + + if (!el->el_chared.c_kill.mark) + return (CC_ERROR); + + if (el->el_chared.c_kill.mark > el->el_line.cursor) { + cp = el->el_line.cursor; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_chared.c_kill.mark) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + } else { + cp = el->el_chared.c_kill.mark; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.cursor) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + } + return (CC_NORM); } -/* em_gosmacs_traspose(): +/* em_gosmacs_transpose(): * Exchange the two characters before the cursor * Gosling emacs transpose chars [^T] */ protected el_action_t -em_gosmacs_traspose(el, c) - EditLine *el; - int c; +em_gosmacs_transpose(EditLine *el, int c) { - if (el->el_line.cursor > &el->el_line.buffer[1]) { - /* must have at least two chars entered */ - c = el->el_line.cursor[-2]; - el->el_line.cursor[-2] = el->el_line.cursor[-1]; - el->el_line.cursor[-1] = c; - return CC_REFRESH; - } - else - return CC_ERROR; + if (el->el_line.cursor > &el->el_line.buffer[1]) { + /* must have at least two chars entered */ + c = el->el_line.cursor[-2]; + el->el_line.cursor[-2] = el->el_line.cursor[-1]; + el->el_line.cursor[-1] = c; + return (CC_REFRESH); + } else + return (CC_ERROR); } @@ -265,49 +257,46 @@ em_gosmacs_traspose(el, c) */ protected el_action_t /*ARGSUSED*/ -em_next_word(el, c) - EditLine *el; - int c; +em_next_word(EditLine *el, int c __attribute__((__unused__))) { - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; - - el->el_line.cursor = c__next_word(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument, - ce__isword); - - if (el->el_map.type == MAP_VI) - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } - - return CC_CURSOR; + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); + + el->el_line.cursor = c__next_word(el->el_line.cursor, + el->el_line.lastchar, + el->el_state.argument, + ce__isword); + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } + /* em_upper_case(): * Uppercase the characters from cursor to end of current word * [M-u] */ protected el_action_t /*ARGSUSED*/ -em_upper_case(el, c) - EditLine *el; - int c; +em_upper_case(EditLine *el, int c __attribute__((__unused__))) { - char *cp, *ep; + char *cp, *ep; - ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument, ce__isword); + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); - for (cp = el->el_line.cursor; cp < ep; cp++) - if (islower(*cp)) - *cp = toupper(*cp); + for (cp = el->el_line.cursor; cp < ep; cp++) + if (islower((unsigned char) *cp)) + *cp = toupper(*cp); - el->el_line.cursor = ep; - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; - return CC_REFRESH; + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return (CC_REFRESH); } @@ -317,56 +306,53 @@ em_upper_case(el, c) */ protected el_action_t /*ARGSUSED*/ -em_capitol_case(el, c) - EditLine *el; - int c; +em_capitol_case(EditLine *el, int c __attribute__((__unused__))) { - char *cp, *ep; - - ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument, ce__isword); - - for (cp = el->el_line.cursor; cp < ep; cp++) { - if (isalpha(*cp)) { - if (islower(*cp)) - *cp = toupper(*cp); - cp++; - break; + char *cp, *ep; + + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); + + for (cp = el->el_line.cursor; cp < ep; cp++) { + if (isalpha((unsigned char) *cp)) { + if (islower((unsigned char) *cp)) + *cp = toupper(*cp); + cp++; + break; + } } - } - for (; cp < ep; cp++) - if (isupper(*cp)) - *cp = tolower(*cp); - - el->el_line.cursor = ep; - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; - return CC_REFRESH; + for (; cp < ep; cp++) + if (isupper((unsigned char) *cp)) + *cp = tolower(*cp); + + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return (CC_REFRESH); } + /* em_lower_case(): * Lowercase the characters from cursor to end of current word * [M-l] */ protected el_action_t /*ARGSUSED*/ -em_lower_case(el, c) - EditLine *el; - int c; +em_lower_case(EditLine *el, int c __attribute__((__unused__))) { - char *cp, *ep; + char *cp, *ep; - ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument, ce__isword); + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); - for (cp = el->el_line.cursor; cp < ep; cp++) - if (isupper(*cp)) - *cp = tolower(*cp); + for (cp = el->el_line.cursor; cp < ep; cp++) + if (isupper((unsigned char) *cp)) + *cp = tolower(*cp); - el->el_line.cursor = ep; - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; - return CC_REFRESH; + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return (CC_REFRESH); } @@ -376,62 +362,59 @@ em_lower_case(el, c) */ protected el_action_t /*ARGSUSED*/ -em_set_mark(el, c) - EditLine *el; - int c; +em_set_mark(EditLine *el, int c __attribute__((__unused__))) { - el->el_chared.c_kill.mark = el->el_line.cursor; - return CC_NORM; + + el->el_chared.c_kill.mark = el->el_line.cursor; + return (CC_NORM); } /* em_exchange_mark(): - * Exchange the cursor and mark + * Exchange the cursor and mark * [^X^X] */ protected el_action_t /*ARGSUSED*/ -em_exchange_mark(el, c) - EditLine *el; - int c; +em_exchange_mark(EditLine *el, int c __attribute__((__unused__))) { - register char *cp; + char *cp; - cp = el->el_line.cursor; - el->el_line.cursor = el->el_chared.c_kill.mark; - el->el_chared.c_kill.mark = cp; - return CC_CURSOR; + cp = el->el_line.cursor; + el->el_line.cursor = el->el_chared.c_kill.mark; + el->el_chared.c_kill.mark = cp; + return (CC_CURSOR); } + /* em_universal_argument(): * Universal argument (argument times 4) * [^U] */ protected el_action_t /*ARGSUSED*/ -em_universal_argument(el, c) - EditLine *el; - int c; +em_universal_argument(EditLine *el, int c __attribute__((__unused__))) { /* multiply current argument by 4 */ - if (el->el_state.argument > 1000000) - return CC_ERROR; - el->el_state.doingarg = 1; - el->el_state.argument *= 4; - return CC_ARGHACK; + + if (el->el_state.argument > 1000000) + return (CC_ERROR); + el->el_state.doingarg = 1; + el->el_state.argument *= 4; + return (CC_ARGHACK); } + /* em_meta_next(): * Add 8th bit to next character typed * [<ESC>] */ protected el_action_t /*ARGSUSED*/ -em_meta_next(el, c) - EditLine *el; - int c; +em_meta_next(EditLine *el, int c __attribute__((__unused__))) { - el->el_state.metanext = 1; - return CC_ARGHACK; + + el->el_state.metanext = 1; + return (CC_ARGHACK); } @@ -440,13 +423,12 @@ em_meta_next(el, c) */ protected el_action_t /*ARGSUSED*/ -em_toggle_overwrite(el, c) - EditLine *el; - int c; +em_toggle_overwrite(EditLine *el, int c __attribute__((__unused__))) { - el->el_state.inputmode = - (el->el_state.inputmode == MODE_INSERT) ? MODE_REPLACE : MODE_INSERT; - return CC_NORM; + + el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? + MODE_REPLACE : MODE_INSERT; + return (CC_NORM); } @@ -455,27 +437,25 @@ em_toggle_overwrite(el, c) */ protected el_action_t /*ARGSUSED*/ -em_copy_prev_word(el, c) - EditLine *el; - int c; +em_copy_prev_word(EditLine *el, int c __attribute__((__unused__))) { - char *cp, *oldc, *dp; + char *cp, *oldc, *dp; - if (el->el_line.cursor == el->el_line.buffer) - return CC_ERROR; + if (el->el_line.cursor == el->el_line.buffer) + return (CC_ERROR); - oldc = el->el_line.cursor; - /* does a bounds check */ - cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, - el->el_state.argument, ce__isword); + oldc = el->el_line.cursor; + /* does a bounds check */ + cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, + el->el_state.argument, ce__isword); - c_insert(el, oldc - cp); - for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) - *dp++ = *cp; + c_insert(el, oldc - cp); + for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) + *dp++ = *cp; - el->el_line.cursor = dp; /* put cursor at end */ + el->el_line.cursor = dp;/* put cursor at end */ - return CC_REFRESH; + return (CC_REFRESH); } @@ -484,12 +464,11 @@ em_copy_prev_word(el, c) */ protected el_action_t /*ARGSUSED*/ -em_inc_search_next(el, c) - EditLine *el; - int c; +em_inc_search_next(EditLine *el, int c __attribute__((__unused__))) { - el->el_search.patlen = 0; - return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); + + el->el_search.patlen = 0; + return (ce_inc_search(el, ED_SEARCH_NEXT_HISTORY)); } @@ -498,10 +477,9 @@ em_inc_search_next(el, c) */ protected el_action_t /*ARGSUSED*/ -em_inc_search_prev(el, c) - EditLine *el; - int c; +em_inc_search_prev(EditLine *el, int c __attribute__((__unused__))) { - el->el_search.patlen = 0; - return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); + + el->el_search.patlen = 0; + return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY)); } |