概要
クリップボード設定用制御文字列(OSC52)をVimから使ってログイン先のホスト上のVimでヤンクした結果をローカルのクリップボードに反映させたい。
既存の方法は日本語が文字化けしたりプラグイン化してなかったりしたので、プラグインを作って使ってみたら色々捗ったというお話。
作ったプラグイン
インストール方法(dein.vim)
下記の行を追加
call dein#add('greymd/oscyank.vim')
使い方
Visualモードでコピーしたい範囲を選択
:Oscyank
を実行(画面上は'<,'>Oscyank
となる)OSC52を使ってクリップボードに内容がコピーできてる。
その他の仕様は github.com/greymd/oscyank.vimを参照
作ったきっかけ
普段からVimでヤンクした結果をクリップボードに反映させている方は、リモートホストのVimでヤンクをした内容もまたローカルのクリップボードに反映させたくなりますよね。
そんな時はOSC52と呼ばれるクリップボードの内容を変更できる制御文字を使うのが便利です。iTerm2やTeraTermなどのOSC52に対応した端末エミュレータをお使いの方は1、端末にこの制御文字を出力することで、クリップボードの内容を操作することができます。下記の記事および記事内から辿れるリンクは参考になります。
端末エミュレータに対して、リージョンをクリップボードにコピーするための制御文字列(OSC52/PASTE64)をEmacsから投げる方法。
OSC52、またはPASTE64と呼ばれる制御文字列がある。これを(対応した)端末エミュレータが受け取ると、画面には何も表示しない代わりに、引き渡された文字列をOSのクリップボードに格納してくれる
で、このOSC52をVimのレジスタの内容に対して使うにはどうしたらよいか?というとQiitaに下記の記事がありました。
Vimからクリップボードインテグレーションシーケンス(PASTE64/OSC52)を利用する
しばらくは、上記の記事の方法をiTerm2で使っていたのですが、手元で試した限り、マルチバイト文字が文字化けしてしまうことに気づきました。また、個人的にはVimのプラグインマネージャでインストールできるようにプラグインになっててほしいのですが、そうでもないようです。
ということで完全に自分用に、マルチバイト文字対応化し、なおかつヤンクした内容をOSC52を使ってリモート→ローカルへのクリップボード反映ができるVimプラグインを作成し、粛々と使っておりました。
しかし最近、個人用に使っていたつもりがissueが立ってしまいました。ああ、意外と公開したら喜ぶ人もいるのかなと思ったのでちょっと綺麗にしてこのような記事を書いています。下記のプラグインになります。
Vimのプラグインは実は作るのが初めてだったので勝手が分からず、Vimプラグインが出来るまでという記事を見つつ見よう見真似で作りました。色々お作法に従っていないかもしれません。そこは暖かく見守って下さい2。
Tips
:OscyankRegister
ヤンクしたあとに「あ、ローカルのクリップボードに反映させるの忘れた!」と思うことが多いので、ノーマルモードで動作する :OscyankRegister
というコマンドも用意しています。OSC52を使って既にレジスタに存在する内容をクリップボードに書き出します。いちいち再選択しなくてもヤンク済みの内容をクリップボードに反映させることができます。
ショートカットキー
参考までに、私は下記のように<leader>
とy
キーでOscyank
コマンドが実行されるようにしています。
noremap<leader>y :Oscyank<cr>
<leader>
にはスペースを設定しているので3、
- 範囲選択 →
Space
+y
キー
でコピーができるという寸法です。これにしてからなかなか捗ります。
我慢できない方はPRお待ちしています。 ↩
Vimの生産性を高める12の方法に倣っています。 ↩