summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2016-07-12 21:50:11 -0400
committerChet Ramey <chet.ramey@case.edu>2016-07-12 21:50:11 -0400
commit4e554b68943268418bd66828ed663731ba6154d7 (patch)
treef3c3bd4449829be737f563c301d118a65588c4a6
parent1a756901a2224cce5e121adf1671962e06a5e8d1 (diff)
readline-7.0 beta2 distributionreadline-7.0-beta2
-rw-r--r--CHANGES29
-rw-r--r--CHANGES-7.028
-rw-r--r--complete.c29
-rw-r--r--display.c92
-rw-r--r--doc/readline.322
-rw-r--r--doc/rltech.texi42
-rw-r--r--doc/rluser.texi27
-rw-r--r--doc/version.texi6
-rw-r--r--examples/Makefile.in2
-rw-r--r--examples/hist_erasedups.c2
-rw-r--r--examples/hist_purgecmd.c2
-rw-r--r--examples/rl-callbacktest.c27
-rw-r--r--examples/rlptytest.c8
-rw-r--r--funmap.c3
-rw-r--r--histexpand.c32
-rw-r--r--histlib.h3
-rw-r--r--misc.c2
-rw-r--r--readline.c2
-rw-r--r--readline.h4
-rw-r--r--rltty.c20
-rw-r--r--text.c2
-rw-r--r--tilde.c6
-rw-r--r--vi_keymap.c6
-rw-r--r--vi_mode.c58
24 files changed, 369 insertions, 85 deletions
diff --git a/CHANGES b/CHANGES
index 266cd53..4006145 100644
--- a/CHANGES
+++ b/CHANGES
@@ -97,6 +97,15 @@ ff. Fixed a bug in the character insertion code that attempts to optimize
typeahead when it reads a character that is not bound to self-insert and
resets the key sequence state.
+gg. When refreshing the line as the result of a key sequence, Readline attempts
+ to redraw only the last line of a multiline prompt.
+
+hh. Fixed an issue that caused completion of git commands to display
+ incorrectly when using colored-completion-prefix.
+
+ii. Fixed several redisplay bugs having to do with multibyte characters and
+ invisible characters in prompt strings.
+
2. New Features in Readline
a. The history truncation code now uses the same error recovery mechansim as
@@ -142,6 +151,26 @@ k. If readline reads a history file that begins with `#' (or the value of
l. Readline now throws an error if it parses a key binding without a terminating
`:' or whitespace.
+m. The default binding for ^W in vi mode now uses word boundaries specified
+ by Posix (vi-unix-word-rubout is bindable command name).
+
+n. rl_clear_visible_line: new application-callable function; clears all
+ screen lines occupied by the current visible readline line.
+
+o. rl_tty_set_echoing: application-callable function that controls whether
+ or not readline thinks it is echoing terminal output.
+
+p. Handle >| and strings of digits preceding and following redirection
+ specifications as single tokens when tokenizing the line for history
+ expansion.
+
+q. Fixed a bug with displaying completions when the prefix display length
+ is greater than the length of the completions to be displayed.
+
+r. The :p history modifier now applies to the entire line, so any expansion
+ specifying :p causes the line to be printed instead of expanded.
+
+
-------------------------------------------------------------------------------
This document details the changes between this version, readline-6.3, and the
previous version, readline-6.2.
diff --git a/CHANGES-7.0 b/CHANGES-7.0
index 7d2868d..561b079 100644
--- a/CHANGES-7.0
+++ b/CHANGES-7.0
@@ -97,6 +97,15 @@ ff. Fixed a bug in the character insertion code that attempts to optimize
typeahead when it reads a character that is not bound to self-insert and
resets the key sequence state.
+gg. When refreshing the line as the result of a key sequence, Readline attempts
+ to redraw only the last line of a multiline prompt.
+
+hh. Fixed an issue that caused completion of git commands to display
+ incorrectly when using colored-completion-prefix.
+
+ii. Fixed several redisplay bugs having to do with multibyte characters and
+ invisible characters in prompt strings.
+
2. New Features in Readline
a. The history truncation code now uses the same error recovery mechansim as
@@ -141,3 +150,22 @@ k. If readline reads a history file that begins with `#' (or the value of
l. Readline now throws an error if it parses a key binding without a terminating
`:' or whitespace.
+
+m. The default binding for ^W in vi mode now uses word boundaries specified
+ by Posix (vi-unix-word-rubout is bindable command name).
+
+n. rl_clear_visible_line: new application-callable function; clears all
+ screen lines occupied by the current visible readline line.
+
+o. rl_tty_set_echoing: application-callable function that controls whether
+ or not readline thinks it is echoing terminal output.
+
+p. Handle >| and strings of digits preceding and following redirection
+ specifications as single tokens when tokenizing the line for history
+ expansion.
+
+q. Fixed a bug with displaying completions when the prefix display length
+ is greater than the length of the completions to be displayed.
+
+r. The :p history modifier now applies to the entire line, so any expansion
+ specifying :p causes the line to be printed instead of expanded.
diff --git a/complete.c b/complete.c
index d0bbe7d..0a81129 100644
--- a/complete.c
+++ b/complete.c
@@ -214,7 +214,7 @@ int _rl_colored_stats = 0;
/* Non-zero means to use a color (currently magenta) to indicate the common
prefix of a set of possible word completions. */
-int _rl_colored_completion_prefix = 1;
+int _rl_colored_completion_prefix = 0;
#endif
/* If non-zero, when completing in the middle of a word, don't insert
@@ -807,7 +807,7 @@ fnprint (to_print, prefix_bytes, real_pathname)
{
int printed_len, w;
const char *s;
- int common_prefix_len;
+ int common_prefix_len, print_len;
#if defined (HANDLE_MULTIBYTE)
mbstate_t ps;
const char *end;
@@ -815,7 +815,8 @@ fnprint (to_print, prefix_bytes, real_pathname)
int width;
wchar_t wc;
- end = to_print + strlen (to_print) + 1;
+ print_len = strlen (to_print);
+ end = to_print + print_len + 1;
memset (&ps, 0, sizeof (mbstate_t));
#endif
@@ -825,7 +826,7 @@ fnprint (to_print, prefix_bytes, real_pathname)
possible completions. Only cut off prefix_bytes if we're going to be
printing the ellipsis, which takes precedence over coloring the
completion prefix (see print_filename() below). */
- if (_rl_completion_prefix_display_length > 0 && to_print[prefix_bytes] == '\0')
+ if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len)
prefix_bytes = 0;
#if defined (COLOR_SUPPORT)
@@ -1571,9 +1572,12 @@ rl_display_match_list (matches, len, max)
if (_rl_completion_prefix_display_length > 0)
{
t = printable_part (matches[0]);
- temp = strrchr (t, '/'); /* check again in case of /usr/src/ */
+ /* check again in case of /usr/src/ */
+ temp = rl_filename_completion_desired ? strrchr (t, '/') : 0;
common_length = temp ? fnwidth (temp) : fnwidth (t);
sind = temp ? strlen (temp) : strlen (t);
+ if (common_length > max || sind > max)
+ common_length = sind = 0;
if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN)
max -= common_length - ELLIPSIS_LEN;
@@ -1584,9 +1588,11 @@ rl_display_match_list (matches, len, max)
else if (_rl_colored_completion_prefix > 0)
{
t = printable_part (matches[0]);
- temp = strrchr (t, '/');
+ temp = rl_filename_completion_desired ? strrchr (t, '/') : 0;
common_length = temp ? fnwidth (temp) : fnwidth (t);
sind = temp ? RL_STRLEN (temp+1) : RL_STRLEN (t); /* want portion after final slash */
+ if (common_length > max || sind > max)
+ common_length = sind = 0;
}
#endif
@@ -1635,8 +1641,13 @@ rl_display_match_list (matches, len, max)
printed_len = print_filename (temp, matches[l], sind);
if (j + 1 < limit)
- for (k = 0; k < max - printed_len; k++)
- putc (' ', rl_outstream);
+ {
+ if (max <= printed_len)
+ putc (' ', rl_outstream);
+ else
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
}
l += count;
}
@@ -1683,6 +1694,8 @@ rl_display_match_list (matches, len, max)
return;
}
}
+ else if (max <= printed_len)
+ putc (' ', rl_outstream);
else
for (k = 0; k < max - printed_len; k++)
putc (' ', rl_outstream);
diff --git a/display.c b/display.c
index f261933..cd9b89f 100644
--- a/display.c
+++ b/display.c
@@ -826,7 +826,7 @@ rl_redisplay ()
lpos -= _rl_col_width (local_prompt, n0, num, 1) - wadjust;
else
#endif
- lpos -= _rl_screenwidth - wadjust;
+ lpos -= _rl_screenwidth; /* all physical cursor positions */
}
prompt_last_screen_line = newlines;
@@ -1389,6 +1389,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
int current_invis_chars;
int col_lendiff, col_temp;
int bytes_to_insert;
+ int mb_cur_max = MB_CUR_MAX;
#if defined (HANDLE_MULTIBYTE)
mbstate_t ps_new, ps_old;
int new_offset, old_offset;
@@ -1399,7 +1400,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
the exact cursor position and cut-and-paste with certain terminal
emulators. In this calculation, TEMP is the physical screen
position of the cursor. */
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
temp = _rl_last_c_pos;
else
temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
@@ -1407,7 +1408,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
&& _rl_last_v_pos == current_line - 1)
{
#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
wchar_t wc;
mbstate_t ps;
@@ -1421,7 +1422,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
_rl_clear_to_eol (line_state_visible->wrapped_line[current_line]);
memset (&ps, 0, sizeof (mbstate_t));
- ret = mbrtowc (&wc, new, MB_CUR_MAX, &ps);
+ ret = mbrtowc (&wc, new, mb_cur_max, &ps);
if (MB_INVALIDCH (ret))
{
tempwidth = 1;
@@ -1441,7 +1442,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
_rl_last_c_pos = tempwidth;
_rl_last_v_pos++;
memset (&ps, 0, sizeof (mbstate_t));
- ret = mbrtowc (&wc, old, MB_CUR_MAX, &ps);
+ ret = mbrtowc (&wc, old, mb_cur_max, &ps);
if (ret != 0 && bytes != 0)
{
if (MB_INVALIDCH (ret))
@@ -1480,7 +1481,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* Find first difference. */
#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
/* See if the old line is a subset of the new line, so that the
only change is adding characters. */
@@ -1537,7 +1538,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
return;
#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_utf8locale)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0 && _rl_utf8locale)
{
wchar_t wc;
mbstate_t ps = { 0 };
@@ -1546,7 +1547,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* If the first character in the difference is a zero-width character,
assume it's a combining character and back one up so the two base
characters no longer compare equivalently. */
- t = mbrtowc (&wc, ofd, MB_CUR_MAX, &ps);
+ t = mbrtowc (&wc, ofd, mb_cur_max, &ps);
if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0)
{
old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY);
@@ -1560,7 +1561,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
wsatend = 1; /* flag for trailing whitespace */
#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY);
nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY);
@@ -1618,14 +1619,14 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
{
if (*ols) /* don't step past the NUL */
{
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY);
else
ols++;
}
if (*nls)
{
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY);
else
nls++;
@@ -1642,7 +1643,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
visible_wrap_offset based on what we know. */
if (current_line == 0)
visible_wrap_offset = prompt_invis_chars_first_line; /* XXX */
- if ((MB_CUR_MAX == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset)
+ if ((mb_cur_max == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset)
_rl_last_c_pos += visible_wrap_offset;
}
@@ -1687,7 +1688,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (modmark)
_rl_output_some_chars ("*", 1);
_rl_output_some_chars (local_prompt, lendiff);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
/* We take wrap_offset into account here so we can pass correct
information to _rl_move_cursor_relative. */
@@ -1723,7 +1724,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (temp > 0)
{
_rl_output_some_chars (nfd, temp);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
_rl_last_c_pos += _rl_col_width (new, nd, ne - new, 1);
else
_rl_last_c_pos += temp;
@@ -1746,7 +1747,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* We need to indicate that the cursor position is correct in the presence of
invisible characters in the prompt string. Let's see if setting this when
we make sure we're at the end of the drawn prompt string works. */
- if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 &&
+ if (current_line == 0 && mb_cur_max > 1 && rl_byte_oriented == 0 &&
(_rl_last_c_pos > 0 || o_cpos > 0) &&
_rl_last_c_pos == prompt_physical_chars)
cpos_adjusted = 1;
@@ -1757,7 +1758,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
col_lendiff == difference on screen (columns)
When not using multibyte characters, these are equal */
lendiff = (nls - nfd) - (ols - ofd);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
col_lendiff = _rl_col_width (new, nfd - new, nls - new, 1) - _rl_col_width (old, ofd - old, ols - old, 1);
else
col_lendiff = lendiff;
@@ -1768,7 +1769,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
current_invis_chars != visible_wrap_offset)
{
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
lendiff += visible_wrap_offset - current_invis_chars;
col_lendiff += visible_wrap_offset - current_invis_chars;
@@ -1786,7 +1787,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
and writes TEMP bytes. */
/* Insert (diff (len (old), len (new)) ch. */
temp = ne - nfd;
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
col_temp = _rl_col_width (new, nfd - new, ne - new, 1);
else
col_temp = temp;
@@ -1837,7 +1838,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
_rl_last_c_pos == 0 &&
lendiff > prompt_visible_length &&
current_invis_chars > 0) == 0) &&
- (((MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+ (((mb_cur_max > 1 && rl_byte_oriented == 0) &&
current_line == 0 && wrap_offset &&
((nfd - new) <= prompt_last_invisible) &&
(col_lendiff < prompt_visible_length)) == 0) &&
@@ -1845,12 +1846,12 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
{
open_some_spaces (col_lendiff);
_rl_output_some_chars (nfd, bytes_to_insert);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
_rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1);
else
_rl_last_c_pos += bytes_to_insert;
}
- else if ((MB_CUR_MAX == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0)
+ else if ((mb_cur_max == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0)
{
/* At the end of a line the characters do not have to
be "inserted". They can just be placed on the screen. */
@@ -1865,7 +1866,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* If nfd begins before the last invisible character in the
prompt, adjust _rl_last_c_pos to account for wrap_offset
and set cpos_adjusted to let the caller know. */
- if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
{
_rl_last_c_pos -= wrap_offset;
cpos_adjusted = 1;
@@ -1878,7 +1879,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* If nfd begins before the last invisible character in the
prompt, adjust _rl_last_c_pos to account for wrap_offset
and set cpos_adjusted to let the caller know. */
- if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) && current_line == 0 && displaying_prompt_first_line && wrap_offset && ((nfd - new) <= prompt_last_invisible))
{
_rl_last_c_pos -= wrap_offset;
cpos_adjusted = 1;
@@ -1898,7 +1899,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
crude attempt to compute how far into the new line buffer we are.
It doesn't work well in the face of multibyte characters and needs
to be rethought. XXX */
- if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+ if ((mb_cur_max > 1 && rl_byte_oriented == 0) &&
current_line == prompt_last_screen_line && wrap_offset &&
displaying_prompt_first_line &&
wrap_offset != prompt_invis_chars_first_line &&
@@ -1942,7 +1943,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
in a multibyte locale to account for the wrap offset and
set cpos_adjusted accordingly. */
_rl_output_some_chars (nfd, bytes_to_insert);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
_rl_last_c_pos += _rl_col_width (nfd, 0, bytes_to_insert, 1);
if (current_line == 0 && wrap_offset &&
@@ -1977,7 +1978,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
set cpos_adjusted accordingly. */
_rl_output_some_chars (nfd, temp);
_rl_last_c_pos += col_temp; /* XXX */
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
if (current_line == 0 && wrap_offset &&
displaying_prompt_first_line &&
@@ -1991,7 +1992,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
}
clear_rest_of_line:
lendiff = (oe - old) - (ne - new);
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1);
else
col_lendiff = lendiff;
@@ -2001,7 +2002,7 @@ clear_rest_of_line:
space_to_eol will insert too many spaces. XXX - maybe we should
adjust col_lendiff based on the difference between _rl_last_c_pos
and _rl_screenwidth */
- if (col_lendiff && ((MB_CUR_MAX == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth)))
+ if (col_lendiff && ((mb_cur_max == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth)))
{
if (_rl_term_autowrap && current_line < inv_botlin)
space_to_eol (col_lendiff);
@@ -2027,6 +2028,34 @@ rl_on_new_line ()
return 0;
}
+/* Clear all screen lines occupied by the current readline line buffer
+ (visible line) */
+int
+rl_clear_visible_line ()
+{
+ int curr_line;
+
+ /* Make sure we move to column 0 so we clear the entire line */
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+ _rl_last_c_pos = 0;
+
+ /* Move to the last screen line of the current visible line */
+ _rl_move_vert (_rl_vis_botlin);
+
+ /* And erase screen lines going up to line 0 (first visible line) */
+ for (curr_line = _rl_last_v_pos; curr_line >= 0; curr_line--)
+ {
+ _rl_move_vert (curr_line);
+ _rl_clear_to_eol (0);
+ }
+
+ return 0;
+}
+
/* Tell the update routines that we have moved onto a new line with the
prompt already displayed. Code originally from the version of readline
distributed with CLISP. rl_expand_prompt must have already been called
@@ -2133,6 +2162,7 @@ _rl_move_cursor_relative (new, data)
int cpos, dpos; /* current and desired cursor positions */
int adjust;
int in_invisline;
+ int mb_cur_max = MB_CUR_MAX;
woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
cpos = _rl_last_c_pos;
@@ -2146,7 +2176,7 @@ _rl_move_cursor_relative (new, data)
this case, NEW's display position is not obvious and must be
calculated. We need to account for invisible characters in this line,
as long as we are past them and they are counted by _rl_col_width. */
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
adjust = 1;
/* Try to short-circuit common cases and eliminate a bunch of multibyte
@@ -2214,7 +2244,7 @@ _rl_move_cursor_relative (new, data)
of moving backwards. */
/* i == current physical cursor position. */
#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
i = _rl_last_c_pos;
else
#endif
@@ -2249,7 +2279,7 @@ _rl_move_cursor_relative (new, data)
in the buffer and we have to go back to the beginning of the screen
line. In this case, we can use the terminal sequence to move forward
if it's available. */
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ if (mb_cur_max > 1 && rl_byte_oriented == 0)
{
if (_rl_term_forward_char)
{
diff --git a/doc/readline.3 b/doc/readline.3
index 765c8fa..b57f00b 100644
--- a/doc/readline.3
+++ b/doc/readline.3
@@ -6,9 +6,9 @@
.\" Case Western Reserve University
.\" chet.ramey@case.edu
.\"
-.\" Last Change: Wed Nov 19 18:32:58 EST 2014
+.\" Last Change: Sun Feb 28 15:42:34 EST 2016
.\"
-.TH READLINE 3 "2014 November 19" "GNU Readline 6.3"
+.TH READLINE 3 "2016 February 28" "GNU Readline 7.0"
.\"
.\" File Name macro. This used to be `.PN', for Path Name,
.\" but Sun doesn't seem to like that very much.
@@ -416,12 +416,19 @@ If set to \fBOn\fP, readline will convert characters with the
eighth bit set to an ASCII key sequence
by stripping the eighth bit and prefixing it with an
escape character (in effect, using escape as the \fImeta prefix\fP).
+The default is \fIOn\fP, but readline will set it to \fIOff\fP if the
+locale contains eight-bit characters.
.TP
.B disable\-completion (Off)
If set to \fBOn\fP, readline will inhibit word completion. Completion
characters will be inserted into the line as if they had been
mapped to \fBself-insert\fP.
.TP
+.B echo\-control\-characters (On)
+When set to \fBOn\fP, on operating systems that indicate they support it,
+readline echoes a character corresponding to a signal generated from the
+keyboard.
+.TP
.B editing\-mode (emacs)
Controls whether readline begins with a set of key bindings similar
to \fIEmacs\fP or \fIvi\fP.
@@ -431,11 +438,6 @@ can be set to either
or
.BR vi .
.TP
-.B echo\-control\-characters (On)
-When set to \fBOn\fP, on operating systems that indicate they support it,
-readline echoes a character corresponding to a signal generated from the
-keyboard.
-.TP
.B enable\-bracketed\-paste (Off)
When set to \fBOn\fP, readline will configure the terminal in a way
that will enable it to insert each paste into the editing buffer as a
@@ -469,6 +471,8 @@ are saved.
If set to a value less than zero, the number of history entries is not
limited.
By default, the number of history entries is not limited.
+If an attempt is made to set \fIhistory\-size\fP to a non-numeric value,
+the maximum number of history entries will be set to 500.
.TP
.B horizontal\-scroll\-mode (Off)
When set to \fBOn\fP, makes readline use a single line for display,
@@ -481,6 +485,8 @@ it will not clear the eighth bit in the characters it reads),
regardless of what the terminal claims it can support. The name
.B meta\-flag
is a synonym for this variable.
+The default is \fIOff\fP, but readline will set it to \fIOn\fP if the
+locale contains eight-bit characters.
.TP
.B isearch\-terminators (``C\-[ C\-J'')
The string of characters that should terminate an incremental
@@ -551,6 +557,8 @@ the list.
If set to \fBOn\fP, readline will display characters with the
eighth bit set directly rather than as a meta-prefixed escape
sequence.
+The default is \fIOff\fP, but readline will set it to \fIOn\fP if the
+locale contains eight-bit characters.
.TP
.B page\-completions (On)
If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
diff --git a/doc/rltech.texi b/doc/rltech.texi
index cc985d5..0902852 100644
--- a/doc/rltech.texi
+++ b/doc/rltech.texi
@@ -963,6 +963,10 @@ redisplay.
It should be used after setting @var{rl_already_prompted}.
@end deftypefun
+@deftypefun int rl_clear_visible_line (void)
+Clear the screen lines corresponding to the current line's contents.
+@end deftypefun
+
@deftypefun int rl_reset_line_state (void)
Reset the display state to a clean state and redisplay the current line
starting on a new line.
@@ -1136,6 +1140,14 @@ that the terminal editing characters are bound to @code{rl_insert}.
The bindings are performed in @var{kmap}.
@end deftypefun
+@deftypefun int rl_tty_set_echoing (int value)
+Set Readline's idea of whether or not it is echoing output to its output
+stream (@var{rl_outstream}). If @var{value} is 0, Readline does not display
+output to @var{rl_outstream}; any other value enables output. The initial
+value is set when Readline initializes the terminal settings.
+This function returns the previous value.
+@end deftypefun
+
@deftypefun int rl_reset_terminal (const char *terminal_name)
Reinitialize Readline's idea of the terminal settings using
@var{terminal_name} as the terminal type (e.g., @code{vt100}).
@@ -1423,12 +1435,16 @@ It understands the EOF character or "exit" to exit the program.
@example
/* Standard include files. stdio.h is required. */
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
+#include <locale.h>
/* Used for select(2) */
#include <sys/types.h>
#include <sys/select.h>
+#include <signal.h>
+
#include <stdio.h>
/* Standard readline include files. */
@@ -1436,10 +1452,20 @@ It understands the EOF character or "exit" to exit the program.
#include <readline/history.h>
static void cb_linehandler (char *);
+static void sighandler (int);
int running;
+int sigwinch_received;
const char *prompt = "rltest$ ";
+/* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+static void
+sighandler (int sig)
+@{
+ sigwinch_received = 1;
+@}
+
/* Callback function called for each line when accept-line executed, EOF
seen, or EOF character read. This sets a flag and returns; it could
also call exit(3). */
@@ -1474,6 +1500,13 @@ main (int c, char **v)
fd_set fds;
int r;
+ /* Set the default locale values according to environment variables. */
+ setlocale (LC_ALL, "");
+
+ /* Handle window size changes when readline is not active and reading
+ characters. */
+ signal (SIGWINCH, sighandler);
+
/* Install the line handler. */
rl_callback_handler_install (prompt, cb_linehandler);
@@ -1488,12 +1521,19 @@ main (int c, char **v)
FD_SET (fileno (rl_instream), &fds);
r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
- if (r < 0)
+ if (r < 0 && errno != EINTR)
@{
perror ("rltest: select");
rl_callback_handler_remove ();
break;
@}
+ if (sigwinch_received)
+ @{
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ }@
+ if (r < 0)
+ continue;
if (FD_ISSET (fileno (rl_instream), &fds))
rl_callback_read_char ();
diff --git a/doc/rluser.texi b/doc/rluser.texi
index d8513c6..4c094c8 100644
--- a/doc/rluser.texi
+++ b/doc/rluser.texi
@@ -499,7 +499,9 @@ The default limit is @code{100}.
If set to @samp{on}, Readline will convert characters with the
eighth bit set to an @sc{ascii} key sequence by stripping the eighth
bit and prefixing an @key{ESC} character, converting them to a
-meta-prefixed key sequence. The default value is @samp{on}.
+meta-prefixed key sequence. The default value is @samp{on}, but
+will be set to @samp{off} if the locale is one that contains
+eight-bit characters.
@item disable-completion
@vindex disable-completion
@@ -507,6 +509,12 @@ If set to @samp{On}, Readline will inhibit word completion.
Completion characters will be inserted into the line as if they had
been mapped to @code{self-insert}. The default is @samp{off}.
+@item echo-control-characters
+@vindex echo-control-characters
+When set to @samp{on}, on operating systems that indicate they support it,
+readline echoes a character corresponding to a signal generated from the
+keyboard. The default is @samp{on}.
+
@item editing-mode
@vindex editing-mode
The @code{editing-mode} variable controls which default set of
@@ -525,12 +533,6 @@ non-printing characters, which can be used to embed a terminal control
sequence into the mode string.
The default is @samp{@@}.
-@item echo-control-characters
-@vindex echo-control-characters
-When set to @samp{on}, on operating systems that indicate they support it,
-readline echoes a character corresponding to a signal generated from the
-keyboard. The default is @samp{on}.
-
@item enable-bracketed-paste
@vindex enable-bracketed-paste
When set to @samp{On}, Readline will configure the terminal in a way
@@ -571,6 +573,8 @@ are saved.
If set to a value less than zero, the number of history entries is not
limited.
By default, the number of history entries is not limited.
+If an attempt is made to set @var{history-size} to a non-numeric value,
+the maximum number of history entries will be set to 500.
@item horizontal-scroll-mode
@vindex horizontal-scroll-mode
@@ -586,8 +590,9 @@ this variable is set to @samp{off}.
If set to @samp{on}, Readline will enable eight-bit input (it
will not clear the eighth bit in the characters it reads),
regardless of what the terminal claims it can support. The
-default value is @samp{off}. The name @code{meta-flag} is a
-synonym for this variable.
+default value is @samp{off}, but Readline will set it to @samp{on} if the
+locale contains eight-bit characters.
+The name @code{meta-flag} is a synonym for this variable.
@item isearch-terminators
@vindex isearch-terminators
@@ -666,7 +671,9 @@ the list. The default is @samp{off}.
@vindex output-meta
If set to @samp{on}, Readline will display characters with the
eighth bit set directly rather than as a meta-prefixed escape
-sequence. The default is @samp{off}.
+sequence.
+The default is @samp{off}, but Readline will set it to @samp{on} if the
+locale contains eight-bit characters.
@item page-completions
@vindex page-completions
diff --git a/doc/version.texi b/doc/version.texi
index 4baf924..766864a 100644
--- a/doc/version.texi
+++ b/doc/version.texi
@@ -4,7 +4,7 @@ Copyright (C) 1988-2016 Free Software Foundation, Inc.
@set EDITION 7.0
@set VERSION 7.0
-@set UPDATED 25 January 2016
-@set UPDATED-MONTH January 2016
+@set UPDATED 20 April 2016
+@set UPDATED-MONTH April 2016
-@set LASTCHANGE Mon Jan 25 10:08:41 EST 2016
+@set LASTCHANGE Wed Apr 20 13:32:48 PDT 2016
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 5723658..5094c6c 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -123,7 +123,7 @@ rl-callbacktest$(EXEEXT): rl-callbacktest.o $(READLINE_LIB)
$(CC) $(LDFLAGS) -o $@ rl-callbacktest.o $(READLINE_LIB) $(TERMCAP_LIB)
rlptytest$(EXEEXT): rlptytest.o $(READLINE_LIB)
- $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB) $(LIBUTIL)
rlversion$(EXEEXT): rlversion.o $(READLINE_LIB)
$(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB)
diff --git a/examples/hist_erasedups.c b/examples/hist_erasedups.c
index 02d617e..2ecee89 100644
--- a/examples/hist_erasedups.c
+++ b/examples/hist_erasedups.c
@@ -38,8 +38,6 @@
#define STREQN(a, b, n) ((n == 0) ? (1) \
: ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
-extern int history_offset;
-
static void
usage()
{
diff --git a/examples/hist_purgecmd.c b/examples/hist_purgecmd.c
index 94becd8..d836d14 100644
--- a/examples/hist_purgecmd.c
+++ b/examples/hist_purgecmd.c
@@ -41,8 +41,6 @@
#define STREQN(a, b, n) ((n == 0) ? (1) \
: ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
-extern int history_offset;
-
#define PURGE_REGEXP 0x01
static void
diff --git a/examples/rl-callbacktest.c b/examples/rl-callbacktest.c
index 0f00e57..3525ffd 100644
--- a/examples/rl-callbacktest.c
+++ b/examples/rl-callbacktest.c
@@ -2,11 +2,14 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <locale.h>
/* Used for select(2) */
#include <sys/types.h>
#include <sys/select.h>
+#include <signal.h>
+
#include <errno.h>
#include <stdio.h>
@@ -22,10 +25,19 @@
extern int errno;
static void cb_linehandler (char *);
+static void signandler (int);
-int running;
+int running, sigwinch_received;
const char *prompt = "rltest$ ";
+/* Handle SIGWINCH and window size changes when readline is not active and
+ reading a character. */
+static void
+sighandler (int sig)
+{
+ sigwinch_received = 1;
+}
+
/* Callback function called for each line when accept-line executed, EOF
seen, or EOF character read. This sets a flag and returns; it could
also call exit(3). */
@@ -60,6 +72,12 @@ main (int c, char **v)
fd_set fds;
int r;
+
+ setlocale (LC_ALL, "");
+
+ /* Handle SIGWINCH */
+ signal (SIGWINCH, sighandler);
+
/* Install the line handler. */
rl_callback_handler_install (prompt, cb_linehandler);
@@ -80,6 +98,13 @@ main (int c, char **v)
rl_callback_handler_remove ();
break;
}
+ if (sigwinch_received)
+ {
+ rl_resize_terminal ();
+ sigwinch_received = 0;
+ }
+ if (r < 0)
+ continue;
if (FD_ISSET (fileno (rl_instream), &fds))
rl_callback_read_char ();
diff --git a/examples/rlptytest.c b/examples/rlptytest.c
index 0699e86..9c42f8a 100644
--- a/examples/rlptytest.c
+++ b/examples/rlptytest.c
@@ -48,6 +48,13 @@ sigint (s)
exit (0);
}
+void
+sigwinch (s)
+ int s;
+{
+ rl_resize_terminal ();
+}
+
static int
user_input()
{
@@ -316,6 +323,7 @@ main()
if (val == -1)
return -1;
+ signal (SIGWINCH, sigwinch);
signal (SIGINT, sigint);
val = init_readline (slavefd, slavefd);
diff --git a/funmap.c b/funmap.c
index 21c12f5..34b1d6b 100644
--- a/funmap.c
+++ b/funmap.c
@@ -1,6 +1,6 @@
/* funmap.c -- attach names to functions. */
-/* Copyright (C) 1987-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2016 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library
for reading lines of text with interactive input and history editing.
@@ -194,6 +194,7 @@ static const FUNMAP default_funmap[] = {
{ "vi-set-mark", rl_vi_set_mark },
{ "vi-subst", rl_vi_subst },
{ "vi-tilde-expand", rl_vi_tilde_expand },
+ { "vi-unix-word-rubout", rl_vi_unix_word_rubout },
{ "vi-yank-arg", rl_vi_yank_arg },
{ "vi-yank-pop", rl_vi_yank_pop },
{ "vi-yank-to", rl_vi_yank_to },
diff --git a/histexpand.c b/histexpand.c
index fdecebc..46a99aa 100644
--- a/histexpand.c
+++ b/histexpand.c
@@ -1220,7 +1220,7 @@ history_expand (hstring, output)
ADD_STRING (temp);
xfree (temp);
}
- only_printing = r == 1;
+ only_printing += r == 1;
i = eindex;
}
break;
@@ -1421,7 +1421,7 @@ history_tokenize_word (string, ind)
const char *string;
int ind;
{
- register int i;
+ register int i, j;
int delimiter, nestdelim, delimopen;
i = ind;
@@ -1433,6 +1433,22 @@ history_tokenize_word (string, ind)
return i;
}
+ if (isdigit (string[i]))
+ {
+ j = i;
+ while (string[j] && isdigit (string[j]))
+ j++;
+ if (string[j] == 0)
+ return (j);
+ if (string[j] == '<' || string[j] == '>')
+ i = j; /* digit sequence is a file descriptor */
+ else
+ {
+ i = j;
+ goto get_word; /* digit sequence is part of a word */
+ }
+ }
+
if (member (string[i], "<>;&|$"))
{
int peek = string[i + 1];
@@ -1446,8 +1462,16 @@ history_tokenize_word (string, ind)
i += 2;
return i;
}
- else if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
- (peek == '>' && string[i] == '&'))
+ else if (peek == '&' && (string[i] == '>' || string[i] == '<'))
+ {
+ j = i + 2;
+ while (string[j] && isdigit (string[j])) /* file descriptor */
+ j++;
+ if (string[j] =='-') /* <&[digits]-, >&[digits]- */
+ j++;
+ return j;
+ }
+ else if ((peek == '>' && string[i] == '&') || (peek == '|' && string[i] == '>'))
{
i += 2;
return i;
diff --git a/histlib.h b/histlib.h
index c938a10..28cad14 100644
--- a/histlib.h
+++ b/histlib.h
@@ -76,7 +76,4 @@ extern char *strchr ();
#define HISTORY_APPEND 0
#define HISTORY_OVERWRITE 1
-/* Some variable definitions shared across history source files. */
-extern int history_offset;
-
#endif /* !_HISTLIB_H_ */
diff --git a/misc.c b/misc.c
index 4fc57e7..f7acdee 100644
--- a/misc.c
+++ b/misc.c
@@ -56,8 +56,6 @@
static int rl_digit_loop PARAMS((void));
static void _rl_history_set_point PARAMS((void));
-extern int history_offset;
-
/* Forward declarations used in this file */
void _rl_free_history_entry PARAMS((HIST_ENTRY *));
diff --git a/readline.c b/readline.c
index 547dd31..e51df4f 100644
--- a/readline.c
+++ b/readline.c
@@ -965,7 +965,7 @@ _rl_dispatch_subseq (key, map, got_subseq)
/* Tentative inter-character timeout for potential multi-key
sequences? If no input within timeout, abort sequence and
act as if we got non-matching input. */
- /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued[B
+ /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
takes microseconds, so multiply by 1000 */
if (_rl_keyseq_timeout > 0 &&
(RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
diff --git a/readline.h b/readline.h
index 3af93dd..0bd2e04 100644
--- a/readline.h
+++ b/readline.h
@@ -1,6 +1,6 @@
/* Readline.h -- the names of functions callable from within readline. */
-/* Copyright (C) 1987-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2016 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library
for reading lines of text with interactive input and history editing.
@@ -253,6 +253,7 @@ extern int rl_vi_yank_pop PARAMS((int, int));
extern int rl_vi_rubout PARAMS((int, int));
extern int rl_vi_delete PARAMS((int, int));
extern int rl_vi_back_to_indent PARAMS((int, int));
+extern int rl_vi_unix_word_rubout PARAMS((int, int));
extern int rl_vi_first_print PARAMS((int, int));
extern int rl_vi_char_search PARAMS((int, int));
extern int rl_vi_match PARAMS((int, int));
@@ -378,6 +379,7 @@ extern void rl_redisplay PARAMS((void));
extern int rl_on_new_line PARAMS((void));
extern int rl_on_new_line_with_prompt PARAMS((void));
extern int rl_forced_update_display PARAMS((void));
+extern int rl_clear_visible_line PARAMS((void));
extern int rl_clear_message PARAMS((void));
extern int rl_reset_line_state PARAMS((void));
extern int rl_crlf PARAMS((void));
diff --git a/rltty.c b/rltty.c
index 1cad8bc..b1c7929 100644
--- a/rltty.c
+++ b/rltty.c
@@ -1,7 +1,7 @@
/* rltty.c -- functions to prepare and restore the terminal for readline's
use. */
-/* Copyright (C) 1992-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2016 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library
for reading lines of text with interactive input and history editing.
@@ -714,6 +714,19 @@ rl_deprep_terminal ()
_rl_release_sigint ();
}
#endif /* !NO_TTY_DRIVER */
+
+/* Set readline's idea of whether or not it is echoing output to the terminal,
+ returning the old value. */
+int
+rl_tty_set_echoing (u)
+ int u;
+{
+ int o;
+
+ o = _rl_echoing_p;
+ _rl_echoing_p = u;
+ return o;
+}
/* **************************************************************** */
/* */
@@ -876,6 +889,11 @@ _rl_bind_tty_special_chars (kmap, ttybuff)
# endif /* VLNEXT && TERMIOS_TTY_DRIVER */
# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
+# if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ SET_SPECIAL (VWERASE, rl_vi_unix_word_rubout);
+ else
+# endif
SET_SPECIAL (VWERASE, rl_unix_word_rubout);
# endif /* VWERASE && TERMIOS_TTY_DRIVER */
}
diff --git a/text.c b/text.c
index d54499d..c353252 100644
--- a/text.c
+++ b/text.c
@@ -572,7 +572,7 @@ rl_refresh_line (ignore1, ignore2)
_rl_clear_to_eol (0); /* arg of 0 means to not use spaces */
- rl_forced_update_display ();
+ rl_redraw_prompt_last_line ();
rl_display_fixed = 1;
return 0;
diff --git a/tilde.c b/tilde.c
index 3788eba..95bc421 100644
--- a/tilde.c
+++ b/tilde.c
@@ -236,7 +236,11 @@ tilde_expand (string)
string += end;
expansion = tilde_expand_word (tilde_word);
- xfree (tilde_word);
+
+ if (expansion == 0)
+ expansion = tilde_word;
+ else
+ xfree (tilde_word);
len = strlen (expansion);
#ifdef __CYGWIN__
diff --git a/vi_keymap.c b/vi_keymap.c
index 60c925d..e5da2e0 100644
--- a/vi_keymap.c
+++ b/vi_keymap.c
@@ -1,6 +1,6 @@
/* vi_keymap.c -- the keymap for vi_mode in readline (). */
-/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2016 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library
for reading lines of text with interactive input and history editing.
@@ -55,7 +55,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, rl_transpose_chars }, /* Control-t */
{ ISFUNC, rl_unix_line_discard }, /* Control-u */
{ ISFUNC, rl_quoted_insert }, /* Control-v */
- { ISFUNC, rl_unix_word_rubout }, /* Control-w */
+ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */
{ ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */
{ ISFUNC, rl_yank }, /* Control-y */
{ ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */
@@ -334,7 +334,7 @@ KEYMAP_ENTRY_ARRAY vi_insertion_keymap = {
{ ISFUNC, rl_transpose_chars }, /* Control-t */
{ ISFUNC, rl_unix_line_discard }, /* Control-u */
{ ISFUNC, rl_quoted_insert }, /* Control-v */
- { ISFUNC, rl_unix_word_rubout }, /* Control-w */
+ { ISFUNC, rl_vi_unix_word_rubout }, /* Control-w */
{ ISFUNC, rl_insert }, /* Control-x */
{ ISFUNC, rl_yank }, /* Control-y */
{ ISFUNC, rl_insert }, /* Control-z */
diff --git a/vi_mode.c b/vi_mode.c
index 01ab830..56d2e72 100644
--- a/vi_mode.c
+++ b/vi_mode.c
@@ -1,7 +1,7 @@
/* vi_mode.c -- A vi emulation mode for Bash.
Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */
-/* Copyright (C) 1987-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2016 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library
for reading lines of text with interactive input and history editing.
@@ -1620,6 +1620,62 @@ rl_vi_delete (count, key)
return (0);
}
+/* This does what Posix specifies vi-mode C-w to do: using whitespace and
+ punctuation characters as the word boundaries. */
+
+#define vi_unix_word_boundary(c) (whitespace(c) || ispunct(c))
+
+int
+rl_vi_unix_word_rubout (count, key)
+ int count, key;
+{
+ int orig_point;
+
+ if (rl_point == 0)
+ rl_ding ();
+ else
+ {
+ orig_point = rl_point;
+ if (count <= 0)
+ count = 1;
+
+ while (count--)
+ {
+ /* This isn't quite what ksh93 does but it seems to match what the
+ Posix description of sh specifies, with a few accommodations
+ for sequences of whitespace characters between words and at
+ the end of the line. */
+
+ /* Skip over whitespace at the end of the line as a special case */
+ if (rl_point > 0 && (rl_line_buffer[rl_point] == 0) &&
+ whitespace (rl_line_buffer[rl_point - 1]))
+ while (--rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+ ;
+
+ /* If we're at the start of a word, move back to word boundary so we
+ move back to the `preceding' word */
+ if (rl_point > 0 && (vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0) &&
+ vi_unix_word_boundary (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ /* If we are at a word boundary (whitespace/punct), move backward
+ past a sequence of word boundary characters. If we are at the
+ end of a word (non-word boundary), move back to a word boundary */
+ if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]))
+ while (rl_point && vi_unix_word_boundary (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+ else if (rl_point > 0 && vi_unix_word_boundary (rl_line_buffer[rl_point]) == 0)
+ while (rl_point && (vi_unix_word_boundary (rl_line_buffer[rl_point - 1]) == 0))
+ rl_point--;
+ }
+
+ rl_kill_text (orig_point, rl_point);
+ }
+
+ return 0;
+}
+
+
int
rl_vi_back_to_indent (count, key)
int count, key;