From c2f082e9d164acfa8f96de9526f0f47ae92c426a Mon Sep 17 00:00:00 2001 From: Zvezdan Petkovic Date: Thu, 17 May 2018 02:45:10 -0400 Subject: bpo-13631: Fix the order of initialization for readline libedit on macOS. (GH-6915) The editline emulation needs to be initialized *after* the name is defined. This fixes the long open issue. --- Doc/library/readline.rst | 22 +++++++++++++++------- Doc/tools/susp-ignored.csv | 2 ++ Misc/ACKS | 1 + .../macOS/2018-05-16-13-25-58.bpo-13631.UIjDyY.rst | 2 ++ Modules/readline.c | 4 +++- 5 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2018-05-16-13-25-58.bpo-13631.UIjDyY.rst diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 837816e..16c28cf 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -17,11 +17,18 @@ 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 +`_ +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 @@ -29,12 +36,13 @@ function. 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 -`_ -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 diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index cfdd526..33cd48f 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -187,6 +187,8 @@ library/profile,,:lineno,filename:lineno(function) library/pyexpat,,: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])" diff --git a/Misc/ACKS b/Misc/ACKS index 5c05ee7..b1f1e8a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1229,6 +1229,7 @@ Gabriel de Perthuis Tim Peters Benjamin Peterson Joe Peterson +Zvezdan Petkovic Ulrich Petri Chris Petrilli Roumen Petrov diff --git a/Misc/NEWS.d/next/macOS/2018-05-16-13-25-58.bpo-13631.UIjDyY.rst b/Misc/NEWS.d/next/macOS/2018-05-16-13-25-58.bpo-13631.UIjDyY.rst new file mode 100644 index 0000000..d9d505e --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2018-05-16-13-25-58.bpo-13631.UIjDyY.rst @@ -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. diff --git a/Modules/readline.c b/Modules/readline.c index 811fca8..7756e6b 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -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 @@ -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 */ -- cgit v0.12