Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Doc/library/readline.rst
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,15 @@ Startup hooks
if Python was compiled for a version of the library that supports it.


.. function:: get_pre_input_hook()

Get the current pre-input hook function, or ``None`` if no pre-input hook
function has been set. This function only exists if Python was compiled
for a version of the library that supports it.

.. versionadded:: next


.. _readline-completion:

Completion
Expand Down
18 changes: 18 additions & 0 deletions Lib/test/test_readline.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,24 @@ def test_write_read_limited_history(self):
# So, we've only tested that the read did not fail.
# See TestHistoryManipulation for the full test.

@unittest.skipUnless(hasattr(readline, "get_pre_input_hook"),
"get_pre_input_hook not available")
def test_get_pre_input_hook(self):
# Save and restore the original hook to avoid side effects
original_hook = readline.get_pre_input_hook()
self.addCleanup(readline.set_pre_input_hook, original_hook)

# Test that get_pre_input_hook returns None when no hook is set
readline.set_pre_input_hook(None)
self.assertIsNone(readline.get_pre_input_hook())

# Set a hook and verify we can retrieve it
def my_hook():
pass

readline.set_pre_input_hook(my_hook)
self.assertIs(readline.get_pre_input_hook(), my_hook)


@unittest.skipUnless(support.Py_GIL_DISABLED, 'these tests can only possibly fail with GIL disabled')
class FreeThreadingTest(unittest.TestCase):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Add :func:`readline.get_pre_input_hook` function to retrieve the current
pre-input hook. This allows applications to save and restore the hook
without overwriting user settings. Patch by Sanyam Khurana.
28 changes: 27 additions & 1 deletion Modules/clinic/readline.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions Modules/readline.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,26 @@ readline_set_pre_input_hook_impl(PyObject *module, PyObject *function)
return set_hook("pre_input_hook", &state->pre_input_hook,
function);
}

/* Get pre-input hook */

/*[clinic input]
readline.get_pre_input_hook

Get the current pre-input hook function.
[clinic start generated code]*/

static PyObject *
readline_get_pre_input_hook_impl(PyObject *module)
/*[clinic end generated code: output=ad56b77a8e8981ca input=fb1e1b1fbd94e4e5]*/
{
readlinestate *state = get_readline_state(module);
if (state->pre_input_hook == NULL) {
Py_RETURN_NONE;
}
return Py_NewRef(state->pre_input_hook);
}

#endif


Expand Down Expand Up @@ -1074,6 +1094,7 @@ static struct PyMethodDef readline_methods[] =
READLINE_SET_STARTUP_HOOK_METHODDEF
#ifdef HAVE_RL_PRE_INPUT_HOOK
READLINE_SET_PRE_INPUT_HOOK_METHODDEF
READLINE_GET_PRE_INPUT_HOOK_METHODDEF
#endif
#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
READLINE_CLEAR_HISTORY_METHODDEF
Expand Down
Loading