DockerコンテナのVimでヤンクした内容をWindowsホストのクリップボードへ共有する方法
Metadata
Date: August 30th, 2022
Category: わたしの開発環境を充実させたい
Dockerコンテナ上のVimでヤンクした内容をWindowsホストのクリップボードへ共有する方法がなかなか見つからず苦戦したのですが、やっと参考になる記事を見つけました。
参考記事ではsocat
を使います。socat
を初めて知ったのですが、TCPコネクションで待ち受けたり、TCPコネクションで通信したりできるようです。うまく動くようになったときにやったことを残しておきます。
WSL側の対応
ホストのWSL側ではsocat
でヤンクした内容をTCPコネクションで待ち受ける必要があるため、WSLにsudo apt install socat
でsocat
をインストールします。
次に、~/.bashrc
に次の内容を追記します。WindowsのWSL環境では、echo 'hello world' | clip.exe
でWindowsのクリップボードにデータを送信できますが、ここでも同じようにclip.exe
に受け取ったデータを送信するようです。
bashrc
if [[ $(command -v socat > /dev/null; echo $?) == 0 ]]; then # Start up the socat forwarder to clip.exe ALREADY_RUNNING=$(ps -auxww | grep -q "[l]isten:8121"; echo $?) if [[ $ALREADY_RUNNING != "0" ]]; then echo "Starting clipboard relay..." (setsid socat tcp-listen:8121,fork,bind=0.0.0.0 EXEC:'clip.exe' &) > /dev/null 2>&1 else echo "Clipboard relay already running" fi fi
以降、WSLのターミナルを開くたびにsocat
でTCPコネクションを待ち受けるようになります。
ポート番号は任意ですが参考記事と一緒にしています。
Docker側の対応
Docker側でもsocat
を使うのでsudo apt install socat
でインストールします。
次に、socat
のTCPコネクションに送信するためのclip.sh
ファイルを作成します。
echo "hello from clip.sh" | clip.sh -i
のような使い方をします。この時点でホストのWSLのsocat
にデータが送られてWindowsのクリップボードにコピーされます。
clip.sh
#!/bin/bash for i in "$@" do case "$i" in (-i|--input|-in) tee <&0 | socat - tcp:host.docker.internal:8121 exit 0 ;; esac done
vimrcは下記設定を追加します。ヤンクしたときに先ほどのclip.sh
にデータを送るので、それがホストのWSLのsocat
にデータが送られてWindowsのクリップボードにコピーされます。
vimrc
" ヤンクした内容をクリップボードにコピー
augroup Yank
au!
autocmd TextYankPost * :call system('clip.sh -i', @")
augroup END
これで念願の『DockerコンテナのVimでヤンクした内容をWindowsホストのクリップボードへ共有する』ことができました。記事の作者様に感謝します。