Changeset View
Changeset View
Standalone View
Standalone View
lib/libedit/emacs.c
/* $NetBSD: emacs.c,v 1.32 2016/02/16 22:53:14 christos Exp $ */ | /* $NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $ */ | ||||
/*- | /*- | ||||
* Copyright (c) 1992, 1993 | * Copyright (c) 1992, 1993 | ||||
* The Regents of the University of California. All rights reserved. | * The Regents of the University of California. All rights reserved. | ||||
* | * | ||||
* This code is derived from software contributed to Berkeley by | * This code is derived from software contributed to Berkeley by | ||||
* Christos Zoulas of Cornell University. | * Christos Zoulas of Cornell University. | ||||
* | * | ||||
Show All 22 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include "config.h" | #include "config.h" | ||||
#if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||
#if 0 | #if 0 | ||||
static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93"; | ||||
#else | #else | ||||
__RCSID("$NetBSD: emacs.c,v 1.32 2016/02/16 22:53:14 christos Exp $"); | __RCSID("$NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $"); | ||||
#endif | #endif | ||||
#endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
/* | /* | ||||
* emacs.c: Emacs functions | * emacs.c: Emacs functions | ||||
*/ | */ | ||||
#include <ctype.h> | #include <ctype.h> | ||||
#include "el.h" | #include "el.h" | ||||
#include "emacs.h" | #include "emacs.h" | ||||
#include "fcns.h" | |||||
/* em_delete_or_list(): | /* em_delete_or_list(): | ||||
* Delete character under cursor or list completions if at end of line | * Delete character under cursor or list completions if at end of line | ||||
* [^D] | * [^D] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_delete_or_list(EditLine *el, wint_t c) | em_delete_or_list(EditLine *el, wint_t c) | ||||
{ | { | ||||
if (el->el_line.cursor == el->el_line.lastchar) { | if (el->el_line.cursor == el->el_line.lastchar) { | ||||
/* if I'm at the end */ | /* if I'm at the end */ | ||||
if (el->el_line.cursor == el->el_line.buffer) { | if (el->el_line.cursor == el->el_line.buffer) { | ||||
/* and the beginning */ | /* and the beginning */ | ||||
Show All 19 Lines | em_delete_or_list(EditLine *el, wint_t c) | ||||
} | } | ||||
} | } | ||||
/* em_delete_next_word(): | /* em_delete_next_word(): | ||||
* Cut from cursor to end of current word | * Cut from cursor to end of current word | ||||
* [M-d] | * [M-d] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_delete_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | em_delete_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp, *p, *kp; | wchar_t *cp, *p, *kp; | ||||
if (el->el_line.cursor == el->el_line.lastchar) | if (el->el_line.cursor == el->el_line.lastchar) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, | cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||
el->el_state.argument, ce__isword); | el->el_state.argument, ce__isword); | ||||
for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) | for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) | ||||
/* save the text */ | /* save the text */ | ||||
*kp++ = *p; | *kp++ = *p; | ||||
el->el_chared.c_kill.last = kp; | el->el_chared.c_kill.last = kp; | ||||
c_delafter(el, (int)(cp - el->el_line.cursor)); /* delete after dot */ | c_delafter(el, (int)(cp - el->el_line.cursor)); /* delete after dot */ | ||||
if (el->el_line.cursor > el->el_line.lastchar) | if (el->el_line.cursor > el->el_line.lastchar) | ||||
el->el_line.cursor = el->el_line.lastchar; | el->el_line.cursor = el->el_line.lastchar; | ||||
/* bounds check */ | /* bounds check */ | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_yank(): | /* em_yank(): | ||||
* Paste cut buffer at cursor position | * Paste cut buffer at cursor position | ||||
* [^Y] | * [^Y] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_yank(EditLine *el, wint_t c __attribute__((__unused__))) | em_yank(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *kp, *cp; | wchar_t *kp, *cp; | ||||
if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) | if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) | ||||
return CC_NORM; | return CC_NORM; | ||||
if (el->el_line.lastchar + | if (el->el_line.lastchar + | ||||
(el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= | (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= | ||||
el->el_line.limit) | el->el_line.limit) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
Show All 15 Lines | em_yank(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_kill_line(): | /* em_kill_line(): | ||||
* Cut the entire line and save in cut buffer | * Cut the entire line and save in cut buffer | ||||
* [^U] | * [^U] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) | em_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *kp, *cp; | wchar_t *kp, *cp; | ||||
cp = el->el_line.buffer; | cp = el->el_line.buffer; | ||||
kp = el->el_chared.c_kill.buf; | kp = el->el_chared.c_kill.buf; | ||||
while (cp < el->el_line.lastchar) | while (cp < el->el_line.lastchar) | ||||
*kp++ = *cp++; /* copy it */ | *kp++ = *cp++; /* copy it */ | ||||
el->el_chared.c_kill.last = kp; | el->el_chared.c_kill.last = kp; | ||||
/* zap! -- delete all of it */ | /* zap! -- delete all of it */ | ||||
el->el_line.lastchar = el->el_line.buffer; | el->el_line.lastchar = el->el_line.buffer; | ||||
el->el_line.cursor = el->el_line.buffer; | el->el_line.cursor = el->el_line.buffer; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_kill_region(): | /* em_kill_region(): | ||||
* Cut area between mark and cursor and save in cut buffer | * Cut area between mark and cursor and save in cut buffer | ||||
* [^W] | * [^W] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_kill_region(EditLine *el, wint_t c __attribute__((__unused__))) | em_kill_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *kp, *cp; | wchar_t *kp, *cp; | ||||
if (!el->el_chared.c_kill.mark) | if (!el->el_chared.c_kill.mark) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
if (el->el_chared.c_kill.mark > el->el_line.cursor) { | if (el->el_chared.c_kill.mark > el->el_line.cursor) { | ||||
cp = el->el_line.cursor; | cp = el->el_line.cursor; | ||||
kp = el->el_chared.c_kill.buf; | kp = el->el_chared.c_kill.buf; | ||||
while (cp < el->el_chared.c_kill.mark) | while (cp < el->el_chared.c_kill.mark) | ||||
Show All 12 Lines | em_kill_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_copy_region(): | /* em_copy_region(): | ||||
* Copy area between mark and cursor to cut buffer | * Copy area between mark and cursor to cut buffer | ||||
* [M-W] | * [M-W] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_copy_region(EditLine *el, wint_t c __attribute__((__unused__))) | em_copy_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *kp, *cp; | wchar_t *kp, *cp; | ||||
if (!el->el_chared.c_kill.mark) | if (!el->el_chared.c_kill.mark) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
if (el->el_chared.c_kill.mark > el->el_line.cursor) { | if (el->el_chared.c_kill.mark > el->el_line.cursor) { | ||||
cp = el->el_line.cursor; | cp = el->el_line.cursor; | ||||
kp = el->el_chared.c_kill.buf; | kp = el->el_chared.c_kill.buf; | ||||
while (cp < el->el_chared.c_kill.mark) | while (cp < el->el_chared.c_kill.mark) | ||||
Show All 9 Lines | em_copy_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
return CC_NORM; | return CC_NORM; | ||||
} | } | ||||
/* em_gosmacs_transpose(): | /* em_gosmacs_transpose(): | ||||
* Exchange the two characters before the cursor | * Exchange the two characters before the cursor | ||||
* Gosling emacs transpose chars [^T] | * Gosling emacs transpose chars [^T] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
em_gosmacs_transpose(EditLine *el, wint_t c) | em_gosmacs_transpose(EditLine *el, wint_t c) | ||||
{ | { | ||||
if (el->el_line.cursor > &el->el_line.buffer[1]) { | if (el->el_line.cursor > &el->el_line.buffer[1]) { | ||||
/* must have at least two chars entered */ | /* must have at least two chars entered */ | ||||
c = el->el_line.cursor[-2]; | c = el->el_line.cursor[-2]; | ||||
el->el_line.cursor[-2] = el->el_line.cursor[-1]; | el->el_line.cursor[-2] = el->el_line.cursor[-1]; | ||||
el->el_line.cursor[-1] = (Char)c; | el->el_line.cursor[-1] = c; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} else | } else | ||||
return CC_ERROR; | return CC_ERROR; | ||||
} | } | ||||
/* em_next_word(): | /* em_next_word(): | ||||
* Move next to end of current word | * Move next to end of current word | ||||
* [M-f] | * [M-f] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | em_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
if (el->el_line.cursor == el->el_line.lastchar) | if (el->el_line.cursor == el->el_line.lastchar) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
el->el_line.cursor = c__next_word(el->el_line.cursor, | el->el_line.cursor = c__next_word(el->el_line.cursor, | ||||
el->el_line.lastchar, | el->el_line.lastchar, | ||||
el->el_state.argument, | el->el_state.argument, | ||||
ce__isword); | ce__isword); | ||||
if (el->el_map.type == MAP_VI) | if (el->el_map.type == MAP_VI) | ||||
if (el->el_chared.c_vcmd.action != NOP) { | if (el->el_chared.c_vcmd.action != NOP) { | ||||
cv_delfini(el); | cv_delfini(el); | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
return CC_CURSOR; | return CC_CURSOR; | ||||
} | } | ||||
/* em_upper_case(): | /* em_upper_case(): | ||||
* Uppercase the characters from cursor to end of current word | * Uppercase the characters from cursor to end of current word | ||||
* [M-u] | * [M-u] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_upper_case(EditLine *el, wint_t c __attribute__((__unused__))) | em_upper_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp, *ep; | wchar_t *cp, *ep; | ||||
ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||
el->el_state.argument, ce__isword); | el->el_state.argument, ce__isword); | ||||
for (cp = el->el_line.cursor; cp < ep; cp++) | for (cp = el->el_line.cursor; cp < ep; cp++) | ||||
if (Islower(*cp)) | if (iswlower(*cp)) | ||||
*cp = Toupper(*cp); | *cp = towupper(*cp); | ||||
el->el_line.cursor = ep; | el->el_line.cursor = ep; | ||||
if (el->el_line.cursor > el->el_line.lastchar) | if (el->el_line.cursor > el->el_line.lastchar) | ||||
el->el_line.cursor = el->el_line.lastchar; | el->el_line.cursor = el->el_line.lastchar; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_capitol_case(): | /* em_capitol_case(): | ||||
* Capitalize the characters from cursor to end of current word | * Capitalize the characters from cursor to end of current word | ||||
* [M-c] | * [M-c] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_capitol_case(EditLine *el, wint_t c __attribute__((__unused__))) | em_capitol_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp, *ep; | wchar_t *cp, *ep; | ||||
ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||
el->el_state.argument, ce__isword); | el->el_state.argument, ce__isword); | ||||
for (cp = el->el_line.cursor; cp < ep; cp++) { | for (cp = el->el_line.cursor; cp < ep; cp++) { | ||||
if (Isalpha(*cp)) { | if (iswalpha(*cp)) { | ||||
if (Islower(*cp)) | if (iswlower(*cp)) | ||||
*cp = Toupper(*cp); | *cp = towupper(*cp); | ||||
cp++; | cp++; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
for (; cp < ep; cp++) | for (; cp < ep; cp++) | ||||
if (Isupper(*cp)) | if (iswupper(*cp)) | ||||
*cp = Tolower(*cp); | *cp = towlower(*cp); | ||||
el->el_line.cursor = ep; | el->el_line.cursor = ep; | ||||
if (el->el_line.cursor > el->el_line.lastchar) | if (el->el_line.cursor > el->el_line.lastchar) | ||||
el->el_line.cursor = el->el_line.lastchar; | el->el_line.cursor = el->el_line.lastchar; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_lower_case(): | /* em_lower_case(): | ||||
* Lowercase the characters from cursor to end of current word | * Lowercase the characters from cursor to end of current word | ||||
* [M-l] | * [M-l] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_lower_case(EditLine *el, wint_t c __attribute__((__unused__))) | em_lower_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp, *ep; | wchar_t *cp, *ep; | ||||
ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||
el->el_state.argument, ce__isword); | el->el_state.argument, ce__isword); | ||||
for (cp = el->el_line.cursor; cp < ep; cp++) | for (cp = el->el_line.cursor; cp < ep; cp++) | ||||
if (Isupper(*cp)) | if (iswupper(*cp)) | ||||
*cp = Tolower(*cp); | *cp = towlower(*cp); | ||||
el->el_line.cursor = ep; | el->el_line.cursor = ep; | ||||
if (el->el_line.cursor > el->el_line.lastchar) | if (el->el_line.cursor > el->el_line.lastchar) | ||||
el->el_line.cursor = el->el_line.lastchar; | el->el_line.cursor = el->el_line.lastchar; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } | ||||
/* em_set_mark(): | /* em_set_mark(): | ||||
* Set the mark at cursor | * Set the mark at cursor | ||||
* [^@] | * [^@] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_set_mark(EditLine *el, wint_t c __attribute__((__unused__))) | em_set_mark(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
el->el_chared.c_kill.mark = el->el_line.cursor; | el->el_chared.c_kill.mark = el->el_line.cursor; | ||||
return CC_NORM; | return CC_NORM; | ||||
} | } | ||||
/* em_exchange_mark(): | /* em_exchange_mark(): | ||||
* Exchange the cursor and mark | * Exchange the cursor and mark | ||||
* [^X^X] | * [^X^X] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_exchange_mark(EditLine *el, wint_t c __attribute__((__unused__))) | em_exchange_mark(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp; | wchar_t *cp; | ||||
cp = el->el_line.cursor; | cp = el->el_line.cursor; | ||||
el->el_line.cursor = el->el_chared.c_kill.mark; | el->el_line.cursor = el->el_chared.c_kill.mark; | ||||
el->el_chared.c_kill.mark = cp; | el->el_chared.c_kill.mark = cp; | ||||
return CC_CURSOR; | return CC_CURSOR; | ||||
} | } | ||||
/* em_universal_argument(): | /* em_universal_argument(): | ||||
* Universal argument (argument times 4) | * Universal argument (argument times 4) | ||||
* [^U] | * [^U] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_universal_argument(EditLine *el, wint_t c __attribute__((__unused__))) | em_universal_argument(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ /* multiply current argument by 4 */ | { /* multiply current argument by 4 */ | ||||
if (el->el_state.argument > 1000000) | if (el->el_state.argument > 1000000) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
el->el_state.doingarg = 1; | el->el_state.doingarg = 1; | ||||
el->el_state.argument *= 4; | el->el_state.argument *= 4; | ||||
return CC_ARGHACK; | return CC_ARGHACK; | ||||
} | } | ||||
/* em_meta_next(): | /* em_meta_next(): | ||||
* Add 8th bit to next character typed | * Add 8th bit to next character typed | ||||
* [<ESC>] | * [<ESC>] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_meta_next(EditLine *el, wint_t c __attribute__((__unused__))) | em_meta_next(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
el->el_state.metanext = 1; | el->el_state.metanext = 1; | ||||
return CC_ARGHACK; | return CC_ARGHACK; | ||||
} | } | ||||
/* em_toggle_overwrite(): | /* em_toggle_overwrite(): | ||||
* Switch from insert to overwrite mode or vice versa | * Switch from insert to overwrite mode or vice versa | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_toggle_overwrite(EditLine *el, wint_t c __attribute__((__unused__))) | em_toggle_overwrite(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? | el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? | ||||
MODE_REPLACE : MODE_INSERT; | MODE_REPLACE : MODE_INSERT; | ||||
return CC_NORM; | return CC_NORM; | ||||
} | } | ||||
/* em_copy_prev_word(): | /* em_copy_prev_word(): | ||||
* Copy current word to cursor | * Copy current word to cursor | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_copy_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) | em_copy_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
Char *cp, *oldc, *dp; | wchar_t *cp, *oldc, *dp; | ||||
if (el->el_line.cursor == el->el_line.buffer) | if (el->el_line.cursor == el->el_line.buffer) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
oldc = el->el_line.cursor; | oldc = el->el_line.cursor; | ||||
/* does a bounds check */ | /* does a bounds check */ | ||||
cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, | cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, | ||||
el->el_state.argument, ce__isword); | el->el_state.argument, ce__isword); | ||||
c_insert(el, (int)(oldc - cp)); | c_insert(el, (int)(oldc - cp)); | ||||
for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) | for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) | ||||
*dp++ = *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; | ||||
} | } | ||||
/* em_inc_search_next(): | /* em_inc_search_next(): | ||||
* Emacs incremental next search | * Emacs incremental next search | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_inc_search_next(EditLine *el, wint_t c __attribute__((__unused__))) | em_inc_search_next(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
el->el_search.patlen = 0; | el->el_search.patlen = 0; | ||||
return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); | return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); | ||||
} | } | ||||
/* em_inc_search_prev(): | /* em_inc_search_prev(): | ||||
* Emacs incremental reverse search | * Emacs incremental reverse search | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_inc_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) | em_inc_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
el->el_search.patlen = 0; | el->el_search.patlen = 0; | ||||
return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); | return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); | ||||
} | } | ||||
/* em_delete_prev_char(): | /* em_delete_prev_char(): | ||||
* Delete the character to the left of the cursor | * Delete the character to the left of the cursor | ||||
* [^?] | * [^?] | ||||
*/ | */ | ||||
protected el_action_t | libedit_private el_action_t | ||||
/*ARGSUSED*/ | /*ARGSUSED*/ | ||||
em_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) | em_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||
{ | { | ||||
if (el->el_line.cursor <= el->el_line.buffer) | if (el->el_line.cursor <= el->el_line.buffer) | ||||
return CC_ERROR; | return CC_ERROR; | ||||
if (el->el_state.doingarg) | if (el->el_state.doingarg) | ||||
c_delbefore(el, el->el_state.argument); | c_delbefore(el, el->el_state.argument); | ||||
else | else | ||||
c_delbefore1(el); | c_delbefore1(el); | ||||
el->el_line.cursor -= el->el_state.argument; | el->el_line.cursor -= el->el_state.argument; | ||||
if (el->el_line.cursor < el->el_line.buffer) | if (el->el_line.cursor < el->el_line.buffer) | ||||
el->el_line.cursor = el->el_line.buffer; | el->el_line.cursor = el->el_line.buffer; | ||||
return CC_REFRESH; | return CC_REFRESH; | ||||
} | } |