ssh 越しにクリップボード共有したり URL 開いたりする lemonade の便利設定

私は普段は Windows マシンから自宅サーバLinuxssh で接続して作業しており、端末内で作業が完結している間はいいのだけど、Web ブラウザはローカル側なので、URL を開いたりクリップボードのやりとりなどが面倒。

そこで便利なのが lemonade!

GitHub - lemonade-command/lemonade: Lemonade is a remote utility tool. (copy, paste and open browser) over TCP.

ssh 越しから URL を飛ばしてローカルでブラウザを開いたり、リモート側からローカルのクリップボードの読み書きができる。便利。 lemonade を使う上であれこれやったのでメモ。

port forwarding

lemonade 作者の pocke さんはローカルマシン内で動いている仮想環境とのやりとりを想定していたようで、お互いのマシンが直接やりとりすることを想定していたようだけど、私の場合は外部マシンなのでそうは行かない。

これは SSH Remote Forwarding を使えば問題なく利用できる。

putty (Windows) の場合:

接続→SSH→トンネル にて、 源ポート: 2489 送り先: localhost:2489 リモート として、「追加」ボタンを押す。

OpenSSH (Mac/Linux) の場合:

以下の設定ファイルを作成する(ホスト名は環境に合わせる)。

# ~/.ssh/config
Host your.hostname
  RemoteForward 2489 localhost:2489

このようにするとリモートに ssh でログインした際に、リモート側は 2489 番ポートで LISTEN を始める。ここに通信すると、ローカルマシンの localhost:2489 にフォワードしてくれる。

なのでリモート側では、lemonade はリモート側の localhost に接続すれば OK。以下のように設定しておく。

# ~/.config/lemonade.toml
host = 127.0.0.1

注意点として、同じリモートマシンに複数の場所から ssh しちゃうと当然ながらうまく動かない。何度 URL を開こうとしても開かれず、実は別のクライアントマシン上でガンガン開かれていた、ということが起きる。

Windows で lemonade をバックグラウンドで動かす

ローカル側のマシンでは、lemonade はサーバとして常駐する。普通にコマンドプロンプトから実行すると、コマンドプロンプトが常駐してしまう。不便。

というわけでこの件について mattn さん(@mattn_jp)に相談したところ、以下のようにして lemonade.exe を生成することで、プログラムが端末から切り離されて裏で動作するようになるらしい…!

# 2023-09-25 更新。旧コマンド: go get -u -ldflags="-H windowsgui" github.com/pocke/lemonade
go install -ldflags="-H windowsgui" github.com/lemonade-command/lemonade@latest

端末から切り離されるので標準入出力などは使えなくなっちゃう(=ログが消える)けど、まあそこまで困らない。mattn さんありがとうございます!

というわけでこれをマシン起動時に起動するようにショートカットを作成。

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 以下にショートカットを作成しておけばログイン時に実行される。

最初は nssm でサービス化を試したのだけど、なぜかうまく動かず…。この方法でなんとか動いたので良かった。

tmux のバッファと lemonade を連携する

tmux で範囲選択をしてコピーしたり、tmux のバッファから貼り付けを行う際に、lemonade 経由でローカルのクリップボードが使えると便利。私は tmux を vi mode で使っているので、以下のような感じ。lemonade コマンドがある場合だけ実行。

if-shell '[[ -x ~/.go/bin/lemonade ]]' \
  'bind-key ] run-shell "~/.go/bin/lemonade paste | tmux load-buffer -" \; paste-buffer ; \
   bind-key -t vi-copy y copy-pipe "~/.go/bin/lemonade copy"'

私の環境が若干アレで、.tmux.conf が読み込まれるタイミングで ~/.go/bin が PATH に入っていなかったので微妙になってる。これは事前に PATH に入ってる環境ならマシにできると思うので、今後やっていきたい。

emacs mode の人は別途調べてみてください。

Vimクリップボード操作と lemonade を連携する

Vim では "+y"+pクリップボードからコピー、ペーストができる。当然ここでも lemonade が使いたい。

というわけで fakeclip.vim…と言いたいところなのだけど、fakeclip.vim は特に lemonade をサポートしていない。仕方ないので fork してサポート足してみた。

追記: PR はすでにマージされているので本家を使えばOK

使う場合は以下のような感じ(dein.vim の場合):

call dein#add('kana/vim-fakeclip')

これで、環境にクリップボードサポートがない場合は lemonade が使われるようになる。

一応 PR も出したのだけど、そもそも微妙な変更なせいかスルーされ中。実際、やるならこういうやっつけ実装ではなくて内部構造を整理すべきな感じはする…。

以上

lemonade の便利設定の紹介でした。ssh で暮らしている人は便利なので使おう。