Windows (WSL) で Neovim を使っている。
gin.vim を通して git 操作をしてるが、 Github の Verified 表記 () に憧れて署名を付ける設定を施した。
しかし、Neovim からGPG 署名を付けようと設定したところ、git commit
のパスフレーズ入力時にターミナルの表示がおかしくなる事象が発生。
詳しいことは分かっていないが、 GnuPG では pinentry というものを使ってパスフレーズ等の入力をやりとりしている模様。
ターミナルのエスケープをゴリゴリやってそうで Vim などとは相性が悪そうだ。
MacOS なら pinentry-mac、Linux にも gt や gtk でGUIを出すプログラムがあるみたいだが、Windows は……?
Windows というか WSL で使えるのがないか探したところ diablodale/pinentry-wsl-ps1 を発見。
diablodale/pinentry-wsl-ps1
中身は一つの bash スクリプトで、ファイル名から推察できるが内部で Windows 側の PowerShell を呼び出している。
このスクリプトを GnuPG が実行する pinetry プログラムとして指定するかたちになる。
設定
スクリプト設定
- テキトウなところに
git clone https://github.com/diablodale/pinentry-wsl-ps1.git
- 実行権限の付与
chmod ug=rx pinentry-wsl-ps1/pinentry-wsl-ps1.sh
- パスが通ったところにシンボリックリンクを作成
ln -s $PWD/pinentry-wsl-ps1/pinentry-wsl-ps1.sh ~/bin/pinentry-wsl-ps1.sh
- Windows
powershell.exe
にもパスを通す
ln -s /mnt/c/Windows/SysWOW64/WindowsPowerShell/v1.0/powershell.exe ~/bin/powershell.exe
実行テスト
$ echo "GETPIN" | pinentry-wsl-ps1.sh
OK Your orders please
GUIのフォームが出てくることを確認。
GnuPG 設定
~/.gnupg/gpg-agent.conf
を編集し(存在しないなら新規作成)以下を追加
pinentry-program ~/bin/pinentry-wsl-ps1.sh
あと、最後に pkill gpg-agent
gpgconf --kill gpg-agent
でGPGエージェントを停止させた。(本当に必要だったか不明)
systemd 使用時の設定 (2024-10-24 追記)
諸事情によりsystemdを有効にしたところ、pinentry のプログラムがうまく動かなくなった。
systemd経由で gpg-agent
が動いているのが問題と思われたため、起動しないように変更。
$ systemctl --user stop gpg-agent.service gpg-agent-browser.socket gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket
$ systemctl --user mask gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket
Created symlink /home/teramako/.config/systemd/user/gpg-agent.service → /dev/null.
Created symlink /home/teramako/.config/systemd/user/gpg-agent.socket → /dev/null.
Created symlink /home/teramako/.config/systemd/user/gpg-agent-ssh.socket → /dev/null.
Created symlink /home/teramako/.config/systemd/user/gpg-agent-extra.socket → /dev/null.