core: add env config option

Fixes #5257

Specify environment variables to pass to commands launched in a terminal
surface. The format is `env=KEY=VALUE`.

`env = foo=bar`
`env = bar=baz`

Setting `env` to an empty string will reset the entire map to default
(empty).

`env =`

Setting a key to an empty string will remove that particular key and
corresponding value from the map.

`env = foo=bar`
`env = foo=`

will result in `foo` not being passed to the launched commands.
Setting a key multiple times will overwrite previous entries.

`env = foo=bar`
`env = foo=baz`

will result in `foo=baz` being passed to the launched commands.

These environment variables _will not_ be passed to commands run by Ghostty
for other purposes, like `open` or `xdg-open` used to open URLs in your
browser.
This commit is contained in:
Jeffrey C. Ollie
2025-01-22 16:41:41 -06:00
committed by Mitchell Hashimoto
parent b975f1e860
commit c7971b562e
5 changed files with 247 additions and 0 deletions

View File

@@ -683,6 +683,7 @@ pub const ThreadData = struct {
pub const Config = struct {
command: ?[]const u8 = null,
env: EnvMap,
env_override: configpkg.RepeatableStringMap = .{},
shell_integration: configpkg.Config.ShellIntegration = .detect,
shell_integration_features: configpkg.Config.ShellIntegrationFeatures = .{},
working_directory: ?[]const u8 = null,
@@ -889,6 +890,15 @@ const Subprocess = struct {
log.warn("shell could not be detected, no automatic shell integration will be injected", .{});
}
// Add the environment variables that override any others.
{
var it = cfg.env_override.iterator();
while (it.next()) |entry| try env.put(
entry.key_ptr.*,
entry.value_ptr.*,
);
}
// Build our args list
const args = args: {
const cap = 9; // the most we'll ever use