memo

2024-08-04

tmux 内で開いている emacs 上に表示されている長い URL を hyperlink として popup させる方法

(タイトルが長い。)

  • 状況としては、

    • サーバーに ssh で入って、そこで動かした tmux 内で emacs を使っている。

    • terminal 上で表示されてる URL は、基本的には terminal の機能で ctrl + click なんかで手元のブラウザで開くことができる。

      • が、これが1行に収まらないような長い URL の場合、 emacs が行が折り返された目印として \ を挿入してしまうため、 terminal の表示としてはその部分で URL が途切れてしまう。

        • そうなると、 terminal の機能で URL を開こうとしてもその部分で URL が途切れてしまい、正しく開くことができない。

    • emacs はサーバー上で動いているため、そこから手元の X/wayland のクリップボードにコピーするとか、手元のブラウザに URL を渡す(ブラウザを起動する)とかもできない。

ということで困っていたのだけど、 tmux 3.4 で OSC 8 hyperlinks のサポートが追加されたのを見かけたので、これを利用して「tmux の popup を開いた中で hyperlink として URL を表示すれば、長い URL でも terminal が正しく開けるのでは?」って気がしたので、やってみた。

  • まずは .tmux.conf で OSC 8 hyperlinks が使えるように設定する:

    set-option -ga terminal-features "*:hyperlinks"
    
  • 渡された URL を hyperlink にして tmux の popup で表示するスクリプトを用意する:

    #!/bin/sh
    url="$1"
    tmux display-popup printf '\e]8;;%s\e\\%s\e]8;;\e\\\n' "$url" "$url"
    
  • 用意したスクリプトが emacs のブラウザとして実行されるように設定する:

    (setq browse-url-browser-function 'browse-url-generic
          browse-url-generic-program "/path/to/popup-url.sh")
    

これで emacs 上でリンクを開く(ブラウザを起動する)とか、明示的に browse-url を実行するとかすれば、 tmux の popup が出てそこに hyperlink の形で URL が表示されるようになる。

  • 備考:

    • tmux の popup を閉じるのは Ctrl-C っぽい。

    • 現時点で tmux 側にバグがあるっぽく? popup 内に表示された hyperlink が status-interval の秒数が経過すると hyperlink ではなくなってしまう。 少なくともこの popup を出している間は status-interval を 0 に(設定をを無効に)しといてやったほうがよさそう。

    • 今になってよく考えたら単純に tmux で画面分割して URL 表示するというだけでも良かったかも。

      • こんな感じで: tmux split-window -l 3 sh -c 'echo -n "$0" && sleep 60' "$url"