Better zig build config

This commit is contained in:
Alexandros Naskos 2020-11-16 00:07:35 +02:00
parent 67b5adc04e
commit bf4f653bf9
No known key found for this signature in database
GPG Key ID: 02BF2E72B0EA32D2
3 changed files with 41 additions and 5 deletions

View File

@ -45,7 +45,6 @@ Then, you can use the `zls` executable in an editor of your choice that has a Zi
You can configure zls by providing a zls.json file. You can configure zls by providing a zls.json file.
zls will look for a zls.json configuration file in multiple locations with the following priority: zls will look for a zls.json configuration file in multiple locations with the following priority:
- In the folders open in your workspace (this applies for files in those folders)
- In the local configuration folder of your OS (as provided by [known-folders](https://github.com/ziglibs/known-folders#folder-list)) - In the local configuration folder of your OS (as provided by [known-folders](https://github.com/ziglibs/known-folders#folder-list))
- In the same directory as the executable - In the same directory as the executable
@ -58,7 +57,7 @@ The following options are currently available.
| `zig_exe_path` | `?[]const u8` | `null` | zig executable path, e.g. `/path/to/zig/zig`, used to run the custom build runner. If `null`, zig is looked up in `PATH`. Will be used to infer the zig standard library path if none is provided. | | `zig_exe_path` | `?[]const u8` | `null` | zig executable path, e.g. `/path/to/zig/zig`, used to run the custom build runner. If `null`, zig is looked up in `PATH`. Will be used to infer the zig standard library path if none is provided. |
| `warn_style` | `bool` | `false` | Enables warnings for style *guideline* mismatches | | `warn_style` | `bool` | `false` | Enables warnings for style *guideline* mismatches |
| `build_runner_path` | `?[]const u8` | `null` | Path to the build_runner.zig file provided by zls. This option must be present in one of the global configuration files to have any effect. `null` is equivalent to `${executable_directory}/build_runner.zig` | | `build_runner_path` | `?[]const u8` | `null` | Path to the build_runner.zig file provided by zls. This option must be present in one of the global configuration files to have any effect. `null` is equivalent to `${executable_directory}/build_runner.zig` |
| `enable_semantic_tokens` | `bool` | `false` | Enables semantic token support when the client also supports it. | | `enable_semantic_tokens` | `bool` | `true` | Enables semantic token support when the client also supports it. |
| `operator_completions` | `bool` | `true` | Enables `*` and `?` operators in completion lists. | | `operator_completions` | `bool` | `true` | Enables `*` and `?` operators in completion lists. |
## Features ## Features

View File

@ -10,10 +10,46 @@ pub fn config(step: *std.build.Step) anyerror!void {
@setEvalBranchQuota(2500); @setEvalBranchQuota(2500);
std.debug.warn("Welcome to the ZLS configuration wizard! (insert mage emoji here)\n", .{}); std.debug.warn("Welcome to the ZLS configuration wizard! (insert mage emoji here)\n", .{});
const lib_path = try zinput.askDirPath(builder.allocator, "What is your Zig lib path (path that contains the 'std' folder)?", 512); var zig_exe_path: ?[]const u8 = null;
std.debug.print("Looking for 'zig' in PATH...\n", .{});
find_zig: {
const allocator = builder.allocator;
const env_path = std.process.getEnvVarOwned(allocator, "PATH") catch |err| switch (err) {
error.EnvironmentVariableNotFound => {
break :find_zig;
},
else => return err,
};
defer allocator.free(env_path);
const exe_extension = @as(std.zig.CrossTarget, .{}).exeFileExt();
const zig_exe = try std.fmt.allocPrint(allocator, "zig{}", .{exe_extension});
defer allocator.free(zig_exe);
var it = std.mem.tokenize(env_path, &[_]u8{std.fs.path.delimiter});
while (it.next()) |path| {
const full_path = try std.fs.path.join(allocator, &[_][]const u8{
path,
zig_exe,
});
defer allocator.free(full_path);
var buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
zig_exe_path = try std.mem.dupe(allocator, u8, std.os.realpath(full_path, &buf) catch continue);
break :find_zig;
}
}
if (zig_exe_path == null) {
std.debug.print("Could not find 'zig' in PATH\n", .{});
zig_exe_path = try zinput.askString(builder.allocator, "What is the path to the 'zig' executable you would like to use?", 512);
} else {
std.debug.print("Found zig executable '{}'\n", .{zig_exe_path.?});
}
const snippets = try zinput.askBool("Do you want to enable snippets?"); const snippets = try zinput.askBool("Do you want to enable snippets?");
const style = try zinput.askBool("Do you want to enable style warnings?"); const style = try zinput.askBool("Do you want to enable style warnings?");
const semantic_tokens = try zinput.askBool("Do you want to enable semantic highlighting?"); const semantic_tokens = try zinput.askBool("Do you want to enable semantic highlighting?");
const operator_completions = try zinput.askBool("Do you want to enable .* and .? completions");
var dir = try std.fs.cwd().openDir(builder.exe_dir, .{}); var dir = try std.fs.cwd().openDir(builder.exe_dir, .{});
defer dir.close(); defer dir.close();
@ -26,10 +62,11 @@ pub fn config(step: *std.build.Step) anyerror!void {
std.debug.warn("Writing to config...\n", .{}); std.debug.warn("Writing to config...\n", .{});
const content = std.json.stringify(.{ const content = std.json.stringify(.{
.zig_lib_path = lib_path, .zig_exe_path = zig_exe_path,
.enable_snippets = snippets, .enable_snippets = snippets,
.warn_style = style, .warn_style = style,
.enable_semantic_tokens = semantic_tokens, .enable_semantic_tokens = semantic_tokens,
.operator_completions = operator_completions,
}, std.json.StringifyOptions{}, out); }, std.json.StringifyOptions{}, out);
std.debug.warn("Successfully saved configuration options!\n", .{}); std.debug.warn("Successfully saved configuration options!\n", .{});

View File

@ -19,7 +19,7 @@ warn_style: bool = false,
build_runner_path: ?[]const u8 = null, build_runner_path: ?[]const u8 = null,
/// Semantic token support /// Semantic token support
enable_semantic_tokens: bool = false, enable_semantic_tokens: bool = true,
/// Whether to enable `*` and `?` operators in completion lists /// Whether to enable `*` and `?` operators in completion lists
operator_completions: bool = true, operator_completions: bool = true,