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

スポンサード リンク

WSL2でVimのヤンクをWindowsのクリップボードを共有したかった。基本的には Set up Vim on Ubuntu on Windows Subsystem for Linux 2 (WSL2) to share clipboard の記事の手順で事足りたのだが,環境変数 DISPLAY の設定方法だけ工夫する必要があったので記録を残す。

VimとXの設定

まず Set up Vim on Ubuntu on Windows Subsystem for Linux 2 (WSL2) to share clipboard の記載にしたがって,Clipboard機能を有効化したVimをコンパイルし,VcXsrvをインストールする。

環境変数DISPLAYの設定

次に,WSL2のVimのヤンクとWindowsのクリップボードを共有したり,X Windowの画面を表示するためには,環境変数 DISPLAY を正しくターミナルに設定する必要がある。WSL2はWindowsとは異なるIPアドレスを持いて,DISPLAY には以下のような値が必要となる。

$ echo $DISPLAY
192.168.11.100:0

これは以下の2行.zshrc.zshenv などに記入しておけば自動設定できる。

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

ただし,不意に (おそらくネットワークをつなげ直す等のタイミングで),WSL2のIPアドレスが変化することがある。このとき環境変数 DISPLAY のIPアドレスも更新しなければならない。もし更新しなければ,古い DISPLAY への接続がタイムアウト待ちになって,Vim の起動に30秒以上の時間がかかるようになるといった弊害が生じる。

そこでzshのhook機能を利用して30秒に1回は環境変数を更新するように設定する (正確には30秒経ってから任意のコマンドを実行したら更新)。

# 定期的に環境変数 DISPLAY を更新するための設定

## 関数として環境変数DIAPLAYを更新する処理を定義
function update_display(){
  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
}

## 自動実行対象として update_display関数を設定
PERIOD=30  # 30秒ごとに更新
autoload -Uz add-zsh-hook
add-zsh-hook periodic update_display

以上の設定を施せば,安定してWSL2のVimのヤンクとWindowsのクリップボードを共有できるようになる。

参考URL

Comments !

social