Skip to content

Commit

Permalink
bpo-13631: Fix the order of initialization for readline libedit on ma…
Browse files Browse the repository at this point in the history
…cOS. (GH-6915) (GH-6928)

The editline emulation needs to be initialized *after* the name is
defined. This fixes the long open issue.
(cherry picked from commit c2f082e)

Co-authored-by: Zvezdan Petkovic <zpetkovic@acm.org>
  • Loading branch information
2 people authored and ned-deily committed May 17, 2018
1 parent 9c17cd3 commit d504108
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 8 deletions.
22 changes: 15 additions & 7 deletions Doc/library/readline.rst
Expand Up @@ -17,24 +17,32 @@ made using this module affect the behaviour of both the interpreter's
interactive prompt and the prompts offered by the built-in :func:`input`
function.

Readline keybindings may be configured via an initialization file, typically
``.inputrc`` in your home directory. See `Readline Init File
<https://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC9>`_
in the GNU Readline manual for information about the format and
allowable constructs of that file, and the capabilities of the
Readline library in general.

.. note::

The underlying Readline library API may be implemented by
the ``libedit`` library instead of GNU readline.
On MacOS X the :mod:`readline` module detects which library is being used
On macOS the :mod:`readline` module detects which library is being used
at run time.

The configuration file for ``libedit`` is different from that
of GNU readline. If you programmatically load configuration strings
you can check for the text "libedit" in :const:`readline.__doc__`
to differentiate between GNU readline and libedit.

Readline keybindings may be configured via an initialization file, typically
``.inputrc`` in your home directory. See `Readline Init File
<https://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC9>`_
in the GNU Readline manual for information about the format and
allowable constructs of that file, and the capabilities of the
Readline library in general.
If you use *editline*/``libedit`` readline emulation on macOS, the
initialization file located in your home directory is named
``.editrc``. For example, the following content in ``~/.editrc`` will
turn ON *vi* keybindings and TAB completion::

python:bind -v
python:bind ^I rl_complete


Init file
Expand Down
2 changes: 2 additions & 0 deletions Doc/tools/susp-ignored.csv
Expand Up @@ -187,6 +187,8 @@ library/profile,,:lineno,filename:lineno(function)
library/pyexpat,,:elem1,<py:elem1 />
library/pyexpat,,:py,"xmlns:py = ""http://www.python.org/ns/"">"
library/random,,:len,new_diff = mean(combined[:len(drug)]) - mean(combined[len(drug):])
library/readline,,:bind,"python:bind -v"
library/readline,,:bind,"python:bind ^I rl_complete"
library/smtplib,,:port,method must support that as well as a regular host:port
library/socket,,::,'5aef:2b::8'
library/socket,,:can,"return (can_id, can_dlc, data[:can_dlc])"
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Expand Up @@ -1225,6 +1225,7 @@ Gabriel de Perthuis
Tim Peters
Benjamin Peterson
Joe Peterson
Zvezdan Petkovic
Ulrich Petri
Chris Petrilli
Roumen Petrov
Expand Down
@@ -0,0 +1,2 @@
The .editrc file in user's home directory is now processed correctly during
the readline initialization through editline emulation on macOS.
4 changes: 3 additions & 1 deletion Modules/readline.c
Expand Up @@ -1078,6 +1078,9 @@ setup_readline(readlinestate *mod_state)
Py_FatalError("not enough memory to save locale");
#endif

/* The name must be defined before initialization */
rl_readline_name = "python";

#ifdef __APPLE__
/* the libedit readline emulation resets key bindings etc
* when calling rl_initialize. So call it upfront
Expand All @@ -1099,7 +1102,6 @@ setup_readline(readlinestate *mod_state)

using_history();

rl_readline_name = "python";
/* Force rebind of TAB to insert-tab */
rl_bind_key('\t', rl_insert);
/* Bind both ESC-TAB and ESC-ESC to the completion function */
Expand Down

0 comments on commit d504108

Please sign in to comment.