Преглед изворни кода

feat(zellij): add zellij configuration

This commit introduces a comprehensive configuration
for the Zellij terminal multiplexer. The
configuration includes a rich set of keybindings
that are designed to be familiar to tmux users, with
modes for pane, tab, resize, move, and session
management.

The keybindings are structured to be easily
extensible and maintainable within the Nix language.
The configuration is enabled by default for all
users.
Zander Hawke пре 10 месеци
родитељ
комит
8b4ea887f5
2 измењених фајлова са 315 додато и 0 уклоњено
  1. 1 0
      home/features/cli/default.nix
  2. 314 0
      home/features/cli/zellij.nix

+ 1 - 0
home/features/cli/default.nix

@@ -8,6 +8,7 @@
     ./ssh.nix
     ./starship.nix
     ./tmux.nix
+    ./zellij.nix
   ];
 
   home.packages = [

+ 314 - 0
home/features/cli/zellij.nix

@@ -0,0 +1,314 @@
+{ isDarwin
+, ...
+}:
+let
+  convertAction = action:
+    if builtins.isString action then
+      { "${action}" = { _args = [ ]; }; }
+    else
+      let
+        name = builtins.head action;
+      in
+      if name == "LaunchOrFocusPlugin" then
+        {
+          "${name}" = {
+            _args = builtins.tail action;
+            _children = [
+              { floating = { _args = [ true ]; }; }
+              { move_to_focused_tab = { _args = [ true ]; }; }
+            ];
+          };
+        }
+      else
+        { "${name}" = { _args = builtins.tail action; }; };
+
+  convertBinding = binding:
+    let
+      key = builtins.head binding;
+      actions = builtins.elemAt binding 1;
+    in
+    {
+      bind = {
+        _args = [ key ];
+        _children = map convertAction actions;
+      };
+    };
+
+  convert = bindings:
+    { _children = map convertBinding bindings; };
+
+  mode = mode: [ "SwitchToMode" mode ];
+in
+{
+  programs.zellij = {
+    enable = true;
+    settings = {
+      theme = "kanagawa";
+      pane_frames = false;
+      default_mode = "locked";
+      default_shell = "fish";
+      copy_command = if isDarwin then "pbcopy" else "wl-copy";
+
+      keybinds = {
+        _props.clear-defaults = true;
+        _children = [
+          {
+            locked = convert [
+              [ "Ctrl g" [ (mode "normal") ] ]
+            ];
+          }
+          {
+            pane = convert [
+              [ "h" [ [ "MoveFocus" "left" ] ] ]
+              [ "j" [ [ "MoveFocus" "down" ] ] ]
+              [ "k" [ [ "MoveFocus" "up" ] ] ]
+              [ "l" [ [ "MoveFocus" "right" ] ] ]
+              [ "c" [ [ "SwitchToMode" "renamepane" ] [ "PaneNameInput" 0 ] ] ]
+              [ "d" [ [ "NewPane" "down" ] (mode "locked") ] ]
+              [ "e" [ [ "TogglePaneEmbedOrFloating" ] (mode "locked") ] ]
+              [ "f" [ [ "ToggleFocusFullscreen" ] (mode "locked") ] ]
+              [ "i" [ [ "TogglePanePinned" ] (mode "locked") ] ]
+              [ "n" [ [ "NewPane" ] (mode "locked") ] ]
+              [ "p" [ (mode "normal") ] ]
+              [ "r" [ [ "NewPane" "right" ] (mode "locked") ] ]
+              [ "w" [ [ "ToggleFloatingPanes" ] (mode "locked") ] ]
+              [ "x" [ [ "CloseFocus" ] (mode "locked") ] ]
+              [ "z" [ [ "TogglePaneFrames" ] (mode "locked") ] ]
+              [ "tab" [ [ "SwitchFocus" ] ] ]
+            ];
+          }
+          {
+            tab = convert [
+              [ "h" [ [ "GoToPreviousTab" ] ] ]
+              [ "j" [ [ "GoToNextTab" ] ] ]
+              [ "k" [ [ "GoToPreviousTab" ] ] ]
+              [ "l" [ [ "GoToNextTab" ] ] ]
+              [ "1" [ [ "GoToTab" 1 ] (mode "locked") ] ]
+              [ "2" [ [ "GoToTab" 2 ] (mode "locked") ] ]
+              [ "3" [ [ "GoToTab" 3 ] (mode "locked") ] ]
+              [ "4" [ [ "GoToTab" 4 ] (mode "locked") ] ]
+              [ "5" [ [ "GoToTab" 5 ] (mode "locked") ] ]
+              [ "6" [ [ "GoToTab" 6 ] (mode "locked") ] ]
+              [ "7" [ [ "GoToTab" 7 ] (mode "locked") ] ]
+              [ "8" [ [ "GoToTab" 8 ] (mode "locked") ] ]
+              [ "9" [ [ "GoToTab" 9 ] (mode "locked") ] ]
+              [ "[" [ [ "BreakPaneLeft" ] (mode "locked") ] ]
+              [ "]" [ [ "BreakPaneRight" ] (mode "locked") ] ]
+              [ "b" [ [ "BreakPane" ] (mode "locked") ] ]
+              [ "n" [ [ "NewTab" ] (mode "locked") ] ]
+              [ "r" [ (mode "renametab") [ "TabNameInput" 0 ] ] ]
+              [ "s" [ [ "ToggleActiveSyncTab" ] (mode "locked") ] ]
+              [ "t" [ (mode "normal") ] ]
+              [ "x" [ [ "CloseTab" ] (mode "locked") ] ]
+              [ "tab" [ [ "ToggleTab" ] ] ]
+            ];
+          }
+          {
+            resize = convert [
+              [ "h" [ [ "Resize" "Increase left" ] ] ]
+              [ "j" [ [ "Resize" "Increase down" ] ] ]
+              [ "k" [ [ "Resize" "Increase up" ] ] ]
+              [ "l" [ [ "Resize" "Increase right" ] ] ]
+              [ "+" [ [ "Resize" "Increase" ] ] ]
+              [ "-" [ [ "Resize" "Decrease" ] ] ]
+              [ "=" [ [ "Resize" "Increase" ] ] ]
+              [ "H" [ [ "Resize" "Decrease left" ] ] ]
+              [ "J" [ [ "Resize" "Decrease down" ] ] ]
+              [ "K" [ [ "Resize" "Decrease up" ] ] ]
+              [ "L" [ [ "Resize" "Decrease right" ] ] ]
+              [ "r" [ (mode "normal") ] ]
+            ];
+          }
+          {
+            move = convert [
+              [ "h" [ [ "MovePane" "left" ] ] ]
+              [ "j" [ [ "MovePane" "down" ] ] ]
+              [ "k" [ [ "MovePane" "up" ] ] ]
+              [ "l" [ [ "MovePane" "right" ] ] ]
+              [ "m" [ (mode "normal") ] ]
+              [ "n" [ [ "MovePane" ] ] ]
+              [ "p" [ [ "MovePaneBackwards" ] ] ]
+              [ "tab" [ [ "MovePane" ] ] ]
+            ];
+          }
+          {
+            scroll = convert [
+              [ "e" [ [ "EditScrollback" ] (mode "locked") ] ]
+              [ "f" [ (mode "entersearch") [ "SearchInput" 0 ] ] ]
+              [ "Alt h" [ [ "MoveFocusOrTab" "left" ] (mode "locked") ] ]
+              [ "Alt j" [ [ "MoveFocus" "down" ] (mode "locked") ] ]
+              [ "Alt k" [ [ "MoveFocus" "up" ] (mode "locked") ] ]
+              [ "Alt l" [ [ "MoveFocusOrTab" "right" ] (mode "locked") ] ]
+              [ "s" [ (mode "normal") ] ]
+            ];
+          }
+          {
+            search = convert [
+              [ "c" [ [ "SearchToggleOption" "CaseSensitivity" ] ] ]
+              [ "n" [ [ "Search" "down" ] ] ]
+              [ "o" [ [ "SearchToggleOption" "WholeWord" ] ] ]
+              [ "p" [ [ "Search" "up" ] ] ]
+              [ "w" [ [ "SearchToggleOption" "Wrap" ] ] ]
+            ];
+          }
+          {
+            session = convert [
+              [ "a" [ [ "LaunchOrFocusPlugin" "zellij:about" ] (mode "locked") ] ]
+              [ "c" [ [ "LaunchOrFocusPlugin" "configuration" ] (mode "locked") ] ]
+              [ "d" [ [ "Detach" ] ] ]
+              [ "o" [ (mode "normal") ] ]
+              [ "p" [ [ "LaunchOrFocusPlugin" "plugin-manager" ] (mode "locked") ] ]
+              [ "w" [ [ "LaunchOrFocusPlugin" "session-manager" ] (mode "locked") ] ]
+            ];
+          }
+          {
+            shared_among = {
+              _args = [ "normal" "locked" ];
+            } // convert [
+              [ "Ctrl h" [ [ "MoveFocusOrTab" "left" ] ] ]
+              [ "Ctrl j" [ [ "MoveFocus" "down" ] ] ]
+              [ "Ctrl k" [ [ "MoveFocus" "up" ] ] ]
+              [ "Ctrl l" [ [ "MoveFocusOrTab" "right" ] ] ]
+              [ "Alt +" [ [ "Resize" "Increase" ] ] ]
+              [ "Alt -" [ [ "Resize" "Decrease" ] ] ]
+              [ "Alt =" [ [ "Resize" "Increase" ] ] ]
+              [ "Alt [" [ [ "PreviousSwapLayout" ] ] ]
+              [ "Alt ]" [ [ "NextSwapLayout" ] ] ]
+              [ "Alt f" [ [ "ToggleFloatingPanes" ] ] ]
+              [ "Alt n" [ [ "NewPane" ] ] ]
+              [ "Alt o" [ [ "MoveTab" "right" ] ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "renametab" "renamepane" ];
+            } // convert [
+              [ "Ctrl g" [ (mode "locked") ] ]
+              [ "Ctrl q" [ [ "Quit" ] ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "entersearch" ];
+            } // convert [
+              [ "enter" [ (mode "locked") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "entersearch" "renametab" "renamepane" ];
+            } // convert [
+              [ "enter" [ (mode "locked") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "entersearch" "renametab" "renamepane" "move" ];
+            } // convert [
+              [ "m" [ (mode "move") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "entersearch" "search" "renametab" "renamepane" "session" ];
+            } // convert [
+              [ "o" [ (mode "session") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "tab" "entersearch" "renametab" "renamepane" ];
+            } // convert [
+              [ "t" [ (mode "tab") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "tab" "scroll" "entersearch" "renametab" "renamepane" ];
+            } // convert [
+              [ "s" [ (mode "scroll") ] ]
+            ];
+          }
+          {
+            shared_among = {
+              _args = [ "normal" "resize" "tab" "scroll" "prompt" "tmux" ];
+            } // convert [
+              [ "p" [ (mode "pane") ] ]
+            ];
+          }
+          {
+            shared_except = {
+              _args = [ "locked" "resize" "pane" "tab" "entersearch" "renametab" "renamepane" ];
+            } // convert [
+              [ "r" [ (mode "resize") ] ]
+            ];
+          }
+          {
+            shared_among = {
+              _args = [ "scroll" "search" ];
+            } // convert [
+              [ "PageDown" [ [ "PageScrollDown" ] ] ]
+              [ "PageUp" [ [ "PageScrollUp" ] ] ]
+              [ "Ctrl b" [ [ "PageScrollUp" ] ] ]
+              [ "Ctrl c" [ [ "ScrollToBottom" ] (mode "locked") ] ]
+              [ "d" [ [ "HalfPageScrollDown" ] ] ]
+              [ "Ctrl f" [ [ "PageScrollDown" ] ] ]
+              [ "h" [ [ "PageScrollUp" ] ] ]
+              [ "j" [ [ "ScrollDown" ] ] ]
+              [ "k" [ [ "ScrollUp" ] ] ]
+              [ "l" [ [ "PageScrollDown" ] ] ]
+              [ "u" [ [ "HalfPageScrollUp" ] ] ]
+            ];
+          }
+          {
+            "entersearch" = convert [
+              [ "Ctrl c" [ (mode "scroll") ] ]
+              [ "esc" [ (mode "scroll") ] ]
+              [ "enter" [ (mode "search") ] ]
+            ];
+          }
+          {
+            "renametab" = convert [
+              [ "esc" [ [ "UndoRenameTab" ] (mode "tab") ] ]
+            ];
+          }
+          {
+            "shared_among" = {
+              _args = [ "renametab" "renamepane" ];
+            } // convert [
+              [ "Ctrl c" [ (mode "locked") ] ]
+            ];
+          }
+          {
+            "renamepane" = convert [
+              [ "esc" [ [ "UndoRenamePane" ] (mode "pane") ] ]
+            ];
+          }
+        ];
+      };
+
+      plugins._children = [
+        { about._props.location = "zellij:about"; }
+        { compact-bar._props.location = "zellij:compact-bar"; }
+        { configuration._props.location = "zellij:configuration"; }
+        {
+          filepicker = {
+            _props.location = "zellij:strider";
+            _children = [{ cwd._args = [ "/" ]; }];
+          };
+        }
+        { plugin-manager._props.location = "zellij:plugin-manager"; }
+        { session-manager._props.location = "zellij:session-manager"; }
+        { status-bar._props.location = "zellij:status-bar"; }
+        { strider._props.location = "zellij:strider"; }
+        { tab-bar._props.location = "zellij:tab-bar"; }
+        {
+          welcome-screen = {
+            _props.location = "zellij:session-manager";
+            _children = [{ welcome_screen._args = [ true ]; }];
+          };
+        }
+      ];
+    };
+  };
+}