mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-08-07 02:32:27 +02:00
modify readline so it adjusts internal variables when the locale changes between calls to readline()
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user