]> granicus.if.org Git - python/commitdiff
Issue #16182: set_pre_input_hook() may not exist; document, and update test
authorMartin Panter <vadmium+py@gmail.com>
Tue, 14 Jun 2016 08:45:43 +0000 (08:45 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Tue, 14 Jun 2016 08:45:43 +0000 (08:45 +0000)
Doc/library/readline.rst
Lib/test/test_readline.py

index e17e69c1835a22c5b08914ea794b38cadc63a57a..4d3c099ed225adaa4671ade89a82f55bda5bbe23 100644 (file)
@@ -104,7 +104,9 @@ The following functions operate on a history file:
 
    Append the last *nelements* items of history to a file.  The default filename is
    :file:`~/.history`.  The file must already exist.  This calls
-   :c:func:`append_history` in the underlying library.
+   :c:func:`append_history` in the underlying library.  This function
+   only exists if Python was compiled for a version of the library
+   that supports it.
 
    .. versionadded:: 3.5
 
@@ -185,7 +187,8 @@ Startup hooks
    be used as the new hook function; if omitted or ``None``, any
    function already installed is removed.  The hook is called
    with no arguments after the first prompt has been printed and just before
-   readline starts reading input characters.
+   readline starts reading input characters.  This function only exists
+   if Python was compiled for a version of the library that supports it.
 
 
 Completion
index 51e136c43a15301fa8d1304ab00c5b311811f436..b59b6b0c6fffe87dd1b08e09354b75c7bb9c6c00 100644 (file)
@@ -129,24 +129,32 @@ class TestReadline(unittest.TestCase):
 
         script = r"""import readline
 
-if readline.__doc__ and "libedit" in readline.__doc__:
-    readline.parse_and_bind(r'bind ^B ed-prev-char')
-    readline.parse_and_bind(r'bind "\t" rl_complete')
+is_editline = readline.__doc__ and "libedit" in readline.__doc__
+inserted = "[\xEFnserted]"
+macro = "|t\xEB[after]"
+set_pre_input_hook = getattr(readline, "set_pre_input_hook", None)
+if is_editline or not set_pre_input_hook:
     # The insert_line() call via pre_input_hook() does nothing with Editline,
     # so include the extra text that would have been inserted here
-    readline.parse_and_bind('bind -s ^A "[\xEFnserted]|t\xEB[after]"')
+    macro = inserted + macro
+
+if is_editline:
+    readline.parse_and_bind(r'bind ^B ed-prev-char')
+    readline.parse_and_bind(r'bind "\t" rl_complete')
+    readline.parse_and_bind(r'bind -s ^A "{}"'.format(macro))
 else:
     readline.parse_and_bind(r'Control-b: backward-char')
     readline.parse_and_bind(r'"\t": complete')
     readline.parse_and_bind(r'set disable-completion off')
     readline.parse_and_bind(r'set show-all-if-ambiguous off')
     readline.parse_and_bind(r'set show-all-if-unmodified off')
-    readline.parse_and_bind('Control-a: "|t\xEB[after]"')
+    readline.parse_and_bind(r'Control-a: "{}"'.format(macro))
 
 def pre_input_hook():
-    readline.insert_text("[\xEFnserted]")
+    readline.insert_text(inserted)
     readline.redisplay()
-readline.set_pre_input_hook(pre_input_hook)
+if set_pre_input_hook:
+    set_pre_input_hook(pre_input_hook)
 
 def completer(text, state):
     if text == "t\xEB":