Windows 10のクリップボードをWSL bashに同期する方法について紹介します。
WindowsのクリップボードをWSL bashに同期するスクリプトを書きました。
WindowsとWSL間でクリップボードが共有できたらいいなぁとはいつも思うことですが、方法はいくらかあります。
まず、xmingなどのxサーバーシステム経由でクリップボードを共有する方法。こちらは、僕の場合はだめでした。謎のエラーが出ます。むしろxmingはクリップボード共有機能をディスエイブルしないと使い物になりません。
次に、サードパーティ製ソフトウェアを使う方法。僕が使ったことがあるのは、chrome拡張機能のClipbrd Beta – Chrome Web Store。
こちらであれば、chromeをインストールしていれば、android、linux、windows,macでクリップボードの相互同期が可能です。便利。
たーだし。
デベロッパーが良い方だと悪いですが、僕はこういうの信用していないので、基本的にオフにしています。つっても使わない度に拡張機能をアンインストールしてたらきり無いので、Extensions Manager (aka Switcher) – Chrome Web Storeといった拡張機能管理エクステンションを使うことをおすすめ。
というのも、仲介サーバーでどういう処理をしているかブラックボックスなので、怖いですから。はっきりいって、コピーしたテキストデータ(e.g.パスワード)全部筒抜けてることも考えたほうがいいわけです。こちらの拡張機能自体ちょっと臭う部分があるので、まぁ。使うかどうかは任せます。
で、もう一つが、自分で書いてしまう方法ですね。といってもこちらのスクリプトでは相互同期は難しかったので、windowsからwslへの一方通行同期です。windowsのクリップボードが更新されたらwslへコピーします。
必要準備
dittoをインストール
この関数ではdittoというクリップボードマネージャーから生成されたsqliteデータベースファイルを使用しています。なのでインスコしてください。
Ditto download | SourceForge.net
スクリプト
syncWindowsClipboardToWSL(){
while [ true ];
do
WSLClipboardText="$(xclip -o -selection clipboard)"
WindowsClipboardText="$(sqlite3 /mnt/c/Users/${WINUSER}/AppData/Roaming/Ditto/Ditto.db "$(cat <<'EOT'
SELECT mText from Main
order by clipOrder desc
LIMIT 1 OFFSET 0
EOT
)")"
[[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { echo "${WindowsClipboardText}" | xclip -sel clip ; printf "Copied Windows clipboard to WSL." ; } || echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"
sleep 2s
done
}
alias synccltowsl="syncWindowsClipboardToWSL"
書き換えればwsl to windowsもできるはずです。ただし相互同期となるとちょっと時間が必要そう。
相互同期してくれるコードとかソフトウェアがあったらコメントで教えてくださると嬉しいです。
追記
バグ直しました。
データベースを直接弄るとdittoがたまにクラッシュするので、一度コピーしてからコピーしたものを弄るようにします。
syncWindowsClipboardToWSL(){
while [ true ];
do
cp /mnt/c/Users/ifgm2/AppData/Roaming/Ditto/Ditto.db $TMPDIR/Ditto.db
WSLClipboardText="$(xclip -o -selection clipboard)"
# WindowsClipboardText="$(sqlite3 /mnt/c/Users/${WINUSER}/AppData/Roaming/Ditto/Ditto.db "$(cat <<'EOT'
# SELECT mText from Main
# order by clipOrder desc
# LIMIT 1 OFFSET 0
# EOT
# )")"
WindowsClipboardText="$(sqlite3 $TMPDIR/Ditto.db "$(cat <<'EOT'
SELECT mText from Main
order by clipOrder desc
LIMIT 1 OFFSET 0
EOT
)")"
[[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { echo "${WindowsClipboardText}" | xclip -sel clip ; printf "Copied Windows clipboard to WSL." ; } || echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"
# [[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { printf "$(isodate|chomp)\t${WSLClipboardText}\n" >> ~/WSLClipboardText.log ; printf "$(isodate|chomp)\t${WindowsClipboardText}\n" >> ~/WindowsClipboardText.log ; \
# } || echo same.
#
# hgoe fuga
# hoge foo
sleep 2s
done
: <<'NOTE'
Error: database disk image is malformed on the clipboard.
NOTE
}
alias synccltowsl="syncWindowsClipboardToWSL"