mirror of
https://github.com/nix-community/home-manager.git
synced 2026-01-11 17:39:37 +08:00
vscode: allow specifying paths for VSCode JSON settings (#7055)
Enables users to provide paths to JSON files for VS Code settings, tasks, and keybindings. This allows for more flexible configuration management and reuse of existing configuration files instead of using inline configurations.
This commit is contained in:
committed by
GitHub
parent
a99bddfe53
commit
b022c9e3b8
@@ -81,10 +81,12 @@ let
|
||||
"extensions.autoCheckUpdates" = false;
|
||||
};
|
||||
|
||||
isPath = p: builtins.isPath p || lib.isStorePath p;
|
||||
|
||||
profileType = types.submodule {
|
||||
options = {
|
||||
userSettings = mkOption {
|
||||
type = jsonFormat.type;
|
||||
type = types.either types.path jsonFormat.type;
|
||||
default = { };
|
||||
example = literalExpression ''
|
||||
{
|
||||
@@ -95,11 +97,12 @@ let
|
||||
description = ''
|
||||
Configuration written to Visual Studio Code's
|
||||
{file}`settings.json`.
|
||||
This can be a JSON object or a path to a custom JSON file.
|
||||
'';
|
||||
};
|
||||
|
||||
userTasks = mkOption {
|
||||
type = jsonFormat.type;
|
||||
type = types.either types.path jsonFormat.type;
|
||||
default = { };
|
||||
example = literalExpression ''
|
||||
{
|
||||
@@ -116,43 +119,46 @@ let
|
||||
description = ''
|
||||
Configuration written to Visual Studio Code's
|
||||
{file}`tasks.json`.
|
||||
This can be a JSON object or a path to a custom JSON file.
|
||||
'';
|
||||
};
|
||||
|
||||
keybindings = mkOption {
|
||||
type = types.listOf (
|
||||
types.submodule {
|
||||
options = {
|
||||
key = mkOption {
|
||||
type = types.str;
|
||||
example = "ctrl+c";
|
||||
description = "The key or key-combination to bind.";
|
||||
};
|
||||
|
||||
command = mkOption {
|
||||
type = types.str;
|
||||
example = "editor.action.clipboardCopyAction";
|
||||
description = "The VS Code command to execute.";
|
||||
};
|
||||
|
||||
when = mkOption {
|
||||
type = types.nullOr (types.str);
|
||||
default = null;
|
||||
example = "textInputFocus";
|
||||
description = "Optional context filter.";
|
||||
};
|
||||
|
||||
# https://code.visualstudio.com/docs/getstarted/keybindings#_command-arguments
|
||||
args = mkOption {
|
||||
type = types.nullOr (jsonFormat.type);
|
||||
default = null;
|
||||
example = {
|
||||
direction = "up";
|
||||
type = types.either types.path (
|
||||
types.listOf (
|
||||
types.submodule {
|
||||
options = {
|
||||
key = mkOption {
|
||||
type = types.str;
|
||||
example = "ctrl+c";
|
||||
description = "The key or key-combination to bind.";
|
||||
};
|
||||
|
||||
command = mkOption {
|
||||
type = types.str;
|
||||
example = "editor.action.clipboardCopyAction";
|
||||
description = "The VS Code command to execute.";
|
||||
};
|
||||
|
||||
when = mkOption {
|
||||
type = types.nullOr (types.str);
|
||||
default = null;
|
||||
example = "textInputFocus";
|
||||
description = "Optional context filter.";
|
||||
};
|
||||
|
||||
# https://code.visualstudio.com/docs/getstarted/keybindings#_command-arguments
|
||||
args = mkOption {
|
||||
type = types.nullOr (jsonFormat.type);
|
||||
default = null;
|
||||
example = {
|
||||
direction = "up";
|
||||
};
|
||||
description = "Optional arguments for a command.";
|
||||
};
|
||||
description = "Optional arguments for a command.";
|
||||
};
|
||||
};
|
||||
}
|
||||
}
|
||||
)
|
||||
);
|
||||
default = [ ];
|
||||
example = literalExpression ''
|
||||
@@ -167,6 +173,7 @@ let
|
||||
description = ''
|
||||
Keybindings written to Visual Studio Code's
|
||||
{file}`keybindings.json`.
|
||||
This can be a JSON object or a path to a custom JSON file.
|
||||
'';
|
||||
};
|
||||
|
||||
@@ -360,20 +367,27 @@ in
|
||||
(mapAttrsToList (n: v: [
|
||||
(mkIf ((mergedUserSettings v.userSettings v.enableUpdateCheck v.enableExtensionUpdateCheck) != { })
|
||||
{
|
||||
"${configFilePath n}".source = jsonFormat.generate "vscode-user-settings" (
|
||||
mergedUserSettings v.userSettings v.enableUpdateCheck v.enableExtensionUpdateCheck
|
||||
);
|
||||
"${configFilePath n}".source =
|
||||
if isPath v.userSettings then
|
||||
v.userSettings
|
||||
else
|
||||
jsonFormat.generate "vscode-user-settings" (
|
||||
mergedUserSettings v.userSettings v.enableUpdateCheck v.enableExtensionUpdateCheck
|
||||
);
|
||||
}
|
||||
)
|
||||
|
||||
(mkIf (v.userTasks != { }) {
|
||||
"${tasksFilePath n}".source = jsonFormat.generate "vscode-user-tasks" v.userTasks;
|
||||
"${tasksFilePath n}".source =
|
||||
if isPath v.userTasks then v.userTasks else jsonFormat.generate "vscode-user-tasks" v.userTasks;
|
||||
})
|
||||
|
||||
(mkIf (v.keybindings != [ ]) {
|
||||
"${keybindingsFilePath n}".source = jsonFormat.generate "vscode-keybindings" (
|
||||
map (lib.filterAttrs (_: v: v != null)) v.keybindings
|
||||
);
|
||||
"${keybindingsFilePath n}".source =
|
||||
if isPath v.keybindings then
|
||||
v.keybindings
|
||||
else
|
||||
jsonFormat.generate "vscode-keybindings" (map (lib.filterAttrs (_: v: v != null)) v.keybindings);
|
||||
})
|
||||
|
||||
(mkIf (v.languageSnippets != { }) (
|
||||
|
||||
@@ -45,6 +45,42 @@ let
|
||||
else
|
||||
".config/Code/User/${lib.optionalString (name != "default") "profiles/${name}/"}settings.json";
|
||||
|
||||
content = ''
|
||||
[
|
||||
// Order doesn't change
|
||||
{
|
||||
"command": "deleteFile",
|
||||
"key": "ctrl+c",
|
||||
"when": ""
|
||||
},
|
||||
{
|
||||
"command": "deleteFile",
|
||||
"key": "ctrl+c",
|
||||
"when": ""
|
||||
},
|
||||
{
|
||||
"args": {
|
||||
"command": "echo file"
|
||||
},
|
||||
"command": "run",
|
||||
"key": "ctrl+r"
|
||||
},
|
||||
// Comments should be preserved
|
||||
{
|
||||
"command": "editor.action.clipboardCopyAction",
|
||||
"key": "ctrl+c",
|
||||
"when": "textInputFocus && false"
|
||||
},
|
||||
{
|
||||
"command": "deleteFile",
|
||||
"key": "d",
|
||||
"when": "explorerViewletVisible"
|
||||
}
|
||||
]
|
||||
'';
|
||||
|
||||
customBindingsPath = pkgs.writeText "custom.json" content;
|
||||
|
||||
expectedKeybindings = pkgs.writeText "expected.json" ''
|
||||
[
|
||||
{
|
||||
@@ -72,6 +108,8 @@ let
|
||||
]
|
||||
'';
|
||||
|
||||
expectedCustomKeybindings = pkgs.writeText "custom-expected.json" content;
|
||||
|
||||
in
|
||||
{
|
||||
programs.vscode = {
|
||||
@@ -79,6 +117,7 @@ in
|
||||
profiles = {
|
||||
default.keybindings = bindings;
|
||||
test.keybindings = bindings;
|
||||
custom.keybindings = customBindingsPath;
|
||||
};
|
||||
package = pkgs.writeScriptBin "vscode" "" // {
|
||||
pname = "vscode";
|
||||
@@ -96,5 +135,10 @@ in
|
||||
assertFileContent "home-files/${keybindingsPath "test"}" "${expectedKeybindings}"
|
||||
|
||||
assertPathNotExists "home-files/${settingsPath "test"}"
|
||||
|
||||
assertFileExists "home-files/${keybindingsPath "custom"}"
|
||||
assertFileContent "home-files/${keybindingsPath "custom"}" "${expectedCustomKeybindings}"
|
||||
|
||||
assertPathNotExists "home-files/${settingsPath "custom"}"
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -11,6 +11,25 @@ let
|
||||
else
|
||||
".config/Code/User/${lib.optionalString (name != "default") "profiles/${name}/"}tasks.json";
|
||||
|
||||
content = ''
|
||||
{
|
||||
// Comments should be preserved
|
||||
"tasks": [
|
||||
{
|
||||
"command": "hello",
|
||||
"label": "Hello task",
|
||||
"type": "shell"
|
||||
},
|
||||
{
|
||||
"command": "world",
|
||||
"label": "World task",
|
||||
"type": "shell"
|
||||
}
|
||||
],
|
||||
"version": "2.0.0"
|
||||
}
|
||||
'';
|
||||
|
||||
tasks = {
|
||||
version = "2.0.0";
|
||||
tasks = [
|
||||
@@ -22,6 +41,8 @@ let
|
||||
];
|
||||
};
|
||||
|
||||
customTasksPath = pkgs.writeText "custom.json" content;
|
||||
|
||||
expectedTasks = pkgs.writeText "tasks-expected.json" ''
|
||||
{
|
||||
"tasks": [
|
||||
@@ -35,6 +56,8 @@ let
|
||||
}
|
||||
'';
|
||||
|
||||
expectedCustomTasks = pkgs.writeText "custom-expected.json" content;
|
||||
|
||||
in
|
||||
{
|
||||
programs.vscode = {
|
||||
@@ -46,6 +69,7 @@ in
|
||||
profiles = {
|
||||
default.userTasks = tasks;
|
||||
test.userTasks = tasks;
|
||||
custom.userTasks = customTasksPath;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -55,5 +79,8 @@ in
|
||||
|
||||
assertFileExists "home-files/${tasksFilePath "test"}"
|
||||
assertFileContent "home-files/${tasksFilePath "test"}" "${expectedTasks}"
|
||||
|
||||
assertFileExists "home-files/${tasksFilePath "custom"}"
|
||||
assertFileContent "home-files/${tasksFilePath "custom"}" "${expectedCustomTasks}"
|
||||
'';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user