one flake containing all of my nixos configs
theme "rose-pine-moon";
on_force_close "detach"
pane_frames false
default_layout "basic"
default_mode "locked"
scroll_buffer_size 20000
copy_clipboard "primary"  // primary or system, default is system
copy_on_select true

plugins {
    tab-bar { path "tab-bar"; }
    status-bar { path "status-bar"; }
    strider { path "strider"; }
    compact-bar { path "compact-bar"; }
}

// These keybindings mostly override everything about the default keybindings in an attempt
// to mimic the best parts of the Doom Emacs / Spacemacs keybindings style.
// 
// The keybindings are meant to be mnemonic as possible.
// 
// I'm referring to "panes" as "windows".
// For most of these modes I'm thinking of them as mnemonic key namespaces that take you to
// an action. For example, to move one pane to the left: `prefix` -> `w` -> `h`
// where `prefix` is the keybinding to get from "locked" mode into "normal" mode
// `w` takes you from "normal" mode into "pane" mode, then `h` moves panes and terminates the action.
// Once in "pane" mode ther are some non-terminating actions available, and I'm thinking of those as
// "transient" states that allow you to do a bunch of repeated actions in a row before exciting with `Esc`.
// I was introduced to this concept in Spacemacs.
// That's the overall strategy with these keybindings. This strategy is super easy to remember for me, and 
// does seem to reduce wrist strain (the dreaded RSI :scream:)

// it would be super cool to define custom modes, maybe i could make an attempt at that
// https://github.com/zellij-org/zellij/issues/248
keybinds {
  normal clear-defaults=true {
    bind "Esc" { SwitchToMode "locked"; }  // TODO rm when shared or shared_except works
    bind "Enter" { SwitchToMode "locked"; }
    bind "r" { SwitchToMode "resize"; }
    bind "w" { SwitchToMode "pane"; }
    bind "Tab" { SwitchToMode "tab"; }
    bind "g" { SwitchToMode "session"; }
    bind "?" { SwitchToMode "scroll"; }

	bind "Alt h" { MoveFocus "Left"; }
	bind "Alt j" { MoveFocus "Down"; }
	bind "Alt k" { MoveFocus "Up"; }
	bind "Alt l" { MoveFocus "Right"; }

	bind "1" { GoToTab 1; SwitchToMode "locked";}
	bind "2" { GoToTab 2; SwitchToMode "locked";}
	bind "3" { GoToTab 3; SwitchToMode "locked";}
	bind "4" { GoToTab 4; SwitchToMode "locked";}
	bind "5" { GoToTab 5; SwitchToMode "locked";}
	bind "6" { GoToTab 6; SwitchToMode "locked";}
	bind "7" { GoToTab 7; SwitchToMode "locked";}
	bind "9" { GoToTab 9; SwitchToMode "locked";}
	bind "Ctrl [" { PreviousSwapLayout; }
	bind "Ctrl ]" { NextSwapLayout; }
  }

  pane clear-defaults=true {
    bind "Esc" { SwitchToMode "locked"; }  // TODO rm when shared or shared_except works

	bind "Alt m" { MovePane "Left"; }
	bind "Alt n" { MovePane "Down"; }
	bind "Alt e" { MovePane "Up"; }
	bind "Alt i" { MovePane "Right"; }

	bind "m" { MoveFocus "Left"; SwitchToMode "locked"; }
	bind "n" { MoveFocus "Down"; SwitchToMode "locked"; }
	bind "e" { MoveFocus "Up"; SwitchToMode "locked"; }
	bind "i" { MoveFocus "Right"; SwitchToMode "locked"; }

    bind "h" { NewPane; SwitchToMode "locked"; }
    bind "d" { CloseFocus; SwitchToMode "locked"; }
    bind "f" { ToggleFocusFullscreen; SwitchToMode "locked"; }
    bind "F" { TogglePaneEmbedOrFloating; ToggleFocusFullscreen; SwitchToMode "locked"; }

    bind "N" { NewPane "Down"; SwitchToMode "locked"; }
    bind "I" { NewPane "Right"; SwitchToMode "locked"; }

    bind "z" { TogglePaneFrames; SwitchToMode "locked"; }

    // for pop and popping out a tiled window into a floating window
    bind "p" { ToggleFloatingPanes; SwitchToMode "locked"; }
    bind "P" { TogglePaneEmbedOrFloating; SwitchToMode "locked"; }

    // bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;}
  }

  resize clear-defaults=true {
    bind "Esc" { SwitchToMode "locked"; }  // TODO rm when shared or shared_except works

	bind "m" { Resize "Left"; }
	bind "n" { Resize "Down"; }
	bind "e" { Resize "Up"; }
	bind "i" { Resize "Right"; }
	bind "M" { Resize "Decrease Left"; }
	bind "N" { Resize "Decrease Down"; }
	bind "E" { Resize "Decrease Up"; }
	bind "I" { Resize "Decrease Right"; }
    bind "+" { Resize "Increase"; }
    bind "-" { Resize "Decrease"; }
  }

  tab clear-defaults=true {
    bind "Esc" { SwitchToMode "locked"; }  // TODO rm when shared or shared_except works

    bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; }

    bind "m" "e" "[" { GoToPreviousTab; }
    bind "i" "n" "]" { GoToNextTab; }
    bind "n" { NewTab; SwitchToMode "renametab"; TabNameInput 0; }
    bind "d" { CloseTab; SwitchToMode "locked"; }
    // bind "s" { ToggleActiveSyncTab; SwitchToMode "locked"; }
    bind "1" { GoToTab 1; SwitchToMode "locked"; }
    bind "2" { GoToTab 2; SwitchToMode "locked"; }
    bind "3" { GoToTab 3; SwitchToMode "locked"; }
    bind "4" { GoToTab 4; SwitchToMode "locked"; }
    bind "5" { GoToTab 5; SwitchToMode "locked"; }
    bind "6" { GoToTab 6; SwitchToMode "locked"; }
    bind "7" { GoToTab 7; SwitchToMode "locked"; }
    bind "8" { GoToTab 8; SwitchToMode "locked"; }
    bind "9" { GoToTab 9; SwitchToMode "locked"; }
    bind "Tab" { ToggleTab; SwitchToMode "locked"; }
  }
  renametab clear-defaults=true {
    bind "Esc" { UndoRenameTab; SwitchToMode "locked"; }
    bind "Enter" { SwitchToMode "locked"; }
  }

  // I'm stealing this `session` mode for a `git` namespace
  session clear-defaults=true {
    bind "Esc" { SwitchToMode "locked"; }  // TODO rm when shared or shared_except works

    bind "g" {
      Run "gitui" {
        direction "up"
        close-on-exit true
        name "gitui"
      };
      ToggleFocusFullscreen;
      SwitchToMode "locked";
    }
  }

  scroll clear-defaults=true {
    bind "Esc" { ScrollToBottom; SwitchToMode "locked"; }
    bind "Alt /" { SwitchToMode "EnterSearch"; SearchInput 0; }

    bind "e" { EditScrollback; SwitchToMode "Normal"; }
    bind "n" { ScrollDown; }
    bind "e" { ScrollUp; }
    bind "[" { PageScrollUp; }
    bind "]" { PageScrollDown; }
    bind "{" { HalfPageScrollUp; }
    bind "}" { HalfPageScrollDown; }
  }
  entersearch clear-defaults=true {
    bind "Ctrl c" "Esc" { SwitchToMode "scroll"; }
    bind "Enter" { SwitchToMode "Search"; }
  }
  search clear-defaults=true {
    bind "Esc" { ScrollToBottom; SwitchToMode "locked"; }

    bind "n" { Search "down"; }
    bind "N" "p" { Search "up"; }
    bind "C" { SearchToggleOption "CaseSensitivity"; }
    bind "W" { SearchToggleOption "Wrap"; }
    bind "O" { SearchToggleOption "WholeWord"; }
    bind "y" { Copy; }
  }

  // locked is the mode meant to be used most of the time, e.g. when actually doing work
  // TODO make my default layout start in locked mode
  locked clear-defaults=true {
    bind "Alt m" { SwitchToMode "normal"; }

	bind "Alt q" { Detach; }
	bind "Alt Q" { Quit; }



  }

  // FIXME shared_except does not seem to work, I'm not sure if I'm doing something wrong.
  // shared_except "locked" {
  //   bind "Esc" { SwitchToMode "locked"; }
  // }
}