Windowsのクリップボードからwsl上のvimにコピペするのに苦労した話

久しぶりの,本当に久しぶりの更新です.

驚くことに,約9ヶ月のブランクが空いてしまいました.とくに更新の頻度を決めていたわけではありませんが,9ヶ月も空いてしまうとさすがに「怠惰か!」とセルフツッコミを入れたくなってしまいます.

勿論,この9ヶ月何もしていなかったわけではありません.ブログの方は放置しっぱなしでしたが,ハッカソンや就活,個人開発,果ては商談まで,色々と進めておりました.最初は単純に多忙で更新ができていなかったのですが,一度更新を止めてしまうと少々ばつが悪く,なかなか次の記事を書けないでいました.今回,久しぶりに記事にしたい内容が出てきたので,これを機に書いてみようと思います.

 wsl上でvimを開いて,Windowsクリップボードの内容をペーストしたい

wsl上でvimを使ってコードを書いていた際,Windowsクリップボードの内容をそのままペーストしたいと思うときがありました.しかし, Ctrl+V は当然機能せず,ネットで調べた Shift+Insert のショートカットキーも効きませんでした.コピペできるようになるまでにいくつか障壁があったので,今回はその方法を記事にしようと思います.

環境は以下のとおりです.

 問題点1:Shift+Insertが効かない

ネットで調べるとWindows環境では CTRL+V の代わりに Shift+Insert を使ってもクリップボードからペーストできると書かれていたのですが,wsl上のvimでこれを実行してもエディタ上に <S-Insert> と入力されるだけでペーストできません.

解決策

このIssueを参考に,wsl上のホームディレクトリ直下に.vimrcファイルを作成し,そこに

map! <S-Insert>  <C-R>+

と記入し,キーのマッピングを行います. <C-R>Ctrl+R の入力に対応し,vimの挿入モードでは貼り付けに対応します.また, + はクリップボードの内容を格納したレジスタで, <C-R>+ はクリップボードの内容を貼り付けることを意味します.わざわざ Shift+Insert をマッピングしなくても,挿入モードで Ctrl+R からの + を叩けば貼り付けできそうですね.

これで解決!かと思いきや,なぜかこれでもうまくいかず…

問題点2:そもそもクリップボードをvimと共有できていない

ノーマルモードで :reg と入力し,レジスタの一覧を見てみると, + がありません.wsl上で動かしているので,Windowsのクリップボードがvimから見えていないようです.

解決策

手順1:vim上でクリップボードを有効にする(いらないかも?)

wsl上で動いているvimがclipboard機能をサポートしていなかったので,このIssueを参考に以下のコマンドでパッケージをインストールするとclipboardが有効になります.

ただ,これはどうやらvim上でコピーした内容をWindowsなどのクリップボードに共有するための機能のようなので,今回は必要ないかもしれません.

apt-get install vim-gtk
手順2:VcXsrvをインストールし,XLaunchを実行する

ここからVcXsrvをインストールします.インストールが終了したら,スタートメニューからXLaunchを実行し,全てデフォルトの設定のまま起動します.これにより,ローカルでxサーバが立ち上がります.

手順3:wsl上で環境変数を設定する

xサーバを介してWindowsのクリップボードをwslのvimと共有するには,wslの環境変数 DISPLAY にwslのIPアドレスを設定する必要があります.こちらの記事を参考にwslのIPアドレスを取得し, DISPLAY 変数に格納します.具体的には,wslのホームディレクトリにある.bashrcに以下を追記します.

LOCAL_IP=$(ipconfig.exe | awk 'BEGIN { RS="\r\n" } /^[A-Z]/ { isWslSection=/WSL/; }; { if (!isWslSection && /IPv4 Address/) { printf $NF; exit; }}')
export DISPLAY=$LOCAL_IP:0
手順4:bashを再起動

wslを一旦抜けて入り直し,bashを再起動します.再度vimを起動し, :reg でレジスタ一覧を見ると + レジスタが追加されており,そこにWIndowsのクリップボードの中身が入っています.あとは,挿入モードで Shift+InsertCtrl+R & + を叩くだけです.

 おわり

wslを使っているとメモリの枯渇や今回のような設定など苦労させられることが多いです.改めて開発におけるMacの偉大さを感じます.

参考資料

Inserting in insert mode inserts <S-Insert> · Issue #253 · equalsraf/neovim-qt · GitHub

vimindex - Vim日本語ドキュメント

How to copy text from vim to system clipboard? · Issue #892 · microsoft/WSL · GitHub

ASCII.jp:Windows Subsystem for LinuxのBashの初期設定【後編】

WSL2でVimのクリップボードをWindowsと共有する方法 | 電脳手帳

とほほのAWK入門 - とほほのWWW入門