modify readline so it adjusts internal variables when the locale changes between calls to readline()

This commit is contained in:
Chet Ramey
2022-08-15 12:32:00 -04:00
parent 0142068628
commit b9ed20acfd
24 changed files with 4908 additions and 4758 deletions
+8 -2
View File
@@ -6,9 +6,9 @@
.\" Case Western Reserve University
.\" chet.ramey@case.edu
.\"
.\" Last Change: Fri Mar 11 10:14:10 EST 2022
.\" Last Change: Fri Aug 12 11:12:23 EDT 2022
.\"
.TH READLINE 3 "2022 March 11" "GNU Readline 8.2"
.TH READLINE 3 "2022 August 12" "GNU Readline 8.2"
.\"
.\" File Name macro. This used to be `.PN', for Path Name,
.\" but Sun doesn't seem to like that very much.
@@ -445,6 +445,8 @@ 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.
This variable is dependent on the \fBLC_CTYPE\fP locale category, and
may change if the locale is changed.
.TP
.B disable\-completion (Off)
If set to \fBOn\fP, readline will inhibit word completion. Completion
@@ -538,6 +540,8 @@ regardless of what the terminal claims it can support. The name
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.
This variable is dependent on the \fBLC_CTYPE\fP locale category, and
may change if the locale is changed.
.TP
.B isearch\-terminators (``C\-[ C\-J'')
The string of characters that should terminate an incremental
@@ -601,6 +605,8 @@ 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.
This variable is dependent on the \fBLC_CTYPE\fP locale category, and
may change if the locale is changed.
.TP
.B page\-completions (On)
If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
+8 -1
View File
@@ -536,9 +536,12 @@ 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}, but
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.
This variable is dependent on the @code{LC_CTYPE} locale category, and
may change if the locale is changed.
@item disable-completion
@vindex disable-completion
@@ -649,6 +652,8 @@ regardless of what the terminal claims it can support. The
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.
This variable is dependent on the @code{LC_CTYPE} locale category, and
may change if the locale is changed.
@item isearch-terminators
@vindex isearch-terminators
@@ -731,6 +736,8 @@ eighth bit set directly rather than as a meta-prefixed escape
sequence.
The default is @samp{off}, but Readline will set it to @samp{on} if the
locale contains eight-bit characters.
This variable is dependent on the @code{LC_CTYPE} locale category, and
may change if the locale is changed.
@item page-completions
@vindex page-completions
+3 -3
View File
@@ -5,7 +5,7 @@ Copyright (C) 1988-2022 Free Software Foundation, Inc.
@set EDITION 8.2
@set VERSION 8.2
@set UPDATED 11 March 2022
@set UPDATED-MONTH March 2022
@set UPDATED 12 August 2022
@set UPDATED-MONTH August 2022
@set LASTCHANGE Fri Mar 11 10:13:51 EST 2022
@set LASTCHANGE Fri Aug 12 11:10:50 EDT 2022
+69 -16
View File
@@ -57,6 +57,9 @@
static int utf8locale (char *);
#define RL_DEFAULT_LOCALE "C"
static char *_rl_current_locale = 0;
#if !defined (HAVE_SETLOCALE)
/* A list of legal values for the LANG or LC_CTYPE environment variables.
If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
@@ -132,50 +135,61 @@ _rl_init_locale (void)
that doesn't return anything, we set lspec to the empty string to
force the subsequent call to setlocale() to define the `native'
environment. */
#if defined (HAVE_SETLOCALE)
if (lspec == 0 || *lspec == 0)
lspec = setlocale (LC_CTYPE, (char *)NULL);
if (lspec == 0)
lspec = "";
ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */
#else
ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
#endif
_rl_utf8locale = (ret && *ret) ? utf8locale (ret) : 0;
_rl_current_locale = savestring (ret);
return ret;
}
/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
to decide the defaults for 8-bit character input and output. Returns
1 if we set eight-bit mode. */
int
_rl_init_eightbit (void)
{
/* If we have setlocale(3), just check the current LC_CTYPE category
value, and go into eight-bit mode if it's not C or POSIX. */
value (passed as LOCALESTR), and go into eight-bit mode if it's not "C"
or "POSIX". If FORCE is non-zero, we reset the locale variables to values
appropriate for the C locale if the locale is "C" or "POSIX". FORCE is 0
when this is called from _rl_init_eightbit, since we're modifying the
default initial values and don't need to change anything else. If we
don't have setlocale(3), we check the codeset portion of LOCALESTR against
a set of known values and go into eight-bit mode if it matches one of those.
Returns 1 if we set eight-bit (multibyte) mode. */
static int
_rl_set_localevars (char *localestr, int force)
{
#if defined (HAVE_SETLOCALE)
char *lspec, *t;
t = _rl_init_locale (); /* returns static pointer */
if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
if (localestr && *localestr && (localestr[0] != 'C' || localestr[1]) && (STREQ (localestr, "POSIX") == 0))
{
_rl_meta_flag = 1;
_rl_convert_meta_chars_to_ascii = 0;
_rl_output_meta_chars = 1;
return (1);
}
else if (force)
{
/* Default "C" locale settings. */
_rl_meta_flag = 0;
_rl_convert_meta_chars_to_ascii = 1;
_rl_output_meta_chars = 0;
return (0);
}
else
return (0);
#else /* !HAVE_SETLOCALE */
char *lspec, *t;
char *t;
int i;
/* We don't have setlocale. Finesse it. Check the environment for the
appropriate variables and set eight-bit mode if they have the right
values. */
lspec = _rl_get_locale_var ("LC_CTYPE");
if (lspec == 0 || (t = normalize_codeset (lspec)) == 0)
if (localestr == 0 || (t = normalize_codeset (localestr)) == 0)
return (0);
for (i = 0; t && legal_lang_values[i]; i++)
if (STREQ (t, legal_lang_values[i]))
@@ -186,6 +200,14 @@ _rl_init_eightbit (void)
break;
}
if (force && legal_lang_values[i] == 0) /* didn't find it */
{
/* Default "C" locale settings. */
_rl_meta_flag = 0;
_rl_convert_meta_chars_to_ascii = 1;
_rl_output_meta_chars = 0;
}
_rl_utf8locale = *t ? STREQ (t, "utf8") : 0;
xfree (t);
@@ -193,6 +215,21 @@ _rl_init_eightbit (void)
#endif /* !HAVE_SETLOCALE */
}
/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
to decide the defaults for 8-bit character input and output. Returns
1 if we set eight-bit mode. */
int
_rl_init_eightbit (void)
{
char *t, *ol;
ol = _rl_current_locale;
t = _rl_init_locale (); /* resets _rl_current_locale, returns static pointer */
xfree (ol);
return (_rl_set_localevars (t, 0));
}
#if !defined (HAVE_SETLOCALE)
static char *
normalize_codeset (char *codeset)
@@ -289,3 +326,19 @@ find_codeset (char *name, size_t *lenp)
return result;
}
void
_rl_reset_locale (void)
{
char *ol, *nl;
/* This should not be NULL; _rl_init_eightbit sets it on the first call to
readline() or rl_initialize(). */
ol = _rl_current_locale;
nl = _rl_init_locale (); /* resets _rl_current_locale */
if ((ol == 0 && nl) || (ol && nl && (STREQ (ol, nl) == 0)))
(void)_rl_set_localevars (nl, 1);
xfree (ol);
}
+1 -1
View File
@@ -1186,7 +1186,7 @@ rl_initialize (void)
RL_SETSTATE(RL_STATE_INITIALIZED);
}
else
(void)_rl_init_locale (); /* check current locale */
_rl_reset_locale (); /* check current locale and set locale variables */
/* Initialize the current line information. */
_rl_init_line_state ();
+1
View File
@@ -364,6 +364,7 @@ extern void _rl_revert_all_lines (void);
/* nls.c */
extern char *_rl_init_locale (void);
extern int _rl_init_eightbit (void);
extern void _rl_reset_locale (void);
/* parens.c */
extern void _rl_enable_paren_matching (int);