Добавление цвета в новый стиль ipython (v5)

Обновите новую версию ipython5 сегодня. Начато интерактивное приглашение и получено:

/usr/local/lib/python3.5/site-packages/IPython/core/interactiveshell.py:440: UserWarning: As of IPython 5.0 `PromptManager` config will have no effect and has been replaced by TerminalInteractiveShell.prompts_class
warn('As of IPython 5.0 `PromptManager` config will have no effect'

Я потерял свои старые настройки конфигурации, чтобы настроить и раскрасить приглашение и пошел искать новый способ настроить подсказку и нашел ее очень здорово. Используется новый стиль класса из пример кода:

class MyPrompt(Prompts):
    def in_prompt_tokens(self, cli=None):
        return [(Token, os.getcwd()),
                (Token.Prompt, ' >>>')]

Поместите это в startup script, и он отлично работает, за исключением того, что по умолчанию он не окрашивает линию Token, Token.Prompt сделан светло-зеленым.

Попытка использовать старые методы метода конфигурации (r '{color.Green}'), но это не работает. Любые указатели в правильном направлении были бы большими.

Спасибо!

Ответ 1

from IPython.terminal.prompts import Prompts, Token
import os

class MyPrompt(Prompts):

    def in_prompt_tokens(self, cli=None):   # default
        return [
            (Token.Prompt, 'In ['),
            (Token.PromptNum, str(self.shell.execution_count)),
            (Token.Prompt, ']: '),
        ]

    def in_prompt_tokens(self, cli=None):  # sample
        return [(Token, os.getcwd()),
                 (Token.Prompt, ' >>>')]

    def in_prompt_tokens(self, cli=None):   # custom
        path = os.path.basename(os.getcwd())
        return [
            (Token.Prompt, '<'),
            (Token.PromptNum, '~/'+path),
            (Token.Prompt, '>'),
            (Token.Prompt, '['),
            (Token.PromptNum, str(self.shell.execution_count)),
            (Token.Prompt, ']: '),
        ]

    def in_prompt_tokens(self, cli=None):   # custom
        path = os.path.basename(os.getcwd())
        return [
            (Token.PromptNum, str(self.shell.execution_count)),
            (Token.Prompt, ':'),
            (Token.PromptNum, '~/'+path),
            (Token.Prompt, '$ '),
        ]

"""
use:
import myprompt as MP
ip=get_ipython()
ip.prompts=MP.MyPrompt(ip)
"""

Я экспериментировал с различными подсказками с помощью этого script. Он включает в себя метод по умолчанию in_prompt_tokens, пример настройки и несколько альтернатив. Последний имитирует приглашение bash

73:~/mypy$ 

Похоже, что кортеж (Token..., str) устанавливает цвет строки в соответствии с token_type. Token, Token.Prompt, Token.PromptNum - возможные типы. Посмотрите Token.<tab> для более (например, OutPrompt(Num)).

IPython/terminal/prompts.py

Я, вероятно, не буду использовать ни одного из них, потому что мне нравятся пары In /Out по умолчанию. Кроме того, я могу использовать --term-title для отображения каталога в заголовке вкладки.

Ответ 2

Простой пример, показывающий, как окрасить подсказку в красный цвет:

from IPython.terminal.prompts import Token

ipy_config = get_config()

ipy_config.TerminalInteractiveShell.highlighting_style_overrides = {
    Token.Prompt: '#ff0000',
}

Более продвинутый пример, который меняет цвет запроса в соответствии с переменной окружения (полезно, если вы много играете с промежуточными/живыми системами):

# Example showing how to change color of prompt and prompt string in specific environments.
# put into ~/.ipython/profile_${YOURPROFILE}/ipython_config.py and start ipython with:
# PROFILE_LIVE ipython --profile ${YOURPROFILE}
import os

from IPython.terminal.prompts import Prompts, Token

ipy_config = get_config()


class MyPrompt(Prompts):
    environment = None

    def in_prompt_tokens(self, cli=None):
        return [
            (Token.Prompt, '{} ['.format(MyPrompt.environment)),
            (Token.PromptNum, str(self.shell.execution_count)),
            (Token.Prompt, ']: ')
        ]


if 'PROFILE_LIVE' in os.environ:
    ipy_config.TerminalInteractiveShell.highlighting_style_overrides = {
        Token.Prompt: '#ff0000',
    }
    MyPrompt.environment = 'LIVE'
    ipy_config.TerminalInteractiveShell.prompts_class = MyPrompt