Look how to fix column calculation in Python readline if use color prompt
I use standard tips for customizing interactive Python session:
$ cat ~/.bashrc export PYTHONSTARTUP=~/.pystartup $ cat ~/.pystartup import os import sys import atexit import readline import rlcompleter historyPath = os.path.expanduser("~/.pyhistory") def save_history(historyPath=historyPath): import readline readline.write_history_file(historyPath) if os.path.exists(historyPath): readline.read_history_file(historyPath) term_with_colors = ['xterm', 'xterm-color', 'xterm-256color', 'linux', 'screen', 'screen-256color', 'screen-bce'] if os.environ.get('TERM') in term_with_colors: green=' 33[32m' red=' 33[31m' reset=' 33[0m' sys.ps1 = red + '>>> ' + reset sys.ps2 = green + '... ' + reset del term_with_colors atexit.register(save_history) del os, sys, atexit, readline, rlcompleter, save_history, historyPath
Now I get context sensitive completion and color prompt.
Problem come from color prompt - when I invoke history-search-backward (by pressing UP) in interactive Python session Readline take in acount terminal escape sequences, so cursor position was wrongly calculated and text was wrongly displayed.
In Bash man page this problem mentioned and fixed by special markers:
[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt ] end a sequence of non-printing characters
How to fix this issue for Python prompt?
I open info readline and found:
-- Function: int rl_expand_prompt (char *prompt) Expand any special character sequences in PROMPT and set up the local Readline prompt redisplay variables. This function is called by `readline()'. It may also be called to expand the primary prompt if the `rl_on_new_line_with_prompt()' function or `rl_already_prompted' variable is used. It returns the number of visible characters on the last line of the (possibly multi-line) prompt. Applications may indicate that the prompt contains characters that take up no physical screen space when displayed by bracketing a sequence of such characters with the special markers `RL_PROMPT_START_IGNORE' and `RL_PROMPT_END_IGNORE' (declared in `readline.h'. This may be used to embed terminal-specific escape sequences in prompts.
As say text I search for RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE definition in readline.h and found next:
/* Definitions available for use by readline clients. */ #define RL_PROMPT_START_IGNORE ' 01' #define RL_PROMPT_END_IGNORE ' 02'
So I put appropriate changes to my ~/.pystartup :
green=' 01 33[32m 02' red=' 01 33[31m 02' reset=' 01 33[0m 02'
and now all work fine!!!
为了获得更好的python shell体验,我建议你使用ipython或者bpython。
链接地址: http://www.djcxy.com/p/83156.html