Terminal: Anklickbare Links entwerfen & Link-Vorschaufunktion/Erweiterung

Erstellt am 8. Mai 2019  ·  30Kommentare  ·  Quelle: microsoft/terminal

Das Marketingvideo für Terminal enthielt einen Teil, in dem Links in der Vorschau beim Hover gezeigt werden. Ist diese Funktion derzeit verfügbar?

Area-Extensibility Issue-Feature Product-Terminal

Hilfreichster Kommentar

Ich schreibe, um respektvoll zu bitten, dass dies klein mit den Augen für die größere Funktionsanfrage beginnt. Es wäre ein guter Anfang, http(s)://-Links im Standardbrowser zu öffnen, wenn Sie mit STRG + darauf klicken! So viele Befehlszeilentools spucken Weblinks aus, die jetzt kopiert und in einen Browser eingefügt werden müssen. Wenn wir nur diese Funktionalität hätten, könnte das meiner Meinung nach für eine ganze Weile ausreichen. Danke für deine Rücksicht!

Alle 30 Kommentare

Nö.

Die Marketing-Promo ist eher ein "was kommt" als ein "was jetzt verfügbar ist". Wir danken Ihnen für Ihre Geduld, während wir weiter an diesem Projekt arbeiten :)

Auch zum Verlinken, #555

@tackyunicorn – das Terminalvideo ist ambitioniert – es soll einige der wichtigsten Funktionen veranschaulichen, an deren

Derzeit sind der Erweiterbarkeitshost und Erweiterungen wie "Link Preview" noch nicht entworfen oder implementiert und werden wahrscheinlich nach v1.0 ausgeliefert. Wir möchten die Zeit und Mühe aufwenden, um sicherzustellen, dass wir solche wichtigen Funktionen "richtig" entwickeln, um spätere Störungen zu minimieren.

Wir arbeiten an unserer zukünftigen Roadmap und werden sie in den nächsten Wochen mit der Community teilen.

Zusammenfassung der neuen Funktion/Erweiterung

URLs erkennen und anklickbar machen (URL im Standardbrowser öffnen). Dies ist eine Komfortfunktion, die in vielen anderen Terminals vorhanden ist.

Ich glaube, der Wert ist offensichtlich, aber hier ist trotzdem ein konkretes Anwendungsbeispiel: Wenn ich yarn outdated ausführe (Yarn ist ein Paketmanager), gibt es für jedes aufgelistete Paket eine Repository-/Homepage-URL aus. Ich möchte in der Lage sein, auf eine dieser URLs zu klicken, um die Seite schnell/einfach zu öffnen und mir anzusehen, was sich in der neuen Version des Pakets geändert hat.

Implementierungsdetails

  • Wahrscheinlich müssen Sie nicht mehr als Text unterstützen, der mit http:// oder https:// beginnt.
  • URLs, die sich über mehrere Zeilen erstrecken (da sie um die Fensterbreite gekürzt werden) sollten korrekt behandelt werden.
  • Es sollte wahrscheinlich ein Hinweis darauf sein, dass die URL anklickbar ist, zB Cursorwechsel + Unterstreichen bei Mauszeiger.
  • Die meisten anderen Terminals erfordern einen Alt- oder Strg-Klick, ich nehme an, um versehentliche Klicks beim Kopieren und so weiter zu vermeiden.

Sie können sich etwas wie das Terminal von VS Code zur Inspiration ansehen. Auch dies ist wahrscheinlich alles selbstverständlich.

Stretch Goal (in #204 behandelt)


IMO sollte es aus Gründen der Vervollständigung alle Schemata unterstützen, um weitere Probleme zu vermeiden, die das Hinzufügen neuer und die Wiederverwendbarkeit des Codes/der Bibliothek erfordern.

Eine Sache, die komplex werden kann, ist die Behandlung von Klammern: Die meisten Implementierungen, die ich kennengelernt habe, überspringen fälschlicherweise das schließende Klammerzeichen ( ) ), wenn es das letzte Zeichen im Link ist, das mehrere Wikipedia-Links unterbricht. Wahrscheinlich sollte ein Algorithmus zum Abgleichen von Klammern verwendet werden, um zu entscheiden, ob dieses letzte Zeichen ein Teil des Links ist oder nicht.

EDIT: Tippfehler


Die meisten Implementierungen, die ich getroffen habe, überspringen fälschlicherweise das schließende Klammerzeichen ( ) ), wenn es das letzte Zeichen im Link ist, der mehrere Wikipedia-Links zerstört

Andererseits werden URLs im Textfluss oft in Klammern eingeschlossen (siehe zB http://example.com/foobar) <- wie hier, ebenso in Markdown-Dateien.

In gnome-terminal haben wir diese beiden widersprüchlichen Anforderungen berücksichtigt, indem wir Klammern () und eckige Klammern [] , solange sie in ausgeglichenen Paaren vorkommen. Dies wurde mit rekursiven regulären Ausdrücken implementiert. Siehe GT763980 .

Ein weiterer ähnlich kniffliger Fall ist das nachgestellte Apostroph, siehe gt 448044 .


Wir können das nicht herausfinden, ohne den Server abzufragen

Haha, das ist auch eine Möglichkeit – ich persönlich würde es aber nicht machen. Ich bin sicher, Sie teilen meine Bedenken bezüglich Datenverlust und Langsamkeit.

Es ist alles Vermutung, es gibt keine perfekte Lösung (nun, es gibt #204, um diese Lücke zu schließen). Wir fanden, dass das passende Parents-Ding gut genug funktioniert, wir haben keinen Bericht erhalten, seit wir das implementiert haben. Zumindest stellte sich heraus, dass es definitiv besser war, als entweder immer mit dem Elternteil zu übereinstimmen oder nie zu passen. Es war etwas schwierig zu implementieren, sich in selten verwendete und kaum bekannte Regex-Funktionen bestimmter Regex-Bibliotheken einzuarbeiten (deshalb überrascht es mich nicht, dass sich viele Terminals nicht damit beschäftigen), aber ich denke, es hat sich gelohnt. :)

Ich denke, wir müssen den Pfad von Ordnern erkennen und sie auch anklickbar machen.
Einfacher zu debuggen von Code:
WindowsTerminal_2019-07-18_09-11-04

Das TeachingTip- Steuerelement könnte für die Linkvorschau-Funktion verwendet werden

Sie können sich etwas wie das Terminal von VS Code zur Inspiration ansehen. Auch dies ist wahrscheinlich alles selbstverständlich.

Warum nicht einfach denselben Code teilen?

Wahrscheinlich müssen Sie nicht mehr als Text unterstützen, der mit http:// oder https:// beginnt

Ich denke, Sie sollten die Erkennung von www. hinzufügen.

Warum nicht einfach denselben Code teilen?

Nun, es ist in TypeScript geschrieben, einem Dialekt von Javascript ... also wird es in unserem C++-Projekt nicht genau funktionieren.

Ich kann diese Funktion kaum erwarten!! Ich liebe es, STRG gedrückt zu halten und zu sehen, wie ein Link in ConEmu unterstrichen wird, wo ein Linksklick ihn im Standardbrowser öffnet. Hoffentlich schafft es eine einfache Regex-Implementierung von URL-Highlighting vor Ende des Jahres :)

Das TeachingTip- Steuerelement könnte für die Linkvorschau-Funktion verwendet werden

image

Sie können sich vorstellen, dass dieses Steuerelement über dem Link erscheint, mit dem Favicon, dem Site-Namen und der URL- oder Bing-Beschreibung für den Link

Die Funktion wurde in dieser Sizzle-Rolle angedeutet, wie Sie auf @bitcrazed hinweisen - Mein Kommentar

@bitcrazed , das ist

@mdtauk Einverstanden. Wir wollen auf keinen Fall das Rad unnötig neu erfinden. Wenn wir Standard-XAML-Steuerelemente verwenden können, um Funktionen wie diese zu implementieren, werden wir dies tun.

Wenn nicht, arbeiten wir mit den XAML-Steuerelementteams zusammen, um herauszufinden, ob Änderungen an vorhandenen Steuerelementen vorgenommen werden müssen oder ob ein neues Steuerelement mit dem richtigen Verhalten erforderlich ist.

Um ehrlich zu sein, wird die größte Herausforderung hier wahrscheinlich nicht darin bestehen, welches Steuerelement verwendet werden soll, sondern wie man einen Erweiterbarkeitsmechanismus baut, der alle erforderlichen Funktionen bietet und gleichzeitig ausreichend schnell, stabil und sicher bleibt.

Es wäre wunderbar, wenn Sie https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda unterstützen könnten

Bei einer der Ignite 2019-Sitzungen wurde darauf hingewiesen, dass dies über eine Erweiterungsfunktion unterstützt wird. Wir müssen also warten, bis die Erweiterungsunterstützung durchgeführt wird.

@bitcrazed Im Moment ist Windows Terminal beim Benchmark "Regenbogenmodus" unter https://github.com/pew/ternimal wahnsinnig schnell

Ich habe eine Idee: Was ist, wenn Links überhaupt nicht geparst und NICHT anklickbar sind, BIS der Benutzer die Strg-Taste (oder vielleicht Alt) gedrückt hält UND seine Maus über das Windows-Terminal bewegt. In diesem Szenario würde der Code die Zeile scannen (mit Unterstützung für Zeilen, die in vorhergehenden/folgenden Zeilen umgebrochen werden) und genau am Mauszeiger nach einer URL oder einem DATEIPFAD suchen. Wenn ja, markieren Sie die URL, zeigen Sie die Vorschau an, machen Sie sie anklickbar (solange die Strg-Taste noch gedrückt wird) usw.

Wenn der Benutzer mit der rechten Maustaste klickt, parsen Sie außerdem die ununterbrochene Zeichenfolge an dieser Stelle (also stoppen Sie bei Leerzeichen vor/nach der angeklickten Zeichenfolge), wodurch das gesamte Wort hervorgehoben wird. Führen Sie dann das Link-Parsing durch. Wenn ein Link erkannt wird, zeigen Sie einen Menüpunkt "Open Link" an.

Sowohl im Strg-und-Hover- als auch im Rechtsklick-Szenario ist der Parser identisch:

  • Holen Sie sich die schwebende "Zeile + Spalte" des Mauszeigers.
  • Wenn diese Spalte ein Leerzeichen ist, tun Sie nichts, da nichts zu scannen ist.
  • Wenn diese Spalte KEIN Leerzeichen ist, sammeln Sie alle "verbundenen" Zeichen davor und danach, indem Sie scannen, bis Sie auf Leerzeichen treffen (Neuzeilen, Leerzeichen usw.; sowohl vertikale als auch horizontale Leerzeichen). Das Ergebnis ist ein Wort, ein Link oder etwas anderes.
  • Führen Sie ein einfaches Link-Parsing davon durch, um festzustellen, ob es sich um eine URL handelt. Führen Sie auch Dateisystem-Parsing durch, wenn etwas wie ein lokaler Dateipfad aussieht (zum Beispiel würde C:\Tools\foo.cpp:80 von links nach rechts geparst und erkannt, dass C:\Tools\foo.cpp eine Datei ist).
  • Wenn eine URL/ein Dateipfad erkannt wird, behandeln Sie den Link.

Diese beiden Lösungen wären DIE leistungsstärkste Antwort, und das Halten von Strg (oder vielleicht Alt) ist keine große Sache. Viele Terminals gehen so damit um, wie zum Beispiel das macOS-Terminal. Im macOS-Terminal halten Sie Befehlstaste + Doppelklick gedrückt, um Links zu öffnen, oder klicken Sie mit der rechten Maustaste, um ein Menü zu erhalten, das das markierte Wort / den Link "parsiert" (wenn Sie mit der rechten Maustaste auf einen Link klicken, wird dieser Umstand erkannt und markiert das ganzen Link) und wählen Sie dann "Link öffnen".

Alle Alternativen wären verschwenderisch und viel langsamer.

PS: Falls es hilfreich ist, definiert das Alacritty-Terminal diese Zeichen als "Zeichenfolge-Link-Trennzeichen": ",│`|:\"' ()[]{}<>\t" , was nützlich sein kann, um zu definieren, wie Strings geteilt werden, um Pfade, URLs usw. in den angeklickten zu erkennen /hovered-Zeichenfolge. Wenn ich einen Parser schreiben würde, würde ich die oben beschriebene Technik "Komplette Zeichenfolge ohne Leerzeichen abrufen" verwenden, gefolgt von einem Durchgang durch den "Streifen um den Müll wie <> oder () danach, um den endgültigen Link zu erkennen.

Hey @VideoPlayerCode - danke, dass du deine Gedanken hier eingereicht hast.

Ich stimme zu, nur das Analysieren von URLs, wenn der Benutzer eine Taste / einen Akkord drückt, würde das Zurückstellen des Regex-Scannens ermöglichen, aber es würde immer noch bedeuten, dass wir URLs, die in Text eingebettet sind, nicht farblich hervorheben könnten - etwas, nach dem bereits viele Benutzer gefragt haben.

Außerdem sind URLs nur eine von einer Klasse von Textmustern, die wir suchen und identifizieren möchten: Zum Beispiel würde ich gerne die Möglichkeit haben, Terminal anzuweisen, ein rotes Kästchen mit einer gelben Füllung unter dem passenden Text zu zeichnen ein angegebenes Textmuster/regex/etc. - Stellen Sie sich vor, Sie könnten auf diese Weise Fehlermeldungen in einem Webserver-Protokoll hervorheben, während es vorbeiströmt. 😁

Ich bin mir ziemlich sicher, dass wir eine Strategie finden werden, um Muster/Regex-Übereinstimmungen auf ziemlich performante Weise zu identifizieren. Letztlich. Eines Tages

@bitcrazed

Ich stimme zu, nur das Analysieren von URLs, wenn der Benutzer eine Taste / einen Akkord drückt, würde das Zurückstellen des Regex-Scannens ermöglichen, aber es würde immer noch bedeuten, dass wir URLs, die in Text eingebettet sind, nicht farblich hervorheben könnten - etwas, nach dem bereits viele Benutzer gefragt haben.

Ahh, mir ist gerade aufgefallen, dass die Funktion "Immer aktiver Scanner" im Marketingvideo vorgestellt wurde und von den Nutzern erwartet wird. Hoppla.

Außerdem sind URLs nur eine von einer Klasse von Textmustern, die wir suchen und identifizieren möchten: Zum Beispiel würde ich gerne die Möglichkeit haben, Terminal anzuweisen, ein rotes Kästchen mit einer gelben Füllung unter dem passenden Text zu zeichnen ein angegebenes Textmuster/regex/etc. - Stellen Sie sich vor, Sie könnten auf diese Weise Fehlermeldungen in einem Webserver-Protokoll hervorheben, während es vorbeiströmt. 😁

Woah, ich liebe diese Idee! Es wäre fantastisch, eine Regex in der Benutzerkonfiguration festlegen und auswählen zu können, wie Übereinstimmungen hervorgehoben werden sollen.

Ich bin mir ziemlich sicher, dass wir eine Strategie finden werden, um Muster/Regex-Übereinstimmungen auf ziemlich performante Weise zu identifizieren. Letztlich. Eines Tages

Nun, wenn ein kontinuierliches Scannen erforderlich ist... hier sind einige Ideen:

  • Wenn Sie die Scans durchführen, verwenden Sie nur den aktuell sichtbaren Bildschirmpuffer. Wenn die Bildschirmpuffer beginnen mit eineine Nicht-Leerzeichen, auch den Text enthält , den Bildschirm aus , war bis zum vorherigen Leerzeichen oben (wie wenn die obere Linie ist hub.com/foo , ist aber eigentlich eine gewickelte Fortsetzung von https://git<wrap>hub.com/foo ).
  • Das Ausführen der Regex in diesem Puffer müsste auf eine von vier Arten (oder Kombinationen von allen) gedrosselt werden:
  • A: Führen Sie einen Scan nur dann durch, wenn für eine angemessene Zeit, z. B. 300 ms, nichts auf den Bildschirm geschrieben wurde (kein neuer Text/geänderte Zeichen). Das bedeutet, dass, wenn schnell scrollende Protokolle oder "Katze" aktiv sind, diese ungehindert ausgeführt werden.
  • Oder B: Führen Sie es in einem pulsierenden Intervall wie 300 ms aus, in dem Sie die Ausführung blockieren, einen schnellen Scan durchführen, Markierungen bei Bedarf markieren und dann mit der Ausführung fortfahren (die eingehenden Standarddaten verbrauchen).
  • Oder C: Scannen Sie in Echtzeit, wenn das Scrollen langsam ist, aber stoppen Sie das Echtzeit-Scannen vollständig, wenn die Ausgaberate sehr hoch ist. Zum Beispiel würde "cat 10mbfile.txt" das Echtzeit-Scannen deaktivieren, da das Terminal eine wahnsinnige Ausgaberate bemerken würde. Und sobald die wahnsinnige Ausgabe aufhört, durchlaufen Sie einmalig den alten Ausgabepuffer, der gerade gestreamt wurde. Diese Idee gefällt mir am besten. Und kombinieren Sie es mit der Technik, nur den sichtbaren Bildschirmpuffer zu scannen.
  • Oder D: Scannen Sie alle Daten live, wenn sie eintreffen (die Leistung wird beeinträchtigt) und die Ergebnisse zwischenspeichern. Immer wenn Zeilen hinzugefügt oder Zeichen im Puffer ersetzt werden, scannen/rescannen Sie nur diese Zeilen.
  • Ziehen Sie auch nur unterstützende Links in Betracht, zumindest für Echtzeit-Scans. Weil benutzerdefinierte Regexps buchstäblich verrückt genug sein könnten, dass sie mit dem gesamten Puffer übereinstimmen. Stellen Sie sich vor, Sie würden sogar ANFANGEN, einen regulären Ausdruck zu finden, der von den Wörtern "Log Result:" bis hin zu einer Zeile mit der Aufschrift "End of Log" in Ihrem "benutzerdefinierten regexp"-Beispiel passt. Das könnten Tausende von Datenzeilen sein, die übereinstimmen sollten. Verdammt, dieser Regexp würde nicht einmal wissen, wie er etwas abgleicht, bis er am Ende des Spiels die Klemmung "End of Log" sieht. Sehr verrückt...
  • Wenn Sie nur Links unterstützen, können Sie wie verrückt optimieren, indem Sie nur nach "http:" und "https:" (ohne Berücksichtigung der Groß-/Kleinschreibung) mit einem ziemlich einfachen, optimierten Mustervergleicher scannen und dann _nur_ einen "vollständigen Regexp-Engine"-Scan durchführen. auf der durch Leerzeichen getrennten Zeichenfolge um diese Übereinstimmung.
  • Seien Sie auch vorsichtig mit Leuten, die "cat" auf Dateien mit endlosen Run-on-Zeichen machen, da dies die Leistung beeinträchtigen wird.
  • Für Methoden A, B und C: Wenn der Benutzer im Puffer rückwärts scrollt, um alten Text zu sehen, ist er wählerisch und erwartet nicht, dass Links während eines gedrosselten Pulsintervalls "auftauchen". So können Sie beim manuellen Scrollen mit den Bildlaufleisten schneller scannen. Aber autsch, ich kann mir kaum vorstellen, wie grob der Code wäre, um in Echtzeit fließenden / sich selbst ändernden Text auf performante Weise zu scannen.

Kurz gesagt: Oh je, viel Glück, die Erwartungen der Benutzer an ein ziemlich verrücktes (in einer schlechten Leistung) Feature zu erfüllen. Dieses Problem ist ein bisschen wie der Versuch, einen schnellen Regexp zu schreiben, um eine HTML-Webseite zu scannen, die ständig mehr und mehr Daten herunterlädt und alte Daten selbst modifiziert...

Danke, dass du deine Gedanken teilst :) Schön, dass dir diese Funktion genauso gut gefällt wie mir ;)

Welchen Scan-Mechanismus wir auch immer verwenden, am Ende wird es ziemlich sicher sein:

1) Asynchron
2) Effizient
3) Konfigurierbar

Da hast du den Nagel auf den Kopf getroffen. Ihre Kommentare zu perf - dies ist ein wichtiges Anliegen eines Features wie dieses, dem wir besondere Aufmerksamkeit schenken müssen. Es war einfach nicht möglich, eine allgemeine Lösung auf der alten Konsolen-Engine zu entwickeln, aber wir nähern uns dem Punkt, an dem uns insbesondere die neu gestaltete Engine, die dem Terminal zugrunde liegt, den Zugriff und die Funktionen geben sollte, die wir brauchen.

Wenn wir nur mehr Entwickler und/oder ausreichend motivierte Community-Mitglieder mit den Fähigkeiten und der Zeit hätten, um zu helfen

In der Sekunde, in der Sie Erweiterungspunkte haben, sind wir sicher, dass es viele von uns mit den Fähigkeiten gibt. Und wir werden uns sehr bemühen, die Zeit zu schaffen :) Zähle mich zumindest dazu.

Freue mich auf diesen Tag :)

Wenn dies erreicht wird, wäre es großartig, die Standardanwendung pro Profil überschreiben zu können. Der ultimative Traum wäre es, verschiedene Akkorde verwenden zu können, um eine URL in verschiedenen Browsern zu starten.

Ich kann mir vorstellen, dass Sie sich bereits bewusst sind, aber es gibt einige Sicherheitsrisiken, die in der Vergangenheit zu ähnlichen Problemen geführt haben, insbesondere hatte iTerm Probleme bei der DNS-Suche, wenn der Mauszeiger über Links fuhr, um sie vor dem Durchklicken hervorzuheben. Dies war ein ziemlich großes Problem für Sicherheitsanalysten, die Live-Angriffe untersuchten, verursachte jedoch auch Probleme, da DNS-Lookups nach URLs gesendet wurden (einschließlich sensibler Informationen - z. B. Passwörter) im Klartext.

Ich werde nicht so weit gehen zu sagen, dass dieses Verhalten richtig oder falsch ist, aber auf jeden Fall etwas, das man bei der Umsetzung beachten sollte. Als Referenz:
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

Ich schreibe, um respektvoll zu bitten, dass dies klein mit den Augen für die größere Funktionsanfrage beginnt. Es wäre ein guter Anfang, http(s)://-Links im Standardbrowser zu öffnen, wenn Sie mit STRG + darauf klicken! So viele Befehlszeilentools spucken Weblinks aus, die jetzt kopiert und in einen Browser eingefügt werden müssen. Wenn wir nur diese Funktionalität hätten, könnte das meiner Meinung nach für eine ganze Weile ausreichen. Danke für deine Rücksicht!

Ich mag das Windows-Terminal, aber ich hasse es, jedes Mal zu einem anderen Terminal zu wechseln, wenn ich auf Links klicken möchte. Das ist alles.

Springen Sie hier auf den Zug, um nach dieser Funktion zu fragen. Da ich von macOS komme, vermisse ich wirklich eine schnelle Möglichkeit, auf URLs zu klicken, ohne das umständliche Kopieren/Einfügen-Ritual durchlaufen zu müssen.

Anklickbare Links sind auf der Roadmap für V2.0: https://github.com/microsoft/terminal/blob/master/doc/terminal-v2-roadmap.md

Im Namen einiger Abonnenten, die dies auf bemerkenswerte Änderungen / Aktualisierungen achten; Können wir dieses Problem vorerst sperren / stummschalten?

Die zusätzlichen Anfragen, +1, bieten keinen Wert und bringen mehr Verschmutzung in unsere Posteingänge. Wenn jemand dazu beitragen möchte, kann er eine CR erstellen und auf dieses Problem verweisen. :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen