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"