me like nix
1{ inputs, ... }:
2
3let
4 zjctl = pkgs: import ../packages/zjctl.nix { inherit pkgs; };
5 zrpc-wasm = pkgs: import ../packages/zrpc-wasm.nix { inherit pkgs; };
6 harpoon-wasm = pkgs: import ../packages/harpoon-wasm.nix { inherit pkgs; };
7in
8{
9 flake.modules.homeManager.shell =
10 { pkgs, config, ... }:
11 {
12 home.packages = with pkgs; [
13 yazi
14 fd
15 ripgrep
16 rsync
17 zoxide
18 (zjctl pkgs)
19 ];
20
21 programs.direnv.enable = true;
22
23 programs.atuin = {
24 enable = true;
25 enableFishIntegration = true;
26 daemon.enable = true;
27 settings = {
28 filter_mode_shell_up_key_binding = "session";
29 };
30 };
31
32 programs.zellij = {
33 enable = true;
34 settings = {
35 keybinds = {
36 unbind = [
37 "Ctrl q"
38 "Ctrl o"
39 ];
40 normal = {
41 "bind \"Ctrl m\"" = {
42 SwitchToMode = "Session";
43 };
44 };
45 "shared_except \"locked\"" = {
46 "bind \"Ctrl y\"" = {
47 "LaunchOrFocusPlugin \"file:~/.config/zellij/plugins/harpoon.wasm\"" = {
48 floating = true;
49 move_to_focused_tab = true;
50 };
51 };
52 };
53 };
54 load_plugins = {
55 "\"file:~/.config/zellij/plugins/zrpc.wasm\"" = { };
56 };
57 pane_frames = false;
58 show_startup_tips = false;
59 ui = {
60 pane_frames.hide_session_name = true;
61 };
62 };
63 };
64
65 xdg.configFile."zellij/plugins/zrpc.wasm".source = "${zrpc-wasm pkgs}/zrpc.wasm";
66 xdg.configFile."zellij/plugins/harpoon.wasm".source = "${harpoon-wasm pkgs}/harpoon.wasm";
67
68 xdg.configFile."zellij/layouts/split.kdl".text = ''
69 layout {
70 tab {
71 pane size="50%"
72 pane split_direction="vertical" size="50%" {
73 pane
74 pane
75 }
76 }
77 }
78 '';
79
80 programs.zoxide = {
81 enable = true;
82 enableFishIntegration = true;
83 };
84
85 programs.fish = {
86 enable = true;
87 shellAliases = {
88 agenix = "agenix -i ~/.config/agenix/yubikey-identity.txt";
89 };
90 interactiveShellInit = ''
91 set fish_greeting
92 # Set 1Password SSH agent socket, but only when not inside an
93 # SSH session — otherwise preserve the forwarded agent from
94 # `ssh -A` so YubiKey signing keeps working on remote hosts.
95 if not set -q SSH_CONNECTION
96 set -gx SSH_AUTH_SOCK ${config.home.homeDirectory}/.1password/agent.sock
97 end
98 # Load 1Password CLI plugins
99 if test -f ~/.config/op/plugins.sh
100 source ~/.config/op/plugins.sh
101 end
102 # Auto-launch zellij if not already inside a session
103 # Use systemd-run to escape niri's session scope so the server
104 # survives logout
105 if not set -q ZELLIJ
106 systemd-run --user --scope zellij
107 else
108 fastfetch --logo small
109 end
110
111 function y
112 set tmp (mktemp -t "yazi-cwd.XXXXXX")
113 yazi $argv --cwd-file="$tmp"
114 if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
115 builtin cd -- "$cwd"
116 end
117 rm -f -- "$tmp"
118 end
119 '';
120 functions = {
121 s3edit = ''
122 set file (basename $argv[1])
123 set tmpfile /tmp/$file
124 aws s3 cp $argv[1] $tmpfile
125 and $EDITOR $tmpfile
126 and aws s3 cp $tmpfile $argv[1]
127 '';
128 };
129 };
130
131 programs.starship = {
132 enable = true;
133 enableFishIntegration = true;
134 };
135
136 programs.alacritty = {
137 enable = true;
138 settings = {
139 terminal.shell.program = "fish";
140 window = {
141 decorations = "none";
142 opacity = 0.9;
143 };
144 font = {
145 normal = {
146 family = "BerkeleyMono Nerd Font";
147 style = "Regular";
148 };
149 size = 12.0;
150 };
151 };
152 };
153 };
154}