2013-01-02 16 views
14

Chciałbym dostosować kolor tekstu w IPython, ale nie jestem pewien, jak to zrobić.Jak dostosować kolor tekstu w IPython?

wiem, że w Pythonie, mogę to zrobić przez kończąc sys.ps1 i sys.ps2 z kodem kolorów ANSI, takich jak

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

ale odpowiednim podejściem, używając PromptManager.in_template, nie działa dla ipython. Na przykład:

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

nie ma wpływu na kolor tekstu po znaku zachęty.

Czy istnieje sposób na zmianę koloru tekstu w IPythonie?

Odpowiedz

7

Pytanie explicitly sets kolor wejściowy do colors.in_normal. Jeśli chcesz zmienić kolor wejściowy, musisz zmienić ten kolor.

Niestety, spersonalizowane schematy kolorów nadal znajdują się na liście zadań (powinny być dość łatwe, ale nie o wysokim priorytecie).

Nieco hackish przykładem tego, co wydaje się chcieć, zmieniając kolor wejścia i/lub tekstu wyjściowego w pliku konfiguracyjnym:

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 

Będzie go ustawić tak, że kolor tekstu pasuje do wiersza , ale możesz oczywiście wybrać, co chcesz.

+0

Jak chcemy to zrobić w systemie Windows? Być może czegoś mi brakuje, ale dla mojej konkretnej instalacji iPythona nie ma monitów obiektu.PColLinux – Stephen

+2

Używam IPython 6.1.0 i nie ma też "prompts.PColLinux" lub "prompts.PColLinuxBG". Wygląda na to, że ten podsystem został przepisany w (lub w pobliżu) IPythonie 5 i nie mogę znaleźć niczego podobnego w najnowszych wersjach. – meowsqueak

+0

@minrk przepraszam za głupie pytanie, ale gdzie powinniśmy zapisać ten config.py? – JinSnow

0

Ostrzeżenie: Ta odpowiedź jest kompatybilny tylko z IPython5.5.0 i nie wydaje się, aby dobrze tłumaczyć z IPython6+. (thx @meowsqueak na szybki test!)

Po IPython 5.5.0 można zastąpić dowolny kolor stylizacji dzięki ipython_config.py w folderze docelowego profilu. (np .: ~/.ipython/profile_default dla profilu default na typowej instalacji Linuksa).

Kod IPython jest dość chaotycznie związany z kolorowaniem, a kilka parserów używa parserów, debuggerów i powłoki interaktywnej. Niektóre części używają Pygments, inne dostarczają kod escape ANSI, który jest ograniczony do palety 16 kolorów.

Rozwiązanie nie jest ładne, ale działa. Jeśli są jakieś inne ładniejsze sposoby, proszę powiedz mi w komentarzu!

Należy pamiętać, że moje rozwiązanie zawiera również możliwość użycia 256 kolorów lub więcej dla każdej części kolorowania IPython, dzięki rozszerzeniu domyślnej palety. Istnieje przykład jak rozszerzyć do 256 kolorów w poniższym kodzie.

Więc oto jak to zrobić, z listą wszystkich żetonów, które mogą być wykorzystane:

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

Właśnie wypróbowałem twoje rozwiązanie za pomocą IPython 6.2.1 (z pythonem 3.6.2) wewnątrz rxvt-unicode-256color i wydaje się, że działa ono częściowo - otrzymuję różne kolory z domyślnym schematem "Linux", ale są one nietypowe. Na przykład podpowiedź jest bardzo, bardzo bladozielona z bladoniebiesko-szarą częścią numeryczną, ale słowa kluczowe takie jak "import" są pogrubione, a "def" pogrubione na niebiesko. Czy masz zrzut ekranu na to, jak powinien wyglądać? – meowsqueak

+0

@meowsqueak dzięki za test. To naprawdę dziwne, że faktycznie zmienia kolory, ale nie ma kolorów, których się spodziewano. Nie wspominałem o dobrze przygotowanym zestawie kolorów, ale tylko o systemie Linux z pewnymi zmianami w wybranych kolorach, a słowo kluczowe '' import'' w tym zestawie powinno być jasnobiałe. Cóż, nie mam teraz czasu, aby sprawdzić, co się dzieje z IPythonem 6+, dodałem ostrzeżenie do odpowiedzi, aby wyraźnie stwierdzić, że działa to na IPythonie 5.5, ale prawdopodobnie nie na IPython 6+. – vaab

Powiązane problemy