readline 被 ANSI 转义序列混淆

TAH*_*TAH 5 python bash ansi-escape

我正在编写一个 Python 脚本,有时需要用户输入输入。我在 macOS Sierra 上使用 bash。

为了接收输入,我写了以下内容:

import readline  # gnureadline 6.3.8

START = '\033[91m\033[1m'
END = '\033[0m'

response = raw_input(START + 'Enter text: ' + END)
Run Code Online (Sandbox Code Playgroud)

START我在和中使用 ANSI 转义序列END来直观地区分脚本的提示符和用户的文本输入。

不幸的是,一旦我开始输入文本,程序就会丢失用户输入文本的实际开头位置。下面的第一克拉是CTRLA现在映射到的位置,第二克拉是CTRLE我要去的地方。箭头键同样认为用户输入的开始和结束是偏移的,如图所示。

Enter text: hello my name is             
                         ^               ^  
Run Code Online (Sandbox Code Playgroud)

我尝试了一些方法来调试这个。

  1. 我尝试在提示和文本输入之间添加换行符,但这只会使偏移量变得更糟。

  2. 如果我使用箭头键而不使用诸如CTRLACTRLE、 选项箭头之类的东西来浏览字符串,那么这将按预期工作。也就是说,考虑到用户输入的字符串的长度和复杂性,仅使用箭头键在字符串中移动对于用户来说将是痛苦的。

  3. 最重要的是,如果我根本不使用STARTand ,这会完美地工作。END也就是说,脚本的可用性下降了——很难从完整版本的脚本中的所有其他文本中找出提示。

是否有一些技巧可以让我能够使用 ANSI 转义序列来格式化提示,而不会影响用户使用CTRLACTRLE和选项箭头进行导航的能力?

ndm*_*iri 0

将提示和要求输入分开打印到两个命令中。

Python 3.x

print(START + 'Enter text: ' + END, end='')
response = input()
Run Code Online (Sandbox Code Playgroud)

Python 2.x

import sys

# Use sys.stdout.write to avoid printing a trailing newline.
sys.stdout.write(START + 'Enter text: ' + END)
response = raw_input()
Run Code Online (Sandbox Code Playgroud)