在终端中打印超链接

问题描述 投票:0回答:2

我可以使用这个特殊的转义序列在 bash 中打印超链接:

echo -e '\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n'

结果(我可以点击链接):

This is a link

现在我想用 Python 生成这个:

print('\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n')
\e]8;;http://example.com\e\This is a link\e]8;;\e\

print(r'\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n')
\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n

如您所见,shell 不解释转义序列。 其他转义序列(例如粗体文本的转义序列)也有效:

print('\033[1mYOUR_STRING\033[0m')
YOUR_STRING    # <- is actually bold

如何让 Python 正确格式化 URL?

python terminal hyperlink
2个回答
3
投票

来自这个答案,经过一番尝试:

print('\x1b]8;;' + 'http://example.com' + '\x1b\\' + 'This is a link' +  '\x1b]8;;\x1b\\\n' )

然后更好:

print( '\x1b]8;;%s\x1b\\%s\x1b]8;;\x1b\\' %
       ( 'http://example.com' , 'This is a link' ) )

0
投票

请参阅终端仿真器中的超链接以获取参考文档。

def hyperlink(url: str, text: str = None, parameters: dict = None) -> str:
    if text is None:
        text = url
    if parameters is None:
        parameters = {}
    kvs = ":".join("{}={}".format(k, v) for k, v in parameters.items())
    template = "\x1b]8;{};{}\x1b\\{}\x1b]8;;\x1b\\"
    result = template.format(parameters, url, text)
    return result

演示:

>>> url = "https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda"
>>> text = "cmd+click here"
>>> hyperlink(url, text)
'\x1b]8;{};https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda\x1b\\cmd+click here\x1b]8;;\x1b\\'
>>> print(hyperlink(url, text))
cmd+click here

您还可以使用Rich来渲染终端超链接。

pip install 'rich >= 1.1'

这会自动检测终端模拟器是否支持链接,并允许使用简单的类似 markdown 的语法:

from rich import print
print("[link=https://example.org]click me![/link]")
© www.soinside.com 2019 - 2024. All rights reserved.