diff --git a/home/features/cli/fish/config.fish b/home/features/cli/fish/config.fish
index 6190dd0..502e154 100644
--- a/home/features/cli/fish/config.fish
+++ b/home/features/cli/fish/config.fish
@@ -20,37 +20,10 @@ set fish_greeting
 # }}}
 # {{{ Keybinds
 function fish_user_key_bindings
-  # {{{ Use vim-style keybinds
-  # Use the vim keybinds
   fish_vi_key_bindings
+  fish_nix_key_bindings
 
-  bind -e -M insert -k f10 # unbinds f10
   bind -M insert -m default -k f10 'commandline -f repaint' # Exit insert mode with <f10>
-  # }}}
-  # {{{ C-x to clear screen
-  bind -M default \cx "clear && commandline -f repaint"
-  bind -M insert  \cx "clear && commandline -f repaint"
-  # }}}
-  # {{{ C-z to run `fg`
-  bind -M default \cz "fg && commandline -f repaint"
-  bind -M insert  \cz "fg && commandline -f repaint"
-  # }}}
-  # {{{ C-enter to run command through less
-  bind -M default \e\[13\;2u "commandline -a ' | less' && commandline -f execute"
-  bind -M insert  \e\[13\;2u "commandline -a ' | less' && commandline -f execute"
-  # }}}
-  # {{{ C-g to open neogit
-  bind -M default \cg "nvim +Neogit"
-  bind -M insert  \cg "nvim +Neogit"
-  # }}}
-  # {{{ C-e to open $EDITOR
-  bind -M default \ce "$EDITOR"
-  bind -M insert  \ce "$EDITOR"
-  # }}}
-  # {{{ C-S-e to open commandline in $EDITOR
-  bind -M default \e\[69\;5u "commandline -f edit_command_buffer"
-  bind -M insert  \e\[69\;5u "commandline -f edit_command_buffer"
-  # }}}
 end
 # }}}
 # {{{ Helpers
diff --git a/home/features/cli/fish/default.nix b/home/features/cli/fish/default.nix
index 92650c3..0365bdb 100644
--- a/home/features/cli/fish/default.nix
+++ b/home/features/cli/fish/default.nix
@@ -1,4 +1,32 @@
 { pkgs, config, lib, ... }:
+let
+  repaint = "commandline -f repaint";
+  fishKeybinds = {
+    # C-x to clear screen
+    "\\cx" = "clear && ${repaint}";
+    # C-z to return to background process
+    "\\cz" = "fg && ${repaint}";
+    # C-y to yank current command
+    # TODO: make this work in xorg as well
+    "\\cy" = "wl-copy \$(commandline)";
+    # C-e to launch $EDITOR
+    "\\ce" = "$EDITOR";
+    # C-S-e to edit commandline using $EDITOR
+    "\\e\\[69\\;5u" = "edit_command_buffer";
+    # C-enter to run command through a pager
+    "\\e\\[13\\;2u" = "commandline -a ' | $PAGER' && commandline -f execute";
+    # C-g to open neogit
+    "\\cg" = "nvim +Neogit";
+  };
+
+  mkKeybind = key: value:
+    let escaped = lib.escapeShellArg value;
+    in
+    ''
+      bind -M default ${key} ${escaped}
+      bind -M insert  ${key} ${escaped}
+    '';
+in
 {
   # {{{ Fzf 
   programs.fzf = {
@@ -21,6 +49,11 @@
   programs.fish = {
     enable = true;
     interactiveShellInit = ''
+      # ❄️ Fish keybinds generated using nix ^~^
+      function fish_nix_key_bindings
+        ${lib.concatStringsSep "\n" (lib.mapAttrsToList mkKeybind fishKeybinds)}
+      end
+
       ${builtins.readFile ./config.fish}
 
       # Modify nix-shell to use `fish` as it's default shell