Add search-history-up and search-history-down keybindings (both unbound

by default) to the Emacs command line editing mode; patch originally by
James Butler <sweetnavelorange@gmail.com> but slightly modified

10x
This commit is contained in:
tg 2009-05-16 14:19:23 +00:00
parent eb3f3d584f
commit 747cc12184
4 changed files with 65 additions and 9 deletions

View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.272 2009/04/22 16:43:18 tg Exp $
# $MirOS: src/bin/mksh/check.t,v 1.273 2009/05/16 14:19:20 tg Exp $
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
@ -7,7 +7,7 @@
# http://www.research.att.com/~gsf/public/ifs.sh
expected-stdout:
@(#)MIRBSD KSH R37 2009/04/07
@(#)MIRBSD KSH R37 2009/05/16
description:
Check version of shell.
stdin:

41
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.160 2009/04/07 18:41:33 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.161 2009/05/16 14:19:21 tg Exp $");
/* tty driver characters we are interested in */
typedef struct {
@ -1036,6 +1036,7 @@ static void x_zotc2(int);
static void x_zotc3(char **);
static void x_load_hist(char **);
static int x_search(char *, int, int);
static int x_search_dir(int);
static int x_match(char *, char *);
static void x_redraw(int);
static void x_push(int);
@ -1114,6 +1115,8 @@ static void bind_if_not_bound(int, int, int);
#define XFUNC_comment 53
#define XFUNC_version 54
#define XFUNC_edit_line 55
#define XFUNC_search_hist_up 56
#define XFUNC_search_hist_down 57
/* XFUNC_* must be < 128 */
@ -1173,6 +1176,8 @@ static int x_set_arg(int);
static int x_comment(int);
static int x_version(int);
static int x_edit_line(int);
static int x_search_hist_up(int);
static int x_search_hist_down(int);
static const struct x_ftab x_ftab[] = {
{ x_abort, "abort", 0 },
@ -1231,6 +1236,8 @@ static const struct x_ftab x_ftab[] = {
{ x_comment, "comment", 0 },
{ x_version, "version", 0 },
{ x_edit_line, "edit-line", XF_ARG },
{ x_search_hist_up, "search-history-up", 0 },
{ x_search_hist_down, "search-history-down", 0 },
{ 0, NULL, 0 }
};
@ -2157,6 +2164,38 @@ x_search(char *pat, int sameline, int offset)
return -1;
}
/* anchored search up from current line */
static int
x_search_hist_up(int c __unused)
{
return (x_search_dir(-1));
}
/* anchored search down from current line */
static int
x_search_hist_down(int c __unused)
{
return (x_search_dir(1));
}
/* anchored search in the indicated direction */
static int
x_search_dir(int search_dir /* should've been bool */)
{
char **hp = x_histp + search_dir;
size_t curs = xcp - xbuf;
while (histptr >= hp && hp >= history) {
if (strncmp(xbuf, *hp, curs) == 0) {
x_load_hist(hp);
x_goto(xbuf + curs);
break;
}
hp += search_dir;
}
return (KSTD);
}
/* return position of first match of pattern in string, else -1 */
static int
x_match(char *str, char *pat)

25
mksh.1
View File

@ -1,4 +1,4 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.159 2009/05/16 14:17:39 tg Exp $
.\" $MirOS: src/bin/mksh/mksh.1,v 1.160 2009/05/16 14:19:22 tg Exp $
.\" $OpenBSD: ksh.1,v 1.128 2009/03/06 12:28:36 jmc Exp $
.\"-
.\" Try to make GNU groff and AT&T nroff more compatible
@ -4723,7 +4723,8 @@ Each input line originally starts just after the last entry
in the history buffer, so
.Ic down\-history
is not useful until either
.Ic search\-history
.Ic search\-history ,
.Ic search\-history\-up
or
.Ic up\-history
has been performed.
@ -4822,9 +4823,10 @@ The current cursor position may be anywhere on the line.
Causes the current input line to be processed by the shell, and the next line
from history becomes the current line.
This is only useful after an
.Ic up\-history
.Ic up\-history ,
.Ic search\-history
or
.Ic search\-history .
.Ic search\-history\-up .
.It no\-op: QUIT
This does nothing.
.It prefix\-1: \*(ha[
@ -4883,6 +4885,21 @@ commands continue searching backward to the next previous occurrence of the
pattern.
The history buffer retains only a finite number of lines; the oldest
are discarded as necessary.
.It search\-history\-up: (not bound)
Search backwards through the history buffer for commands whose beginning match
the portion of the input line before the cursor.
When used on an empty line, this has the same effect as
.Ic up\-history .
.It search\-history\-down: (not bound)
Search forwards through the history buffer for commands whose beginning match
the portion of the input line before the cursor.
When used on an empty line, this has the same effect as
.Ic down\-history .
This is only useful after an
.Ic up\-history ,
.Ic search\-history
or
.Ic search\-history\-up .
.It set\-mark\-command: \*(ha[ Ns Aq space
Set the mark at the cursor position.
.It transpose\-chars: \*(haT

4
sh.h
View File

@ -102,9 +102,9 @@
#define __SCCSID(x) __IDSTRING(sccsid,x)
#ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.293 2009/04/07 19:43:28 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.294 2009/05/16 14:19:23 tg Exp $");
#endif
#define MKSH_VERSION "R37 2009/04/07"
#define MKSH_VERSION "R37 2009/05/16"
#ifndef MKSH_INCLUDES_ONLY