プログラミング

Windows 10のクリップボードをWSL bashに同期する

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"

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です