如果使用颜色提示,如何修复 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_IGNORE 和 RL_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) 问题而来到这里,那么请看这里:
其中一些问题现已在维护得更好的 repo 中得到修复:
https://github.com/pyreadline3/pyreadline3/【讨论】:
以上是关于如果使用颜色提示,如何修复 Python readline 中的列计算的主要内容,如果未能解决你的问题,请参考以下文章