2013-01-02 8 views
14

Mi piacerebbe personalizzare il colore del testo in IPython, ma non sono sicuro di come farlo.Come si personalizza il colore del testo in IPython?

so che in Python, posso fare questo, ponendo fine sys.ps1 e sys.ps2 con un codice colore ANSI come

sys.ps1=">>> \001\033[0m\033[34m\002" 

Ma l'approccio relativo, usando PromptManager.in_template, non funziona per IPython. Ad esempio

c = get_config() 
c.PromptManager.in_template = 'In [{count}] : {color.Blue}' 

non ha alcun effetto sul colore del testo dopo il prompt.

C'è un modo per cambiare il colore del testo in IPython?

risposta

7

Il prompt explicitly sets il colore dell'input a colors.in_normal. Se vuoi cambiare il colore di input, devi cambiare questo colore.

Purtroppo, gli schemi di colori personalizzati sono ancora nella lista delle cose da fare (dovrebbe essere piuttosto semplice, ma non una priorità elevata).

Un esempio un po 'hacker di quello che sembrano volere, cambiando il colore di ingresso e/o testo di output in un file di configurazione:

from IPython.utils import coloransi 
from IPython.core import prompts 

termcolors = coloransi.TermColors() # the color table 
# IPython's two color schemes: 
dark = prompts.PColLinux.colors 
light = prompts.PColLightBG.colors 

# colors.in_normal affects input code 
dark.in_normal = termcolors.Green 
light.in_normal = termcolors.Blue 
# colors.normal affects output 
dark.normal = light.normal = termcolors.Red 

Ciò impostarlo in modo che il colore del testo corrisponde al suggerimento , ma puoi ovviamente scegliere quello che vuoi.

+0

come potremmo farlo in Windows? Potrei mancare qualcosa, ma per la mia particolare installazione di iPython non ci sono prompt degli oggetti.PColLinux – Stephen

+2

Sto usando IPython 6.1.0 e non c'è anche 'prompts.PColLinux' o' prompts.PColLinuxBG'. Con questo aspetto, questo sottosistema è stato riscritto in (o vicino) IPython 5 e non riesco a trovare nulla di equivalente nelle ultime versioni, ancora. – meowsqueak

+0

@minrk scusa per la domanda stupida, ma dove dovremmo salvare quel config.py? – JinSnow

0

Attenzione: Questa risposta è compatibile solo con IPython5.5.0 e non sembra a tradurre bene con IPython6+. (thx @meowsqueak per il test rapido!)

A partire da IPython 5.5.0, è possibile ignorare qualsiasi colore di stile grazie allo ipython_config.py nella cartella del profilo targetted. (es .: ~/.ipython/profile_default per il profilo default su un'installazione tipica di Linux).

Il codice IPython è un bel problema legato alla colorazione e diversi metodi sono utilizzati per parser, debugger, shell interattiva. Alcune parti usano Pygments, altre forniscono un codice di escape ANSI limitato a una tavolozza di 16 colori.

La soluzione non è carina, ma funziona. Se ci sono altri modi più carini, per favore, dimmelo nel commento!

Si noti che la mia soluzione include anche la possibilità di utilizzare 256 colori o più per ogni parte della colorazione IPython, grazie all'estensione della tavolozza predefinita. C'è un esempio di come estendere a 256 colori nel seguente codice.

Quindi, ecco come fare, con un elenco di tutti i gettoni che possono essere utilizzati:

## 
## Basic color scheme that will be modified 
## 

colorLabel = 'Linux' 
c.InteractiveShell.colors = colorLabel 


from pygments.token import Token, Keyword, Name, Comment, String, Error, \ 
    Number, Operator, Generic, Whitespace 

c.TerminalInteractiveShell.highlighting_style_overrides = { 

    ## Standard Pygments tokens (are all used by IPython ?) 

    Whitespace:    "#bbbbbb", 
    Comment:     "italiC#008800", 
    Comment.Preproc:   "noitalic", 
    Comment.Special:   "noitalic bold", 

    Keyword:     "bold #AA22FF", 
    Keyword.Pseudo:   "nobold", 
    Keyword.Type:    "bold #00BB00", 

    Operator:     "#666666", 
    Operator.Word:    "bold #AA22FF", 

    Name.Builtin:    "#fff", #""#AA22FF", 
    Name.Function:    "#00A000", 
    Name.Class:    "#0000FF", 
    Name.Namespace:   "bold #0000FF", 
    Name.Exception:   "bold #D2413A", 
    Name.Variable:    "#B8860B", 
    Name.Constant:    "#880000", 
    Name.Label:    "#A0A000", 
    Name.Entity:    "bold #999999", 
    Name.Attribute:   "#BB4444", 
    Name.Tag:     "bold #008000", 
    Name.Decorator:   "#AA22FF", 

    String:     "#BB4444", 
    String.Doc:    "italic", 
    String.Interpol:   "bold #BB6688", 
    String.Escape:    "bold #BB6622", 
    String.Regex:    "#BB6688", 
    String.Symbol:    "#B8860B", 
    String.Other:    "#008000", 
    Number:     "#666666", 

    Generic.Heading:   "bold #000080", 
    Generic.Subheading:  "bold #800080", 
    Generic.Deleted:   "#A00000", 
    Generic.Inserted:   "#00A000", 
    Generic.Error:    "#FF0000", 
    Generic.Emph:    "italic", 
    Generic.Strong:   "bold", 
    Generic.Prompt:   "bold #000080", 
    Generic.Output:   "#888", 
    Generic.Traceback:   "#04D", 

    Error:      "border:#ff0000", 

    ## IPython 

    Token.Number: '#ffffff', 
    Token.Operator: 'noinherit', 
    Token.String: '#8b8', 
    Token.Name.Function: '#2080D0', 
    Token.Name.Class: 'bold #2080D0', 
    Token.Name.Namespace: 'bold #2080D0', 
    Token.Prompt: '#ffffff bold', 
    Token.PromptNum: '#888888 bold', 
    Token.OutPrompt: '#008b8b bold', 
    Token.OutPromptNum: '#006b6b bold', 
} 


from IPython.core import excolors, ultratb, debugger 
from IPython.core.excolors import exception_colors as exception_colors_orig 

## 
## Add new color labels here before attributing them 
## 


from IPython.utils import coloransi 

coloransi.color_templates = (
    # Dark colors 

    ("Black"  , "0;30"), 
    ("Red"   , "0;31"), 
    ("Green"  , "0;32"), 
    ("Brown"  , "0;33"), 
    ("Blue"  , "0;34"), 
    ("Purple"  , "0;35"), 
    ("Cyan"  , "0;36"), 
    ("LightGray" , "0;37"), 

    # Light colors 
    ("DarkGray" , "1;30"), 
    ("LightRed" , "1;31"), 
    ("LightGreen" , "1;32"), 
    ("Yellow"  , "1;33"), 
    ("LightBlue" , "1;34"), 
    ("LightPurple" , "1;35"), 
    ("LightCyan" , "1;36"), 
    ("White"  , "1;37"), 

    ## 256-colors 

    ("Green108", "38;5;108"), 
) 

coloransi.make_color_table(coloransi.TermColors) 
coloransi.make_color_table(coloransi.InputTermColors) 

for name, value in coloransi.color_templates: 
    setattr(coloransi.NoColors, name, '') 


C = coloransi.TermColors 
IC = coloransi.InputTermColors 


def exception_colors(): 

    ex_colors = exception_colors_orig() 

    ex_colors.add_scheme(coloransi.ColorScheme(
     colorLabel, 

     # The color to be used for the top line 
     topline=C.LightRed, 

     # The colors to be used in the traceback 
     filename=C.Green, 
     lineno=C.DarkGray, 
     name=C.Purple, 
     vName=C.Cyan, 
     val=C.White, 
     em=C.LightCyan, 

     # Emphasized colors for the last frame of the traceback 
     normalEm=C.LightCyan, 
     filenameEm=C.Green, 
     linenoEm=C.Normal, 
     nameEm=C.LightPurple, 
     valEm=C.LightGreen, 

     # Colors for printing the exception 
     excName=C.Red, 
     line=C.Yellow, 
     caret=C.White, 
     Normal=C.Normal 
    )) 
    return ex_colors 

excolors.exception_colors = exception_colors 
ultratb.exception_colors = exception_colors 
debugger.exception_colors = exception_colors 


## 
## Parser color (source code colors) 
## 

from IPython.utils import PyColorize 
import token 
import tokenize 

PyColorize.ANSICodeColors[colorLabel] = coloransi.ColorScheme(
    colorLabel, { 
     'header'   : C.LightRed, 
     token.NUMBER  : C.LightCyan, 
     token.OP   : C.Normal, 
     token.STRING  : C.Green108, 
     tokenize.COMMENT : C.LightGray, 
     token.NAME  : C.Normal, 
     token.ERRORTOKEN : C.Red, 

     PyColorize._KEYWORD   : C.White, 
     PyColorize._TEXT   : C.Yellow, 

     ## Keep IC here, you can use other colors 

     'in_prompt'  : IC.Green, 
     'in_number'  : IC.LightGreen, 
     'in_prompt2'  : IC.Green, 
     'in_normal'  : IC.Normal, # color off (usu. Colors.Normal) 

     'out_prompt'  : C.Red, 
     'out_number'  : C.LightRed, 

     'normal'   : C.Normal # color off (usu. Colors.Normal) 
}) 
+0

Ho appena provato la tua soluzione con IPython 6.2.1 (con python 3.6.2) all'interno di rxvt-unicode-256color e sembra funzionare in parte - ottengo colori diversi con quello predefinito "Linux", ma sono insoliti. Ad esempio, il prompt è un verde molto, molto pallido con una parte numerica grigio-blu chiaro, tuttavia parole chiave come "import" sono in grassetto magenta e "def" è in grassetto blu. Hai uno screenshot per quello che dovrebbe essere? – meowsqueak

+0

@meowsqueak, grazie per il test. È davvero strano che in realtà cambi i colori, ma non ottiene i colori che ci si aspettava. Non ho condiviso qui un set di colori ben realizzato ma solo lo schema di Linux con alcune modifiche ai colori scelti, e la parola chiave '' import'' dovrebbe essere bianca in questo set. Bene, non ho il tempo ora di verificare cosa sta succedendo con IPython 6+, ho aggiunto un avviso alla risposta per dichiarare chiaramente che questo funziona su IPython 5.5 ma probabilmente non su IPython 6+. – vaab

Problemi correlati