main
 1{
 2  flake.modules.homeManager.dev-vscode = {
 3    config,
 4    lib, # Use inner lib to pass lib in args
 5    # NOTE: this args not used in this file CAN NOT be removed!
 6    pkgs,
 7    ...
 8  } @ args: let
 9    scanModules = path:
10      builtins.map (f: (path + "/${f}")) (
11        builtins.attrNames (
12          lib.attrsets.filterAttrs (
13            path: _type:
14              (_type == "directory") || ((path != "default.nix") && (lib.strings.hasSuffix ".nix" path))
15          ) (builtins.readDir path)
16        )
17      );
18
19    baseExtensions = config.programs.vscode.baseExtensions;
20    profilesList =
21      (map (path: import path args) (scanModules ./.))
22      ++ [
23        {
24          default = {
25            enableUpdateCheck = false;
26            enableExtensionUpdateCheck = false;
27            userSettings = {
28              # --- Editor Settings --- #
29              "editor.fontLigatures" = true;
30              "editor.guides.bracketPairs" = true;
31              "editor.formatOnSave" = true;
32              "editor.unicodeHighlight.allowedLocales"."zh-hans" = true;
33              "editor.lineNumbers" = "relative";
34              # --- Terminal Settings --- #
35              "terminal.integrated.defaultProfile.linux" = "fish";
36              # --- Workbench Settings --- #
37              "workbench.colorTheme" = "Stylix"; # Use Stylix theme
38              "workbench.iconTheme" = "material-icon-theme";
39              "workbench.startupEditor" = "none";
40              # --- Extension Settings --- #
41              "git.enabled" = false; # Disable git because I use jujutsu instead
42              # "GitCommitPlugin.ShowEmoji" = false;
43              # "GitCommitPlugin.MaxSubjectCharacters" = 25;
44              "github.copilot.advanced".useLanguageServer = true;
45              "nix.enableLanguageServer" = true;
46              "nix.serverPath" = "nixd";
47              "nix.serverSettings".nixd.formatting.command = ["alejandra"];
48              "evenBetterToml.formatter.alignEntries" = true;
49              "evenBetterToml.formatter.alignComments" = true;
50              "evenBetterToml.formatter.allowedBlankLines" = 1;
51              # --- Update Settings --- #
52              "extensions.autoCheckUpdates" = false;
53              "extensions.autoUpdate" = false;
54              "update.mode" = "none";
55              # --- Other Settings --- #
56              # Settings apply to all profiles
57              "telemetry.telemetryLevel" = "off";
58              "security.workspace.trust.untrustedFiles" = "open";
59              "window.newWindowProfile" = "Default";
60              "workbench.settings.applyToAllProfiles" = [
61                # -- Normal -- #
62                "editor.fontLigatures"
63                "editor.guides.bracketPairs"
64                "editor.formatOnSave"
65                "editor.lineNumbers"
66                "terminal.integrated.defaultProfile.linux"
67                "workbench.colorTheme"
68                "workbench.iconTheme"
69                "workbench.startupEditor"
70                # -- Extension -- #
71                "git.enabled"
72                # "GitCommitPlugin.ShowEmoji"
73                # "GitCommitPlugin.MaxSubjectCharacters"
74                "github.copilot.advanced"
75                "nix.enableLanguageServer"
76                "nix.serverPath"
77                "nix.serverSettings"
78                "evenBetterToml.formatter.alignEntries"
79                "evenBetterToml.formatter.alignComments"
80                "evenBetterToml.formatter.allowedBlankLines"
81              ];
82            };
83          };
84        }
85      ];
86    profiles =
87      lib.mapAttrs
88      (_: v: (v // {extensions = v.extensions or [] ++ baseExtensions;}))
89      (lib.mergeAttrsList profilesList);
90    profileNames = lib.attrNames profiles;
91  in {
92    stylix.targets.vscode.profileNames = profileNames;
93
94    programs.vscode.profiles = profiles;
95  };
96}