zsh integration

This commit is contained in:
Mitchell Hashimoto
2023-07-06 17:46:54 -07:00
parent 4cdad44119
commit 80e2cd4e78
2 changed files with 32 additions and 6 deletions

View File

@ -19,12 +19,10 @@
# we quote everything that can be quoted. Some aliases will still break us
# though.
# Don't use [[ -v ... ]] because it doesn't work in zsh < 5.4.
if [[ -n "${GHOSTTY_ORIG_ZDOTDIR+X}" ]]; then
# Normally ZDOTDIR shouldn't be exported but it was in the environment
# of Ghostty, so we export it.
'builtin' 'export' ZDOTDIR="$GHOSTTY_ORIG_ZDOTDIR"
'builtin' 'unset' 'GHOSTTY_ORIG_ZDOTDIR'
# Restore the original ZDOTDIR value.
if [[ -n "${GHOSTTY_ZSH_ZDOTDIR+X}" ]]; then
'builtin' 'export' ZDOTDIR="$GHOSTTY_ZSH_ZDOTDIR"
'builtin' 'unset' 'GHOSTTY_ZSH_ZDOTDIR'
else
'builtin' 'unset' 'ZDOTDIR'
fi

View File

@ -6,6 +6,7 @@ const log = std.log.scoped(.shell_integration);
/// Shell types we support
pub const Shell = enum {
fish,
zsh,
};
/// Setup the command execution environment for automatic
@ -23,6 +24,11 @@ pub fn setup(
return .fish;
}
if (std.mem.eql(u8, "zsh", exe)) {
try setupZsh(resource_dir, env);
return .zsh;
}
return null;
}
@ -69,3 +75,25 @@ fn setupFish(
try env.put("XDG_DATA_DIRS", integ_dir);
}
}
/// Setup the zsh automatic shell integration. This works by setting
/// ZDOTDIR to our resources dir so that zsh will load our config. This
/// config then loads the true user config.
fn setupZsh(
resource_dir: []const u8,
env: *EnvMap,
) !void {
// Preserve the old zdotdir value so we can recover it.
if (env.get("ZDOTDIR")) |old| {
try env.put("GHOSTTY_ZSH_ZDOTDIR", old);
}
// Set our new ZDOTDIR
var path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
const integ_dir = try std.fmt.bufPrint(
&path_buf,
"{s}/shell-integration/zsh",
.{resource_dir},
);
try env.put("ZDOTDIR", integ_dir);
}