From 158700874c0073b8db86f9872617839338db80a6 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 15 May 2025 15:26:02 +0200 Subject: [PATCH] Adds config for smart split navigation --- home/modules/aerospace/default.nix | 6 ---- home/modules/aerospace/work.nix | 6 ---- home/modules/fish/work.nix | 3 +- .../nvim/config/lua/plugins/smart-splits.lua | 19 ++++++++++++ home/modules/wezterm/config/helpers.lua | 31 +++++++++++++++++-- home/modules/wezterm/config/keybindings.lua | 12 ++++--- 6 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 home/modules/nvim/config/lua/plugins/smart-splits.lua diff --git a/home/modules/aerospace/default.nix b/home/modules/aerospace/default.nix index 8101dd3..bce3c5d 100644 --- a/home/modules/aerospace/default.nix +++ b/home/modules/aerospace/default.nix @@ -20,13 +20,7 @@ "6" = "secondary"; }; mode.main.binding = { - alt-h = "focus left"; - alt-j = "focus down"; - alt-k = "focus up"; - alt-l = "focus right"; alt-shift-h = "move left"; - alt-shift-j = "move down"; - alt-shift-k = "move up"; alt-shift-l = "move right"; alt-comma = "layout tiles horizontal vertical"; alt-period = "layout accordion horizontal vertical"; diff --git a/home/modules/aerospace/work.nix b/home/modules/aerospace/work.nix index 5ee67d3..bb243fc 100644 --- a/home/modules/aerospace/work.nix +++ b/home/modules/aerospace/work.nix @@ -20,13 +20,7 @@ "6" = "secondary"; }; mode.main.binding = { - alt-h = "focus left"; - alt-j = "focus down"; - alt-k = "focus up"; - alt-l = "focus right"; alt-shift-h = "move left"; - alt-shift-j = "move down"; - alt-shift-k = "move up"; alt-shift-l = "move right"; alt-comma = "layout tiles horizontal vertical"; alt-period = "layout accordion horizontal vertical"; diff --git a/home/modules/fish/work.nix b/home/modules/fish/work.nix index 58a3726..218888d 100644 --- a/home/modules/fish/work.nix +++ b/home/modules/fish/work.nix @@ -8,7 +8,8 @@ fd . ~/dev/ride/apps/backend/backend-services -t d -d 1; fd . ~/dev/ride/apps/frontend/projects -t d -d 1; fd . ~/dev/ride/apps/native -t d -d 1; - fd . ~/dev/ride/packages -t d -d 1; + # Enable as soon as we have packages + # fd . ~/dev/ride/packages -t d -d 1; echo "$HOME/dev/ride/apps/frontend"; echo "$HOME/dev/ride/apps/lib"; echo "$HOME/dev/ride"; diff --git a/home/modules/nvim/config/lua/plugins/smart-splits.lua b/home/modules/nvim/config/lua/plugins/smart-splits.lua new file mode 100644 index 0000000..f968561 --- /dev/null +++ b/home/modules/nvim/config/lua/plugins/smart-splits.lua @@ -0,0 +1,19 @@ +return { + "mrjones2014/smart-splits.nvim", + keys = { + { "", "require('smart-splits').move_cursor_left", desc = "Move to left split", mode = "n" }, + { "", "require('smart-splits').move_cursor_down", desc = "Move to lower split", mode = "n" }, + { "", "require('smart-splits').move_cursor_up", desc = "Move to upper split", mode = "n" }, + { "", "require('smart-splits').move_cursor_right", desc = "Move to right split", mode = "n" }, + + { "", "require('smart-splits').resize_left", desc = "Resize to left", mode = "n" }, + { "", "require('smart-splits').resize_down", desc = "Resize lower", mode = "n" }, + { "", "require('smart-splits').resize_up", desc = "Resize upper", mode = "n" }, + { "", "require('smart-splits').resize_right", desc = "Resize to right", mode = "n" }, + + { "mh", "require('smart-splits').swap_buf_left", desc = "Swap to left" }, + { "mj", "require('smart-splits').swap_buf_down", desc = "Swap to lower" }, + { "mk", "require('smart-splits').swap_buf_up", desc = "Swap to upper" }, + { "ml", "require('smart-splits').swap_buf_right", desc = "Swap to right" }, + }, +} diff --git a/home/modules/wezterm/config/helpers.lua b/home/modules/wezterm/config/helpers.lua index 265cc4d..b0ffb22 100644 --- a/home/modules/wezterm/config/helpers.lua +++ b/home/modules/wezterm/config/helpers.lua @@ -44,11 +44,36 @@ function M.get_padding(padding, remove_padding_bottom) } end -function M.move_pane(key, direction) +function M.is_vim(pane) + -- this is set by the plugin, and unset on ExitPre in Neovim + return pane:get_user_vars().IS_NVIM == "true" +end + +local direction_keys = { + h = "Left", + j = "Down", + k = "Up", + l = "Right", +} + +function M.split_nav(resize_or_move, key) return { key = key, - mods = "LEADER", - action = wezterm.action.ActivatePaneDirection(direction), + mods = resize_or_move == "resize" and "META" or "CTRL", + action = wezterm.action_callback(function(win, pane) + if M.is_vim(pane) then + -- pass the keys through to vim/nvim + win:perform_action({ + SendKey = { key = key, mods = resize_or_move == "resize" and "META" or "CTRL" }, + }, pane) + else + if resize_or_move == "resize" then + win:perform_action({ AdjustPaneSize = { direction_keys[key], 3 } }, pane) + else + win:perform_action({ ActivatePaneDirection = direction_keys[key] }, pane) + end + end + end), } end diff --git a/home/modules/wezterm/config/keybindings.lua b/home/modules/wezterm/config/keybindings.lua index d659f16..014f80c 100644 --- a/home/modules/wezterm/config/keybindings.lua +++ b/home/modules/wezterm/config/keybindings.lua @@ -42,10 +42,14 @@ function M.apply_to_config(config) }), }, -- Navigation - helpers.move_pane("j", "Down"), - helpers.move_pane("k", "Up"), - helpers.move_pane("h", "Left"), - helpers.move_pane("l", "Right"), + helpers.split_nav("move", "h"), + helpers.split_nav("move", "j"), + helpers.split_nav("move", "k"), + helpers.split_nav("move", "l"), + helpers.split_nav("resize", "h"), + helpers.split_nav("resize", "j"), + helpers.split_nav("resize", "k"), + helpers.split_nav("resize", "l"), -- Workspaces { key = "s",