我正在编写一个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)
我正在使用ANSI转义序列在START
和END
来区分脚本提示和用户文本输入的视觉效果。
不幸的是,一旦我开始输入文本,程序就会失去跟踪用户输入文本开头位置的功能。下面的第一个尖角符号是现在CTRLA映射到的位置,第二个尖角符号是CTRLE带我到的位置。箭头键同样认为用户输入的开头和结尾有偏移,如所示。
Enter text: hello my name is
^ ^
我尝试了几种方法来调试这个问题。
我尝试在提示和文本输入之间加入一个换行符,但这只会使偏移更严重。
如果我仅使用箭头键而不使用像CTRLA、CTRLE、选项-箭头等导航字符串的功能,那么这将按预期工作。尽管如此,考虑到用户输入的字符串的长度和复杂性,仅使用箭头键来移动字符串对于用户来说将是痛苦的。
最重要的是,如果我根本不使用
START
和END
,这将完美地工作。尽管如此,脚本的可用性会降低——在完整版本的脚本中,很难从所有其他文本中挑选出提示。
有没有什么诀窍让我能够使用ANSI转义序列格式化提示,而不会影响用户使用CTRLA、CTRLE和选项-箭头进行导航的能力?
print(START + '输入文本:' + END, end='')
然后response = raw_input()
会怎样呢?我现在无法尝试,只是一个想法。 - ndmeiri$PS1
样式标记非打印序列的\[
和\]
?顺便说一句,最好使用tput
来获取可移植终端代码 - 并非每个终端都是VT220! - Toby Speight\[
和\]
是特定于提示符的,但它们表示 Readline 通常使用的\001
和\002
(如果我没记错的话)。 - chepnerReadline
是否相关取决于您运行脚本的环境。Python本身并没有使用它。 - chepner