我可以使用这个特殊的转义序列在 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?
来自这个答案,经过一番尝试:
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' ) )
请参阅终端仿真器中的超链接以获取参考文档。
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]")