64 lines
1.5 KiB
Nix
64 lines
1.5 KiB
Nix
{pkgs, ...}: let
|
|
hyprctl = pkgs.lib.getExe' pkgs.hyprland "hyprctl";
|
|
jq = pkgs.lib.getExe pkgs.jq;
|
|
pgrep = pkgs.lib.getExe' pkgs.procps "pgrep";
|
|
kitty = pkgs.lib.getExe pkgs.kitty;
|
|
|
|
# A kitty wrapper, to launch a new kitty window at the same path of the currently focused kitty window.
|
|
# Only works with zsh
|
|
kitty-cwd =
|
|
pkgs.writeShellScriptBin "kitty-cwd"
|
|
# sh
|
|
''
|
|
active_window="$(${hyprctl} activewindow -j)"
|
|
class="$(echo "$active_window" | ${jq} -r .class)"
|
|
pid="$(echo "$active_window" | ${jq} -r .pid)"
|
|
|
|
leaf_cwd=""
|
|
|
|
if [[ "$class" == "kitty" ]]; then
|
|
current_pid="$pid"
|
|
|
|
while true; do
|
|
child_pid=$(${pgrep} -P "$current_pid" -n)
|
|
if [[ -z "$child_pid" ]]; then break; fi
|
|
|
|
cwd_file="''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$child_pid"
|
|
if [[ -f "$cwd_file" ]]; then
|
|
leaf_cwd=$(cat "$cwd_file")
|
|
fi
|
|
|
|
current_pid="$child_pid"
|
|
done
|
|
fi
|
|
|
|
target="''${leaf_cwd:-$HOME}"
|
|
${kitty} --directory "$target"
|
|
'';
|
|
in {
|
|
home.packages = [
|
|
kitty-cwd
|
|
];
|
|
|
|
programs = {
|
|
kitty.settings = {
|
|
allow_remote_control = "yes";
|
|
listen_on = "unix:/tmp/kitty-{kitty_pid}";
|
|
};
|
|
|
|
zsh.initContent =
|
|
# sh
|
|
''
|
|
write_cwd() {
|
|
echo "$PWD" > "''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$$"
|
|
}
|
|
precmd_functions+=(write_cwd)
|
|
|
|
cleanup_cwd() {
|
|
rm -f "''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$$"
|
|
}
|
|
zshexit_functions+=(cleanup_cwd)
|
|
'';
|
|
};
|
|
}
|