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

6

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

sys.ps1 = f

按照文档中的说明,我最终得到了以下结果:

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内部的着色方案,但是否有一种方法可以强制它使用shell的颜色代码而不对其进行转义?
虽然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 $ '

请提供您的 f 字符串好吗? - Asav Patel
@AsavPatel 这是动态计算的,基于当前工作目录和git状态。 - k_g
1
仍然有任何示例将会有所帮助,因为我没有办法在我的机器上重现它。 - Asav Patel
prompt-toolkit v2支持ANSI文本格式,但IPython是基于prompt-toolkit v1构建的,因此重写您的PS1会更容易。 - georgexsh
@georgexsh 把它写成答案,我会授予悬赏。我希望有一种简洁的方法,但看起来并没有。 - k_g
显示剩余3条评论
1个回答

3

IPython shell是基于prompt-toolkit构建而成的,它的样式可以用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


这假定OP在终端中运行ipython shell。 - Martijn Pieters
这个 f() 函数在哪里被使用了?原帖的意图是想要使用一个已有函数的输出,而不是定义新的标记。 - Martijn Pieters
2
@MartijnPieters 说得好,因为 OP 正在从 IPython.terminal.prompts 导入,我假设它正在终端中运行。我已经在评论中说明了重用现有 ps1 字符串很困难,而 OP 似乎只是想要一个带颜色的 IPy 提示符。 - georgexsh

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