如何在IPython提示中重用现有的sys.ps1格式化程序?

时间:2018-08-12 21:10:41

标签: python terminal ipython

我有一个函数f,它为python生成PS1提示符,设置如下:

sys.ps1 = f

按照the documentation中的说明进行操作,最后得到以下内容:

from IPython.terminal.prompts import Prompts, Token
from IPython import get_ipython
class MyPrompt(Prompts):
 def in_prompt_tokens(self, cli=None):
     return [(Token, f())]
ipython = get_ipython()
ipython.prompts = MyPrompt(ipython)

但是,这不起作用,因为f返回带有颜色代码的字符串,python直接打印到终端,导致彩色提示,而ipython打印则转义,导致产生一串转义码。

我知道我可以重新配置f以使用ipython的内部着色方案,但是有没有办法强迫它使用外壳的颜色代码而不逃避它们呢?

虽然f是一个考虑到其环境信息的函数,但是这里的一个实现在一种情况下显示了它的输出(它在后台使用了colorama,所以这只是unix系统上的输出)。

def f():
    return '\x01\x1b[1m\x1b[33m\x02kavi\x01\x1b[0m\x02 \x01\x1b[38;5;214m\x02/home\x01\x1b[38;5;82m\x02/kavi\x01\x1b[38;5;28m\x02\x01\x1b[0m\x02 \x01\x1b[38;5;38m\x02master\x01\x1b[0m\x02 $ '

1 个答案:

答案 0 :(得分:3)

IPython Shell构建于提示工具包上,its style可以被TerminalInteractiveShell._style覆盖:

from prompt_toolkit.styles import style_from_dict
from IPython.terminal.prompts import Prompts, Token
from IPython import get_ipython


style = style_from_dict({
    Token.User: '#f8ea6c',
    Token.Path_1: '#f08d24',
    Token.Path_2: '#67f72f',
    Token.Git_branch: '#1cafce',
    Token.Pound: '#000',
})


class MyPrompt(Prompts):
    def in_prompt_tokens(self, cli=None):
        return [
            (Token.User, 'kavi '),
            (Token.Path_1, '/home'),
            (Token.Path_2, '/kavi'),
            (Token.Git_branch, ' master '),
            (Token.Dollar, '$ '),
        ]


ipython = get_ipython()
ipython.prompts = MyPrompt(ipython)
ipython._style = style

使用ipython -i colored_ipy_prompt.py运行它:

enter image description here