less than 1 minute read

前提条件

  • NixでVSCodeをインストールしている
  • home-managerを使用している

発生した問題

WMをGNOMEからSwayに切り替えた後、VSCodeを開くと

An OS keyring couldn’t be identified for storing the encryption related data in your current desktop environment.

というダイアログが出ました。 このエラーはVSCodeがkeyringを特定できないために発生するエラーです。 このエラー自体はVSCodeのトラブルシューティングに則って~/.vscode/argv.json"password-store": "gnome-libsecret"を追加すれば解決することができます。

しかし、せっかくパッケージや設定をNixで管理しているなら、この設定もNixで管理したいですよね。

最初はhome.nixに直接JSONを記述して、それを~/.vscode/argv.jsonにコピーしようと思っていました。 しかし、argv.jsonの中にはデフォルトでcrash-reporter-idというプロパティがあり、 crash-report-idについて以下のようにコメントしてあります。

// Unique id used for correlating crash reports sent from this instance.
// Do not edit this value.
"crash-reporter-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",

要約すると、このIDはインスタンスごとに異なるので編集しないでね、ということです。 そのため、既存のargv.jsonは残しつつ、そこにpassword-storeの値を追加する必要がありました。

Nixでargv.jsonに値を追加する

ということで、home-managerの設定ファイルでオプションを追加するようにしたいのですが、vscodeパッケージはランタイム引数を渡すためのオプションを提供していないようです。 そのため、少し無理矢理ですがjqを使って既存のargv.jsonと追加のオプションをマージする方向性で実現しようと思います。

これが最終的な設定です。

{ config, lib, pkgs, ... }:
let
  vscodeArgvFile = "~/.vscode/argv.json";
in
{
  # 略

  programs.vscode.enable = true;
  # Use gnome-keyring in VSCode
  # ref: https://code.visualstudio.com/docs/configure/settings-sync#_recommended-configure-the-keyring-to-use-with-vs-code
  home.activation.vscodeArgs = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
    if [ -f ${vscodeArgvFile} ]; then
      # Remove comment in JSON and merge with extra options
      sed -e 's://.*$::' -e '/\/\*/,/\*\//d' ${vscodeArgvFile} | \
      ${pkgs.jq}/bin/jq '. + {"password-store": "gnome-libsecret"}' > ${vscodeArgvFile}.tmp
      mv ${vscodeArgvFile}.tmp ${vscodeArgvFile}
    else
      mkdir -p $(dirname ${vscodeArgvFile})
      echo '{"password-store": "gnome-libsecret"}' > ${vscodeArgvFile}
    fi
  '';

  # 略
}

重要な部分はこの部分です。

sed -e 's://.*$::' -e '/\/\*/,/\*\//d' ${vscodeArgvFile} | \
  ${pkgs.jq}/bin/jq '. + {"password-store": "gnome-libsecret"}' > ${vscodeArgvFile}.tmp
mv ${vscodeArgvFile}.tmp ${vscodeArgvFile}

1行目のsedではJSON内のコメントを削除しています。 これは、jqがコメント付きのJSONに対応していないためです。 コメントを削除した後、jqに結果を渡し、追加のオプションとマージします。 最後に、これを~/.vscode/argv.jsonにコピーして完了です。

この処理は~/.vscode/argv.jsonが無かった場合にエラーになるので、もしファイルが存在しない場合はオプション記述したJSONを新規作成しています。

以上の設定をhome.nixに記載した後、home-manager switchして設定を反映させましょう。 ~/.vscode/argv.jsonを確認するとpassword-storeの値が追加されたJSONファイルが出力されているはずです。

最後に

かなり無理矢理な気はしますが、目的は達成できたので良しとします。 もっといい方法があれば教えてください!

タグ: ,

カテゴリー:

更新日時: