summaryrefslogtreecommitdiffstats
path: root/contrib/less/cmdbuf.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2012-06-26 23:17:33 +0000
committerdelphij <delphij@FreeBSD.org>2012-06-26 23:17:33 +0000
commit922d40fed4b7f6bb0aafe327600825f9680ce0e7 (patch)
tree1acc67942c59e279c426e0a72ee0ad94cb0ed3ba /contrib/less/cmdbuf.c
parentbd43c5e6d640101f1bd6cca7e83586ae41e1a065 (diff)
downloadFreeBSD-src-922d40fed4b7f6bb0aafe327600825f9680ce0e7.zip
FreeBSD-src-922d40fed4b7f6bb0aafe327600825f9680ce0e7.tar.gz
MFV: less v449.
Diffstat (limited to 'contrib/less/cmdbuf.c')
-rw-r--r--contrib/less/cmdbuf.c83
1 files changed, 57 insertions, 26 deletions
diff --git a/contrib/less/cmdbuf.c b/contrib/less/cmdbuf.c
index 74a74ff..804a032 100644
--- a/contrib/less/cmdbuf.c
+++ b/contrib/less/cmdbuf.c
@@ -1,12 +1,11 @@
-/*
- * Copyright (C) 1984-2011 Mark Nudelman
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Less License, as specified in the README file.
- *
- * For more information about less, or for information on how to
- * contact the author, see the README file.
- */
+/*
+ * Copyright (C) 1984-2012 Mark Nudelman
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Less License, as specified in the README file.
+ *
+ * For more information, see the README file.
+ */
/*
@@ -30,6 +29,7 @@ static int prompt_col; /* Column of cursor just after prompt */
static char *cp; /* Pointer into cmdbuf */
static int cmd_offset; /* Index into cmdbuf of first displayed char */
static int literal; /* Next input char should not be interpreted */
+static int updown_match = -1; /* Prefix length in up/down movement */
#if TAB_COMPLETE_FILENAME
static int cmd_complete();
@@ -122,6 +122,7 @@ cmd_reset()
cmd_offset = 0;
literal = 0;
cmd_mbc_buf_len = 0;
+ updown_match = -1;
}
/*
@@ -132,6 +133,7 @@ clear_cmd()
{
cmd_col = prompt_col = 0;
cmd_mbc_buf_len = 0;
+ updown_match = -1;
}
/*
@@ -504,6 +506,7 @@ cmd_ichar(cs, clen)
/*
* Reprint the tail of the line from the inserted char.
*/
+ updown_match = -1;
cmd_repaint(cp);
cmd_right();
return (CC_OK);
@@ -547,6 +550,7 @@ cmd_erase()
/*
* Repaint the buffer after the erased char.
*/
+ updown_match = -1;
cmd_repaint(cp);
/*
@@ -643,6 +647,7 @@ cmd_kill()
cmd_offset = 0;
cmd_home();
*cp = '\0';
+ updown_match = -1;
cmd_repaint(cp);
/*
@@ -675,12 +680,15 @@ set_mlist(mlist, cmdflags)
#if CMD_HISTORY
/*
* Move up or down in the currently selected command history list.
+ * Only consider entries whose first updown_match chars are equal to
+ * cmdbuf's corresponding chars.
*/
static int
cmd_updown(action)
int action;
{
char *s;
+ struct mlist *ml;
if (curr_mlist == NULL)
{
@@ -690,24 +698,47 @@ cmd_updown(action)
bell();
return (CC_OK);
}
- cmd_home();
- clear_eol();
+
+ if (updown_match < 0)
+ {
+ updown_match = cp - cmdbuf;
+ }
+
/*
- * Move curr_mp to the next/prev entry.
+ * Find the next history entry which matches.
*/
- if (action == EC_UP)
- curr_mlist->curr_mp = curr_mlist->curr_mp->prev;
- else
- curr_mlist->curr_mp = curr_mlist->curr_mp->next;
+ for (ml = curr_mlist->curr_mp;;)
+ {
+ ml = (action == EC_UP) ? ml->prev : ml->next;
+ if (ml == curr_mlist)
+ {
+ /*
+ * We reached the end (or beginning) of the list.
+ */
+ break;
+ }
+ if (strncmp(cmdbuf, ml->string, updown_match) == 0)
+ {
+ /*
+ * This entry matches; stop here.
+ * Copy the entry into cmdbuf and echo it on the screen.
+ */
+ curr_mlist->curr_mp = ml;
+ s = ml->string;
+ if (s == NULL)
+ s = "";
+ strcpy(cmdbuf, s);
+ cmd_home();
+ clear_eol();
+ for (cp = cmdbuf; *cp != '\0'; )
+ cmd_right();
+ return (CC_OK);
+ }
+ }
/*
- * Copy the entry into cmdbuf and echo it on the screen.
+ * We didn't find a history entry that matches.
*/
- s = curr_mlist->curr_mp->string;
- if (s == NULL)
- s = "";
- strcpy(cmdbuf, s);
- for (cp = cmdbuf; *cp != '\0'; )
- cmd_right();
+ bell();
return (CC_OK);
}
#endif
@@ -1457,9 +1488,6 @@ save_cmdhist()
FILE *f;
int modified = 0;
- filename = histfile_name();
- if (filename == NULL)
- return;
if (mlist_search.modified)
modified = 1;
#if SHELL_ESCAPE || PIPEC
@@ -1468,6 +1496,9 @@ save_cmdhist()
#endif
if (!modified)
return;
+ filename = histfile_name();
+ if (filename == NULL)
+ return;
f = fopen(filename, "w");
free(filename);
if (f == NULL)
OpenPOWER on IntegriCloud