Hyperlinks in Terminal Emulators

(gist.github.com)

25 points | by nvahalik 3 hours ago ago

9 comments

  • dust42 an hour ago

    I really think this is a security disaster waiting to happen, landing right in time for all the agentic terminal apps:

      printf '\e]8;;http://evil.com\e\\https://good.com\e]8;;\e\\\n'
    
    The next step would be to embedd a full javascript VM in the terminal and a CSS engine.
  • oldestofsports 6 minutes ago

    Browsers are great at hyperlinks, like really great. How about using browsers for hyperlinks instead?

  • tombert 2 hours ago

    On my second day when I worked at Reddit, I learned by accident that I do not want my terminal to have clickable links.

    I was working on image compression, and we had a script where we would render a column with the original image link, and a column with the new compressed image, and a column with the relative percentage of size to PNG, and there would be like 200 rows at a time.

    I managed to somehow accidentally click on a link in iTerm, my browser opened, and I discovered what "sounding" [1] is, on a company computer, in the company office.

    I saw it, whispered "oh fuck!", and quickly killed my browser. I don't think anyone saw me but I was extremely worried that I was going to get fired on my second day of work for viewing porn on a company computer in front of everyone, even though it was a legitimate accident.

    So now I don't want my links to be clickable. If there's a link I'll highlight it and paste it into Firefox manually.

    [1] If you do not know what sounding is, I do not recommend you look it up, just know that it's a weird sex thing that I wish I didn't know about and cannot unsee.

    • derefr an hour ago

      In every implementation I've seen, the link only becomes clickable if you hold down a modifier key. By default, the links are just text. Which should make intuitive sense, because otherwise it'd be breaking existing semantics, as it would e.g. make it impossible to highlight the underlying text to copy-and-paste. (Or to send a click event to the underlying PTY-controlling process-group leader when mouse reporting is active.) I presume your "somehow" happened to involve you holding whatever modifier key your terminal emulator required.

      Also, sounding isn't a weird sex thing per se; it's a mundane (and somewhat painful) medical procedure. One that some people happen to coincidentally have a kink for, mostly due to the discomfort involved. But "some weird people having a kink for medical procedure X" is true of many/most medical procedures.

      • knodi123 an hour ago

        > the link only becomes clickable if you hold down a modifier key.

        Fun trick not a lot of people know -

        In a web browser, links which are normally clickable become UN-clickable if you hold a modifier. On a mac, it's (option). It's helpful if you want to select text inside a large link (or in a button) so you can copy it.

        • sheept an hour ago

          This might be operating system/browser-specific. On Windows Chrome, shift-click opens in new window, ctrl in new tab, and alt downloads the link.

      • tombert an hour ago

        It was iTerm, and yeah I it did require a modifier key.

        I had gotten it in my head that the way that you highlight a line in iTerm (and I have no idea where I heard this or why I thought it) was holding command and clicking on the line. It was a mistake I made exactly once.

        I am afraid I didn't investigate sounding after I saw the horrifying image; I only learned the name for it after I described the image to someone and they told me what it was; I guess I assumed it was just a weird sex thing, I didn't realize that there was any practical medicine stuff to it.

    • westurner 42 minutes ago

      You probably could have just loudly explained to your reddit coworkers

  • kristopolous 2 hours ago

    tl;dr

    here's coming from markdown

            LINK      = ["\033]8;;", "\033]8;;\033\\"]
            re.sub(r"\[([^\]]+)\]\(([^\)]+)\)", process_links, line)
            def process_links(match):
              description = match.group(1)
              url = match.group(2)
              return f'{LINK[0]}{url}\033\\{UNDERLINE[0]}{description}{UNDERLINE[1]}{LINK[1]}'