From 63d5e65100c5345cf8df70ee3e751efc0198c0b9 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 25 Feb 2025 10:18:31 -0500 Subject: [PATCH] Handle cpython builds with `libedit` for `readline` Since `uv`'s cpython distributions are built this way `pdbp`'s tab completion was breaking (as was vi-mode). This adds a new `.devx._enable_readline_feats()` import hook which checks for the appropriate library and applies settings accordingly. --- tractor/devx/__init__.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tractor/devx/__init__.py b/tractor/devx/__init__.py index bb6791a..928f80c 100644 --- a/tractor/devx/__init__.py +++ b/tractor/devx/__init__.py @@ -41,3 +41,38 @@ from .pformat import ( pformat_caller_frame as pformat_caller_frame, pformat_boxed_tb as pformat_boxed_tb, ) + + +def _enable_readline_feats() -> str: + ''' + Handle `readline` when compiled with `libedit` to avoid breaking + tab completion in `pdbp` (and its dep `tabcompleter`) + particularly since `uv` cpython distis are compiled this way.. + + See docs for deats, + https://docs.python.org/3/library/readline.html#module-readline + + Originally discovered soln via SO answer, + https://stackoverflow.com/q/49287102 + + ''' + import readline + if ( + # 3.13+ attr + # https://docs.python.org/3/library/readline.html#readline.backend + (getattr(readline, 'backend', False) == 'libedit') + or + 'libedit' in readline.__doc__ + ): + readline.parse_and_bind("python:bind -v") + readline.parse_and_bind("python:bind ^I rl_complete") + return 'libedit' + else: + readline.parse_and_bind("tab: complete") + readline.parse_and_bind("set editing-mode vi") + readline.parse_and_bind("set keymap vi") + return 'readline' + + +# TODO, move this to a new `.devx._pdbp` mod? +_enable_readline_feats()