给新风格的IPython(v5)提示符添加颜色

12

今天更新到新发布的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, ' >>>')]

将这段代码放入启动脚本中,它可以很好地工作,但默认情况下不会给Token行上色,Token.Prompt是浅绿色的。

尝试使用旧的配置方法colors(r'{color.Green}'),但在这里不起作用。任何指向正确方向的指针都将是极好的。

谢谢!


我喜欢这个新的Ipython的多行编辑功能。可能需要一些时间来适应不同的制表符自动补全行为。 - hpaulj
2个回答

8
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)
"""

我用这个脚本尝试了各种提示符。它包括默认的in_prompt_tokens方法、示例自定义以及几个替代方法。最后一个模仿了我的bash提示符。
73:~/mypy$ 

看起来元组(Token..., str)根据token_type设置了字符串的颜色。可能的类型有TokenToken.PromptToken.PromptNum。查看Token.<tab>获取更多信息(例如OutPrompt(Num))。

IPython/terminal/prompts.py

我可能不会使用这些,因为我喜欢默认的匹配 In / Out 配对。另外,我可以使用 --term-title 在选项卡标题中显示目录。


我的VIM自动补全在Token方面没有作用,所以我放弃了。我尝试从ipython终端本身和从那里运行,它起作用了。这很有帮助,非常感谢。 - Michael Gorman
1
在上面的内容后面添加一行 c.InteractiveShell.prompts_class = MyPrompt~/.ipython/profile_default/ipython_config.py 文件中(因为 get_ipython() 返回 None)。感谢 https://newton.cx/~peter/2015/11/extensible-prompts-in-jupyter-console/。 - denis

4

一个简单的示例,展示如何将提示信息的颜色设置为红色:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接