2012-02-27 6 views
17

que utilizan puntas estándar para la personalización de la sesión interactiva de Python:Mira cómo solucionar cálculo de la columna en Python readline si pronta utilización del color

 
    $ 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='\033[32m' 
    red='\033[31m' 
    reset='\033[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 

ahora consigo la terminación sensible al contexto y rápido de color.

problema viene desde el indicador de color - cuando invoco historia de búsqueda hacia atrás (pulsando UP) en la sesión de Python interactiva Readline tomar en secuencias de escape terminales acount, por lo que la posición del cursor se calculó erróneamente y fue representada erróneamente el texto .

En la página de manual de bash este problema mencionado y se fija mediante marcadores especiales:

 
    \[  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 

Cómo solucionar este problema para Python pedirá?

Respuesta

25

puedo abrir información readline y encontrado:

 
-- 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. 

Como dicen texto busco RL_PROMPT_START_IGNORE y RL_PROMPT_END_IGNORE definición en readline.h y hallaron a continuación:

 
/* Definitions available for use by readline clients. */ 
#define RL_PROMPT_START_IGNORE '\001' 
#define RL_PROMPT_END_IGNORE '\002' 

Así que puse los cambios apropiados en mi ~ /.pystartup:

 
    green='\001\033[32m\002' 
    red='\001\033[31m\002' 
    reset='\001\033[0m\002' 

y ahora todo el trabajo bien !!!

4

Para una mejor experiencia de shell Python, te recomiendo que uses ya sea ipython o bpython.

+0

+1. ¡bpython es una gran cosa! ¿Qué hay de la consola django **./Manage.py **? Mi solución también permite completarla en la sesión interactiva de django, ¿cómo usar bpython para este propósito? – gavenkoa

+1

@gavenkoa En cuanto a [core.managment.commands.shell] (https://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py), veo que si 'ipython 'falla,' bpython' se usa. Si tiene ambos instalados, puede editar ese archivo y reordenar el atributo de clase 'shells' para que' bpython' se intente antes de 'ipython'. – jcollado

+0

Gracias por compartir knowladge – gavenkoa

Cuestiones relacionadas