Terminal: 设计可点击链接和链接预览功能/扩展

创建于 2019-05-08  ·  30评论  ·  资料来源: microsoft/terminal

终端的营销视频包括他们显示悬停时预览链接的部分。 这个功能目前可用吗?

Area-Extensibility Issue-Feature Product-Terminal

最有用的评论

我写这封信是为了恭敬地请求这个从小开始,并着眼于更大的功能请求。 让 http(s):// 链接在默认浏览器中打开,当 CTRL+单击它们时,将是一个很好的开始! 如此多的命令行工具会吐出现在必须复制并粘贴到浏览器中的 Web 链接。 在我看来,如果我们只有那个功能,那可能就足够了。 谢谢您的考虑!

所有30条评论

不。

营销宣传更多的是“即将发生的事情”而不是“现在可用的东西”。 感谢您在我们继续开展此项目时的耐心等待 :)

也用于链接,#555

@tackyunicorn -终端视频很有抱负 - 它的目标是说明我们正在努力在终端中提供的一些关键功能。 所示的某些功能已在终端中。 大多数将在 2019 年底发布 v1.0。其他可能需要更多的设计、构建和烘焙时间,并将在 v1.0 之后发布。

目前,可扩展性主机和“链接预览”等扩展尚未设计或实现,很可能会在 v1.0 之后发布。 我们希望花费时间和精力来确保我们“正确”构建这些关键功能,以最大程度地减少以后的中断。

我们正在制定未来的路线图,并将在接下来的几周内与社区分享。

新功能/增强功能摘要

检测 URL 并使它们可点击(在默认浏览器中打开 URL)。 这是许多其他终端中存在的便利功能。

我相信这个价值是不言而喻的,但这里有一个具体的用例示例:当我运行yarn outdated (Yarn 是一个包管理器)时,它为每个列出的包输出一个存储库/主页 URL。 我希望能够单击这些 URL 之一来快速/轻松地打开页面,并查看新版本软件包中的更改。

实施细则

  • 除了以http://https://开头的文本外,可能不需要支持任何其他内容。
  • 应该正确处理跨越多行的 URL(由于被窗口宽度截断)。
  • 可能应该有一个 URL 可点击的指示,例如鼠标悬停时光标更改 + 下划线。
  • 大多数其他终端需要 alt 或 ctrl 单击,我认为在复制等时防止意外单击。

您可以查看类似 VS Code 的终端以获取灵感。 同样,这一切可能是不言而喻的。

延伸目标(包含在#204 中)


IMO 为了完成,它应该支持所有模式,避免要求添加新模式和代码/库可重用性的进一步问题。

正确处理可能会变得复杂的一件事是处理括号:如果我遇到的大多数实现错误地跳过了结束括号字符 ( ) ),如果它是破坏多个维基百科链接的链接中的最后一个字符。 可能应该使用一些括号匹配算法来确定最后一个字符是否是链接的一部分。

编辑:错字


我遇到的大多数实现都错误地跳过了结束括号字符( ) ),如果它是链接中的最后一个字符,会破坏多个维基百科链接

另一方面,URL 通常包含在文本流中的括号内(参见例如 http://example.com/foobar)<- 就像这里一样,在 Markdown 文件中也是如此。

在 gnome-terminal 中,我们通过允许括号()和方括号[]以平衡对出现来解决这两个相互矛盾的要求。 这是使用递归正则表达式实现的。 参见gt 763980

另一个类似的棘手案例是尾随撇号,请参阅gt 448044


如果不轮询服务器,我们就无法解决这个问题

哈哈,这也是一种可能——不过我个人不会这样做。 我相信你和我一样担心数据泄漏和缓慢。

这都是猜测,没有完美的解决方案(好吧,#204 可以解决这个问题)。 我们发现匹配的括号工作得很好,自从我们实施之后,我们还没有收到报告。 至少结果肯定比总是匹配括号或从不匹配要好。 实现起来有点棘手,深入研究了某些正则表达式库的很少使用和几乎不为人知的正则表达式功能(所以我对许多终端不打扰它并不感到惊讶),但我认为这是值得的。 :)

我认为我们需要检测文件夹路径并使它们也可点击。
更容易调试代码:
WindowsTerminal_2019-07-18_09-11-04

教学提示控件可用于链接预览功能

您可以查看类似 VS Code 的终端以获取灵感。 同样,这一切可能是不言而喻的。

为什么不共享相同的代码?

除了以 http:// 或https://开头的文本外,可能不需要支持任何其他内容

我认为您应该添加www.检测。

为什么不共享相同的代码?

好吧,它是用 TypeScript 编写的,它是 JavaScript 的一种方言……所以它在我们的 C++ 项目中并不完全适用。

等不及这个功能了!! 我喜欢能够按住 CTRL 并在 ConEmu 中看到一个链接带有下划线,左键单击它会在默认浏览器中打开它。 希望 URL 突出显示的简单正则表达式实现能够在年底之前实现 :)

教学提示控件可用于链接预览功能

image

您可以想象此控件出现在链接上,带有链接的 Favicon、站点名称和 URL 或 Bing 描述

@mdtauk@awarmfastbear - 你的意思是像我们在终端的嘶嘶声视频中展示

image

当您指出@bitcrazed时,该功能在那个嘶嘶

@bitcrazed这实际上是这个问题的第一句话,顺便说一句;)

@mdtauk同意。 我们绝对不想不必要地重新发明轮子。 如果我们可以使用标准的 XAML 控件来实现这样的功能,我们会的。

如果没有,我们将与 XAML 控件团队合作确定是否需要对现有控件进行更改,或者是否需要具有正确行为的新控件。

老实说,这里最大的挑战不太可能是使用哪个控件,而是如何构建可扩展性机制,提供所有必需的功能,同时保持足够快、稳定和安全。

在 Ignite 2019 的其中一场会议上,有人表示将通过扩展功能支持这一点。 因此,我们需要等待扩展支持完成。

@bitcrazed现在,Windows 终端在https://github.com/pew/ternimal上的“彩虹模式”基准测试中速度非常快

我有一个想法:如果链接根本没有被解析并且不可点击,直到用户按住 Control(或 Alt)并将鼠标悬停在 Windows 终端上,该怎么办。 在这种情况下,代码将扫描该行(支持在前一行/后一行中换行的行),并在鼠标光标处准确查找 URL 或 FILE PATH。 如果是这样,然后突出显示 URL,显示预览,使其可点击(只要 Ctrl 仍然保持),等等。

此外,如果用户右键单击,则在该位置解析完整的字符序列(因此在单击序列之前/之后的空白处停止),从而突出显示整个单词。 然后进行链接解析。 如果检测到链接,则显示“打开链接”菜单项。

在 ctrl-and-hover 和右键单击场景中,解析器是相同的:

  • 获取鼠标光标悬停的“行+列”。
  • 如果该列是空白,则什么都不做,因为没有什么可扫描的。
  • 如果该列不是空白,请通过扫描直到遇到空白(换行符、空格等;垂直和水平空白)来收集其前后的所有“连接”字符。 结果将是一个词、一个链接或其他任何东西。
  • 做一个简单的链接解析,检测它是否是一个 URL。 也做文件系统解析,如果看起来像本地文件路径(例如C:\Tools\foo.cpp:80将从左到右解析并检测C:\Tools\foo.cpp是一个文件)。
  • 如果检测到 URL/文件路径,则处理该链接。

这两个解决方案将是最高性能的答案,按住 Ctrl(或 Alt)没什么大不了的。 许多终端都是这样处理的,比如 macOS 终端。 在 macOS 终端中,按住 Command + 双击打开链接,或者右键单击以获取“解析”突出显示的单词/链接的菜单(如果右键单击链接,则会检测到该事实并突出显示整个链接),然后选择“打开链接”。

所有的替代方案都是浪费的,而且速度要慢得多。

PS:如果有帮助,Alacritty 终端将这些字符定义为“字符序列链接分隔符”: ",│`|:\"' ()[]{}<>\t" ,这可能有助于定义如何拆分字符串以检测单击的路径、URL 等/hovered 字符序列。 如果我正在编写解析器,我会使用我上面描述的“获取完整的非空白字符序列”技术,然后通过“围绕垃圾的条带,例如<>()之后,检测最终链接。

@VideoPlayerCode - 感谢您在此处提交您的想法。

我同意,只有在用户点击键/和弦时才允许解析 URL 是推迟正则表达式扫描,但这仍然意味着我们无法为嵌入在文本中的 URL 着色 - 这是许多用户已经要求的。

此外,URL 只是我们想要查找和识别的一类文本模式之一:例如,我希望能够告诉终端在匹配的文本下绘制一个黄色填充的红色框指定的文本模式/正则表达式/等。 - 想象一下,当它流过时,能够在 Web 服务器日志中以这种方式突出显示错误消息。 😁

我很确定我们将能够找到一种能够以非常高效的方式识别模式/正则表达式匹配的策略。 最终。 一天😜

@bitcrazed

我同意,只有在用户点击键/和弦时才允许解析 URL 是推迟正则表达式扫描,但这仍然意味着我们无法为嵌入在文本中的 URL 着色 - 这是许多用户已经要求的。

啊,我才发现营销视频中出现了“始终激活的扫描仪”功能,这是用户所期望的。 哎呀。

此外,URL 只是我们想要查找和识别的一类文本模式之一:例如,我希望能够告诉终端在匹配的文本下绘制一个黄色填充的红色框指定的文本模式/正则表达式/等。 - 想象一下,当它流过时,能够在 Web 服务器日志中以这种方式突出显示错误消息。 😁

哇,我喜欢这个主意! 能够在用户配置中设置正则表达式并选择如何突出显示匹配将非常棒。

我很确定我们将能够找到一种能够以非常高效的方式识别模式/正则表达式匹配的策略。 最终。 一天😜

好吧,如果需要连续扫描……这里有一些想法:

  • 进行扫描时,仅执行当前可见的屏幕缓冲区。 如果屏幕缓冲区以非空白字符开头,还包括在屏幕外直到前一个空白的文本(例如,如果顶行是hub.com/foo但实际上是https://git<wrap>hub.com/foo的包装延续
  • 在该缓冲区上运行正则表达式需要以四种方式之一(或所有方式的组合)进行限制:
  • 答:仅在屏幕上没有写入任何内容(没有新文本/更改的字符)并在合理的时间内(例如 300 毫秒)进行扫描。 这意味着当快速滚动日志或“cat”处于活动状态时,它们将不受限制地运行。
  • 或者 B:以脉冲间隔运行它,例如 300 毫秒,在那里您阻止执行,进行快速扫描,在需要的地方标记高光,然后继续执行(消耗传入的 stdout 数据)。
  • 或C:滚动慢时实时扫描,但输出速率很高时完全停止实时扫描。 例如“cat 10mbfile.txt”将禁用实时扫描,因为终端会注意到一个疯狂的输出速率。 一旦疯狂的输出停止,就一次性通过刚刚流式传输的旧输出缓冲区。 我最喜欢这个主意。 并将其与仅扫描可见屏幕缓冲区的技术结合起来。
  • 或 D:实时扫描所有数据(会降低性能),并缓存结果。 每当缓冲区中添加行或替换字符时,仅扫描/重新扫描这些行。
  • 也只考虑支持链接,至少对于实时扫描。 因为自定义正则表达式可能真的很疯狂,以至于它们会匹配整个缓冲区。 想象一下,在您的“自定义正则表达式”示例中,您甚至会如何开始匹配​​从“日志结果:”一直到“日志结束”行匹配的正则表达式。 这可能是应该匹配的数千行数据。 哎呀,那个正则表达式甚至不知道如何匹配任何东西,直到它看到匹配结束时的“日志结束”钳位。 太疯狂了...
  • 如果您只支持链接,则可以通过使用非常简单的优化模式匹配器仅扫描“http:”和“https:”(不区分大小写),然后执行“完整的正则表达式引擎”扫描 _only_ 来疯狂地优化在该匹配项周围以空格分隔的字符序列上。
  • 还要注意人们对无休止地运行字符的文件执行“cat”操作,因为它会降低性能。
  • 对于方法 A、B 和 C:当用户在缓冲区中向后滚动以查看旧文本时,他们会很挑剔并且不会期望链接在节流脉冲间隔期间“弹出”到视图中。 因此,在使用滚动条手动滚动时进行更快的扫描。 但是哎哟,我几乎无法想象以高性能方式扫描实时流动/自修改文本的代码会有多粗糙。

简而言之:哦,亲爱的,祝你好运满足用户对一个非常疯狂的(以糟糕的性能方式)功能的期望。 这个问题有点像试图编写一个快速的正则表达式来扫描一个不断下载越来越多数据并自我修改旧数据的 HTML 网页......

感谢您分享您的想法:) 很高兴您和我一样喜欢这个功能;)

无论我们使用什么扫描机制,很确定它最终会是:

1) 异步
2) 高效
3) 可配置

你一针见血。 您对性能的评论 - 这是此类功能的主要关注点,我们需要密切关注。 根本不可能在旧的控制台引擎之上设计一个通用的解决方案,但我们正在接近终端底层新重新架构的引擎应该为我们提供我们需要的访问和功能的地步。

现在,如果我们有更多的开发人员和/或足够积极的社区成员,他们有技能和时间来提供帮助 😜

第二个你有扩展点,我相信我们有很多人有技能。 我们会非常努力地争取时间:) 至少算上我自己。

期待那一天:)

当这确实发生时,能够在每个配置文件的基础上覆盖默认应用程序会很棒。 最终的梦想是能够使用不同的和弦在不同的浏览器中启动 URL。

我想您已经知道了,但是过去存在一些导致类似问题的安全风险,尤其是 iTerm 在将鼠标悬停在链接上以在单击之前突出显示它们时进行 DNS 查找时遇到问题。 对于调查实时攻击的安全分析师来说,这是一个相当大的问题,但也导致了一些问题,因为它以明文形式发送类似于 URL(包括敏感信息 - 例如密码)的内容的 DNS 查找。

我不会说这种行为是对还是错,但在实现这一点时绝对要记住一些事情。 以供参考:
https://gitlab.com/gnachman/iterm2/issues/6050
https://gitlab.com/gnachman/iterm2/issues/3688
https://gitlab.com/gnachman/iterm2/issues/5303
https://gitlab.com/gnachman/iterm2/-/wikis/dnslookupissue
https://nvd.nist.gov/vuln/detail/CVE-2015-9231

我写这封信是为了恭敬地请求这个从小开始,并着眼于更大的功能请求。 让 http(s):// 链接在默认浏览器中打开,当 CTRL+单击它们时,将是一个很好的开始! 如此多的命令行工具会吐出现在必须复制并粘贴到浏览器中的 Web 链接。 在我看来,如果我们只有那个功能,那可能就足够了。 谢谢您的考虑!

我喜欢 windows 终端,但我讨厌每次点击链接时切换到不同的终端。 就这样。

在这里赶上潮流以要求此功能。 来自 macOS,我真的很想念一种快速点击 URL 的方法,而不必经历尴尬的复制/粘贴仪式。

V2.0 路线图上的可点击链接: https :

代表一些订阅者观看此内容以进行显着更改/更新; 我们现在可以锁定/静音这个问题吗?

额外的询问,+1,不提供价值,并给我们的收件箱带来更多污染。 如果有人想为此做出贡献,他们可以制作 CR 并参考此问题。 :)

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ghost picture ghost  ·  3评论

ghvanderweg picture ghvanderweg  ·  3评论

miniksa picture miniksa  ·  3评论

TayYuanGeng picture TayYuanGeng  ·  3评论

xmm1989218 picture xmm1989218  ·  3评论