How do I customize text color in IPython?

只愿长相守 提交于 2019-12-03 11:02:41

问题


I'd like to customize the color of text in IPython, but am not sure how to do it.

I know that in Python, I can do this by ending sys.ps1 and sys.ps2 with an ANSI color code such as

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

But the corresponding approach, using PromptManager.in_template, does not work for IPython. For example

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

has no effect on the color of text after the prompt.

Is there a way to change the color of text in IPython?


回答1:


The prompt explicitly sets the color of input to colors.in_normal. If you want to change the input color, you have to change this color.

Unfortunately, customized color schemes are still on the todo list (should be pretty easy, just not a high priority).

A somewhat hackish example of what you seem to want, changing the color of input and/or output text in a config file:

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

This will set it so that the color of text matches the prompt, but you can of course choose whatever you want.




回答2:


Colorize and Syntax Style in IPython

Looking in your installation directory you will find a file called ipython_config.py. To install this file simply use the following command:

ipython profile create

Otherwise find this file and copy it in your ~/.ipython/profile_default/ directory.

Maybe you like to make a backup of this file with:

cp ~/.ipython/profile_default/ipython_config.py \
   ~/.ipython/profile_default/ipython_config.py_backup

Open this file with your editor of choice and search for following settigs and comment it out if you like it (delete the '#'):

  • c.InteractiveShell.color_info = True

  • c.InteractiveShell.colors = 'Linux'

  • c.TerminalInteractiveShell.highlighting_style = 'monokai'

  • c.TerminalInteractiveShell.highlight_matching_brackets = True

and so on. There are many usefull settings which you have only to comment them out (deleting the #)

Style Files

The style files can be found in following directory:

/path/to/your/python/site-packages/pygments/styles/

Alternatively, list the styles with pygmentize: pygmentize -L styles




回答3:


Warning: This Answer is only compatible with IPython 5.5.0 and it does not seem to translate well with IPython 6+. (thx @meowsqueak for the quick test !)

As of IPython 5.5.0, you can override any styling color thanks to the ipython_config.py in the targetted profile folder. (ie: ~/.ipython/profile_default for default profile on a linux typical install).

IPython code is quite a mess related to colorizing and several methods are used for parsers, debuggers, interactive shell. Some part use Pygments, some other provide ANSI escape code that are limited to a 16 colors palette.

The solution is not pretty, but works. If there are any other prettier other way, please tell me in comment !.

Please note that my solution also includes the ability to use 256 colors or more for every part of IPython coloring, thanks to an extending of the default palette. There's an example of how to extend to 256 colors in the following code.

So here's how to do, with a list of all tokens that might be used:

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


来源:https://stackoverflow.com/questions/14129278/how-do-i-customize-text-color-in-ipython

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!