如果使用颜色提示,如何修复 Python readline 中的列计算

Posted

技术标签:

【中文标题】如果使用颜色提示,如何修复 Python readline 中的列计算【英文标题】:How to fix column calculation in Python readline if using color prompt 【发布时间】:2012-03-17 03:03:46 【问题描述】:

我使用标准技巧来定制交互式 Python 会话:

$ 猫 ~/.bashrc 导出 PYTHONSTARTUP=~/.pystartup $ 猫 ~/.pystartup 导入操作系统 导入系统 进口 atexit 导入读取线 导入 rlcompleter historyPath = os.path.expanduser("~/.pyhistory") def save_history(historyPath=historyPath): 导入读取线 readline.write_history_file(historyPath) 如果 os.path.exists(historyPath): readline.read_history_file(historyPath) term_with_colors = ['xterm', 'xterm-color', 'xterm-256color', 'linux', 'screen', 'screen-256color', 'screen-bce'] 如果 os.environ.get('TERM') 在 term_with_colors: 绿色='\033[32m' 红色='\033[31m' 重置='\033[0m' sys.ps1 = 红色 + '>>> ' + 重置 sys.ps2 = 绿色 + '...' + 重置 del term_with_colors atexit.register(save_history) del os、sys、atexit、readline、rlcompleter、save_history、historyPath

现在我得到了上下文相关的完成和颜色提示。

问题来自颜色提示 - 当我在交互式 Python 会话中调用 history-search-backward(通过按 UP)时,Readline 会考虑终端转义序列,所以光标位置计算错误,文字显示错误。

在 Bash 手册页中,这个问题被提及并通过特殊标记修复:

\[ 开始一系列非打印字符, 可用于嵌入 终端控制序列进入提示 \] 结束一系列非打印字符

如何解决 Python 提示的这个问题?

【问题讨论】:

【参考方案1】:

我打开info readline发现:

-- 函数:int rl_expand_prompt (char *prompt) 展开 PROMPT 中的任何特殊字符序列并设置 本地 Readline 提示重新显示变量。这个功能是 由“readline()”调用。也可以调用它来扩展 如果 `rl_on_new_line_with_prompt()' 函数或 使用了“rl_already_prompted”变量。它返回的数量 (可能是多行)最后一行的可见字符 迅速的。应用程序可能会指示提示包含 显示时不占用物理屏幕空间的字符 用特殊标记将这些字符的序列括起来 `RL_PROMPT_START_IGNORE' 和 `RL_PROMPT_END_IGNORE'(在 `readline.h'。这可用于嵌入特定于终端的转义 提示中的序列。

按照文字提示,我在 readline.h 中搜索了 RL_PROMPT_START_IGNORERL_PROMPT_END_IGNORE 定义,然后找到了下一个:

/* 可供 readline 客户端使用的定义。 */ #define RL_PROMPT_START_IGNORE '\001' #define RL_PROMPT_END_IGNORE '\002'

所以我对我的 ~/.pystartup 进行了适当的更改:

绿色='\001\033[32m\002' 红色='\001\033[31m\002' 重置='\001\033[0m\002'

现在一切正常!!!

【讨论】:

readline 开发源码可以在here找到。【参考方案2】:

为了获得更好的 python shell 体验,我建议您使用 ipython 或 bpython。

【讨论】:

+1。 bpython 是个好东西! django ./manage.py 控制台怎么样?我的解决方案还可以在 django 交互式会话中完成,如何使用 bpython 来实现这个目的? @gavenkoa 查看core.managment.commands.shell,我看到如果ipython 失败,则使用bpython。如果两者都安装了,您仍然可以编辑该文件并重新排序 shells 类属性,以便在 ipython 之前尝试 bpython【参考方案3】:

如果你是因为最近在 Win10 中出现Python 3.10+ REPL (CLI) 问题而来到这里,那么请看这里:

https://github.com/pyreadline/pyreadline/issues/73 Change Python interactive prompt ">>>"

其中一些问题现已在维护得更好的 repo 中得到修复:

https://github.com/pyreadline3/pyreadline3/

【讨论】:

以上是关于如果使用颜色提示,如何修复 Python readline 中的列计算的主要内容,如果未能解决你的问题,请参考以下文章

7read的使用和while循环

在卸载(修复)python时出现错误?

如何在python中以管理员模式打开命令提示符?

win10 werfault.exe 内存不能read 修复

在三个JS和NPM中更改纹理颜色或应用颜色提示

如何使用工具提示格式化程序并仍然显示图表颜色(就像默认情况下一样)?