Windows (WSL) で Neovim を使っている。

gin.vim を通して git 操作をしてるが、 Github の Verified 表記 () に憧れて署名を付ける設定を施した。
しかし、Neovim からGPG 署名を付けようと設定したところ、git commit のパスフレーズ入力時にターミナルの表示がおかしくなる事象が発生。

broken-terminal

詳しいことは分かっていないが、 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 プログラムとして指定するかたちになる。

設定

スクリプト設定

  1. テキトウなところに
    git clone https://github.com/diablodale/pinentry-wsl-ps1.git
  2. 実行権限の付与
    chmod ug=rx pinentry-wsl-ps1/pinentry-wsl-ps1.sh
  3. パスが通ったところにシンボリックリンクを作成
    ln -s $PWD/pinentry-wsl-ps1/pinentry-wsl-ps1.sh ~/bin/pinentry-wsl-ps1.sh
  4. 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.