NisOSのVSCodeにCopilotを導入する

November 19, 2023

イマドキ は Visual Studio CodeGitHub Copilot を動かすのだそうです。(本当?)Vim に引き篭もるばかりでは健康にも悪そうです。

というわけでちょっと外の空気でも・・むむ、大きな壁が。導入の段階において WindowsmacOS であればスムーズに構築できるのですが、悲しいかな NixOS だとそうもいきません。

NixOS 以外のユーザから見たら「なんでこんなに長いのw」と笑っていただけるような内容になったかもしれません。(基本的に私に向けた記録です。)

さて本当かどうか、さっそく Visual Studio Code(以下OSS版)を入れてみましょう。

$ nix-shell -p vscode
error:
       … while calling the 'derivationStrict' builtin

         at /builtin/derivation.nix:9:12: (source not available)

       …

       a) To temporarily allow unfree packages, you can use an environment variable
          for a single invocation of the nix tools.

            $ export NIXPKGS_ALLOW_UNFREE=1

        Note: For `nix shell`, `nix build`, `nix develop` or any other Nix 2.4+
        (Flake) command, `--impure` must be passed in order to read this
        environment variable.

       b) For `nixos-rebuild` you can set
         { nixpkgs.config.allowUnfree = true; }
       in configuration.nix to override this.

       Alternatively you can configure a predicate to allow specific packages:
         { nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
             "vscode"
           ];
         }

       c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
         { allowUnfree = true; }
       to ~/.config/nixpkgs/config.nix.

いきなり面を食らったかと思います。NixOS には「Unfreeなパッケージは事前の許可が必要」という仕組みが存在するためです。

とりあえず「NIXPKGS_ALLOW_UNFREE」を利用してみます。shell.nixを用意しておけば以下で成立すると思います。(shellHookcodeを入れておくと起動の手間を省けます。)

$ NIXPKGS_ALLOW_UNFREE=1 nix-shell

codeで起動できたと思います。さてここでユーザ空間に正式に導入するか考えてみます。

ユーザ空間に導入するメリットを列挙してみます。

  • nix-shell を起動する必要が無い。
  • 事前に「NIXPKGS_ALLOW_UNFREE」を考慮しなくて良い。
  • ExtensionsをNix側で管理できる。(有効なパッケージが存在する場合に限る。)

書いた手前、最後はあまりオススメできません。理由は以下の通りです。

  • 欲しいExtensionのパッケージが存在しない場合がある。
  • 機能の一部が正常に動作しない場合がある。(github.copilot.suggest.terminal.commandなど。)

また Visual Studio Code 内のExtensionsから管理する場合は素直にvscode(パッケージ)を利用した方が良いです。(同期は「Settings Sync」に任せるのが手かもしれません。)私の環境では以下の結果になりました。

  • vscode: Extensionをインストールでき、正常に動作する。
  • vscode-with-Extensions: Extensionをインストールできない。
  • vscodium: Extensionをインストールできるが、機能の一部が正常に動作しない。(またログイン状態を維持できないかも。)

まあ折角なのでユーザ空間に導入しましょう。最初のエラーを回避するには、flake.nixなどに以下の宣言を加えます。

nixpkgs.config.allowUnfree = true;

Unfreeなパッケージがvscodeだけの場合、ここは口惜しいポイント(デメリット)かと思います。しかしトレードオフだと考えるしかなさそうです。

この残念な気持ちを少し緩和するために「Unfreeという目印」が欲しいところです。方法はいくつか考えられます。

私の場合はvscodeを宣言しているディレクトリの名称をunfree-vscodeとしました。unfreeを先頭にしたのはソートを考慮してのことです。

vscode-extensions.github.copilotを宣言すればExtensionsに追加されますが、先の理由から実施しません。Visual Studio Code を開いて「Sign in to GitHub」を押下します。

ウェブブラウザに遷移して GitHub の認証画面が表示されれば問題ありません。が、何の反応も無い(ウェブブラウザに遷移しない)パターンもあると思います。

この問題は環境によって様々なため、可能性が高そうな解決策をご紹介します。デスクトップ環境に Freedesktop.org が絡んでいる場合「xdg」が関係している可能性が高いです。

というのも Visual Studio CodeFreedesktop.org による XDG Base Directory に沿っているようです。したがって xdg-utils によって解決されるという道理です。

xdg-utilsを導入し「デフォルトのブラウザ」を表示してみます。

$ xdg-settings get default-web-browser
chromium-browser.desktop

正しく表示されない場合、ウェブブラウザから設定しますが、コマンドも用意されています。

$ xdg-settings set default-web-browser brave-browser.desktop

参考: Linuxでブラウザ環境変数を設定する方法

「なぜ Firefoxfirefox.desktop)を例に出さないのか」と思われたかもしれません。どうやら Visual Studio CodeChromiumOS Crypt(モジュール)を使っているからだそうです。

これで「Sign in to GitHub」からウェブブラウザ(GitHub の認証画面)に遷移できるようになったかと思います。

GitHub へログイン後、Visual Studio Code に戻るとエラーが出るかもしれません。

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

Open the troubleshooting guide to address this or you can use weaker
encryption that doesn't use the OS keyring.

キーリング(例: GNOME Keyring)が機能していないからのようです。以下がヒントになると思います。

キーリング周りをスタートラインから詳解すると大変なことになりますので簡単(詳細な設定内容は省略)に。ミニマルな例として passpassword-store)および libsecretpass-secret-service)を有効にし、~/.vscode/argv.jsonVSCodium の場合は~/.vscode-oss/argv.json)に"password-store": "gnome"code --password-store="gnome"の永続化)を加えると良さそうです。argv.jsonへの適用は以下が参考になると思います。

Use weaker encryption」で先に進むことはできますが「キーリングが使えていない状態」ということに留意しておく必要があります。

GitHub Copilot のアクセス権が無い場合はエラーが出ます。

No access to GitHub Copilot found. You are currently logged in as <username>.

これは「Signup for GitHub Copilot」から画面(ウェブブラウザ)の案内に従えば GitHub Copilot のアクセス権を取得できると思います。それでも失敗する場合は再ログインで解消するかもしれません。

お疲れ様でした。これでようやく「イマドキ」に到達ですね。

ちょっと試すだけのつもりが、なんだか長旅になってしまいました。しばらく動かしてみて、フリートライアル終了後の対応を考えたいと思います。

ということで、よっこらしょっと。