サーバにsshしてdockerで開発する時間が増え、tmuxで二つpaneをつくって一つはdocker exec -it docker_image /bin/bash
してmakeしたりipythonを起動したりし、もう一つはvimで編集というスタイルで開発をしていた。
そこで不便に思っていたのが、サーバのvimからクライアントからclipboardにコピーできないという点だった。
vimからコードの一部をコピーして、ipythonに貼り付けて実行、というのがスムーズにできず不満だった。
長い間lemonadeやclipperを使っていたけれど、port forwardingせずにsshしている時に繋ぎ直すのが面倒だった。 またtailscale sshが現状port forwardingできない *1。 vscode remote developmentに浮気したりもしたけど、やっぱり慣れたvimがよい。 vimで:terminalするのもよいが、普段bashでctrl-wを使って単語消去しているので、ctrl-wの挙動がvim内外で変わるのが好みではない。vimがたまにクラッシュして内部で起動したbashを持っていくこともあってあまり常用していない。
ターミナルエミュレータって文字列を通信しあってるんだから、同じようにターミナルエミュレータの方で情報を通信してクリップボードを読み書きしてくれればいいじゃん、と思ってググってみると、kittyにそういう機能があるらしい(clipboard - kitty)ということでkittyを一通りセットアップし、
vimrcに以下を追記した。
kittyコマンドはkitty +kitten ssh server
とすると自動的にインストールされる(要python)。
if executable('kitty') nnoremap <leader>Y :call system('kitty +kitten clipboard', @0)<CR> vnoremap <leader>Y :call system('kitty +kitten clipboard', @0)<CR> else " clipper https://github.com/wincent/clipper nnoremap <leader>Y :call system('nc -N localhost 8377', @0)<CR> vnoremap <leader>Y :call system('nc -N localhost 8377', @0)<CR> endif
フーこれでコピペができる快適~と思って使っていると、一つkittyのバグに遭遇してしまった。 kittyでvimを起動して日本語を使っていると、確定せずに次の単語を入力した際にpreeditがうまく描画されてくれない。
Japanese input bug? · Issue #3330 · kovidgoyal/kitty
実装もちょっと見た感じだとrace conditionが絡むめんどくさいバグっぽくて修正は諦めた。
そもそもclipboard情報の送信ってどうやって実現してるんだろう、と思って調べてみると、 ANSI OSC sequenceというプロトコル(?)があって、若干の方言はあるもののOSC52に対応しているものであればうまくクリップボードを制御できるらしい。 で、vim plugin (ojroques/vim-oscyank: A Vim plugin to copy text through SSH with OSC52) もある.
じゃあと思ってvim-jpで最近話題のweztermを使い始めた。
ちゃんとIMEも動作し、GPUも使ってくれ、拡張性が異常に高く、ドキュメンテーションも個人開発なのに凄まじい充実度を見せる *2。
クリップボードも制御できる*3。
フォントもfont_with_fallback
で複数自由に設定できる。
alacrittyでもよかったけれど、タブがやっぱり欲しかったのでweztermの方がよい。
当分weztermで過ごしてみようと思う。
追記: ちょっとwezterm描画が遅くない?
*1:Does port forwarding work with tailscale ssh? - Tailscale About articles (troubleshooting, info) - Tailscale
*2:開発者の負担が心配
*3: weztermではセキュリティの問題でclipboardへのwriteはできるがreadはできない。kittyではreadもできるように設定できる。理屈はわかるけれど、そんなやばいサーバにsshしてる時点でもうダメだと思うんだが…Support OSC 52 clipboard querying (opt-in) · Issue #2050 · wez/wezterm · GitHub