replace tmux with wezterm and add smart-splits navigation to neovim

This commit is contained in:
Anthony Rodriguez 2024-08-28 16:30:38 +02:00
parent 47ed2f02a9
commit 4d53c1848b
Signed by: nezia
GPG key ID: EE3BE97C040A86CE
7 changed files with 198 additions and 54 deletions

View file

@ -12,6 +12,7 @@
./plugins/neo-tree.nix ./plugins/neo-tree.nix
./plugins/which-key.nix ./plugins/which-key.nix
./plugins/project-nvim.nix ./plugins/project-nvim.nix
./plugins/smart-splits.nix
./plugins/misc.nix ./plugins/misc.nix
]; ];

View file

@ -4,6 +4,5 @@
programs.nixvim.plugins = { programs.nixvim.plugins = {
nvim-autopairs.enable = true; nvim-autopairs.enable = true;
direnv.enable = true; direnv.enable = true;
tmux-navigator.enable = true;
}; };
} }

View file

@ -0,0 +1,117 @@
{
programs.nixvim = {
plugins.smart-splits = {
enable = true;
settings = {
ignored_events = [
"BufEnter"
"WinEnter"
];
resize_mode = {
quit_key = "<ESC>";
resize_keys = [
"h"
"j"
"k"
"l"
];
silent = true;
};
};
};
keymaps = [
{
action = "<cmd>lua require('smart-splits').resize_left()<CR>";
key = "<A-h>";
options = {
desc = "Resize split to the left";
};
}
{
action = "<cmd>lua require('smart-splits').resize_down()<CR>";
key = "<A-j>";
options = {
desc = "Resize split downwards";
};
}
{
action = "<cmd>lua require('smart-splits').resize_up()<CR>";
key = "<A-k>";
options = {
desc = "Resize split upwards";
};
}
{
action = "<cmd>lua require('smart-splits').resize_right()<CR>";
key = "<A-l>";
options = {
desc = "Resize split to the right";
};
}
{
action = "<cmd>lua require('smart-splits').move_cursor_left()<CR>";
key = "<C-h>";
options = {
desc = "Move cursor to the left split";
};
}
{
action = "<cmd>lua require('smart-splits').move_cursor_down()<CR>";
key = "<C-j>";
options = {
desc = "Move cursor to the downward split";
};
}
{
action = "<cmd>lua require('smart-splits').move_cursor_up()<CR>";
key = "<C-k>";
options = {
desc = "Move cursor to the upward split";
};
}
{
action = "<cmd>lua require('smart-splits').move_cursor_right()<CR>";
key = "<C-l>";
options = {
desc = "Move cursor to the right split";
};
}
{
action = "<cmd>lua require('smart-splits').move_cursor_previous()<CR>";
key = "<C-\\>";
options = {
desc = "Move cursor to the previous split";
};
}
{
action = "<cmd>lua require('smart-splits').swap_buf_left()<CR>";
key = "<leader><leader>h>";
options = {
desc = "Swap buffer to the left";
};
}
{
action = "<cmd>lua require('smart-splits').swap_buf_down()<CR>";
key = "<leader><leader>j>";
options = {
desc = "Swap buffer downwards";
};
}
{
action = "<cmd>lua require('smart-splits').swap_buf_up()<CR>";
key = "<leader><leader>k>";
options = {
desc = "Swap buffer upwards";
};
}
{
action = "<cmd>lua require('smart-splits').swap_buf_right()<CR>";
key = "<leader><leader>l>";
options = {
desc = "Swap buffer to the right";
};
}
];
};
}

View file

@ -4,13 +4,87 @@
programs.wezterm = { programs.wezterm = {
enable = true; enable = true;
extraConfig = '' extraConfig = ''
local wezterm = require 'wezterm' local w = require('wezterm')
-- if you are *NOT* lazy-loading smart-splits.nvim (recommended)
local function is_vim(pane)
-- this is set by the plugin, and unset on ExitPre in Neovim
return pane:get_user_vars().IS_NVIM == 'true'
end
-- if you *ARE* lazy-loading smart-splits.nvim (not recommended)
-- you have to use this instead, but note that this will not work
-- in all cases (e.g. over an SSH connection). Also note that
-- `pane:get_foreground_process_name()` can have high and highly variable
-- latency, so the other implementation of `is_vim()` will be more
-- performant as well.
local function is_vim(pane)
-- This gsub is equivalent to POSIX basename(3)
-- Given "/foo/bar" returns "bar"
-- Given "c:\\foo\\bar" returns "bar"
local process_name = string.gsub(pane:get_foreground_process_name(), '(.*[/\\])(.*)', '%2')
return process_name == 'nvim' or process_name == 'vim'
end
local direction_keys = {
h = 'Left',
j = 'Down',
k = 'Up',
l = 'Right',
}
local function split_nav(resize_or_move, key)
return {
key = key,
mods = resize_or_move == 'resize' and 'META' or 'CTRL',
action = w.action_callback(function(win, pane)
if 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
return { return {
front_end = "WebGpu", front_end = "WebGpu",
enable_tab_bar = false, hide_tab_bar_if_only_one_tab = true,
show_new_tab_button_in_tab_bar = false,
enable_wayland = false, enable_wayland = false,
harfbuzz_features = { "ss01", "ss03" }, harfbuzz_features = { "ss01", "ss03" },
leader = { key = " ", mods = "CTRL", timeout_milliseconds = 1000 },
keys = {
{
mods = "LEADER",
key = "-",
action = wezterm.action.SplitVertical { domain = "CurrentPaneDomain" }
},
{
mods = "LEADER",
key = "=",
action = wezterm.action.SplitHorizontal { domain = "CurrentPaneDomain" }
},
-- move between split panes
split_nav('move', 'h'),
split_nav('move', 'j'),
split_nav('move', 'k'),
split_nav('move', 'l'),
-- resize panes
split_nav('resize', 'h'),
split_nav('resize', 'j'),
split_nav('resize', 'k'),
split_nav('resize', 'l'),
},
} }
''; '';
}; };

View file

@ -6,7 +6,6 @@
./starship.nix ./starship.nix
./zoxide.nix ./zoxide.nix
./direnv.nix ./direnv.nix
./tmux.nix
./zellij.nix ./zellij.nix
]; ];
} }

View file

@ -16,7 +16,7 @@ in
fish_vi_key_bindings # Enable Vi mode fish_vi_key_bindings # Enable Vi mode
fish_config theme choose "Catppuccin Frappe" fish_config theme choose "Catppuccin Frappe"
''; '';
shellAbbrs = { cd = "z"; ngc = "sudo nix-collect-garbage -d"; tmux = "tmux new -A -s main"; }; shellAbbrs = { cd = "z"; ngc = "sudo nix-collect-garbage -d"; };
plugins = [ { name = "fzf"; src = pkgs.fishPlugins.fzf.src; } ]; plugins = [ { name = "fzf"; src = pkgs.fishPlugins.fzf.src; } ];
}; };

View file

@ -1,46 +0,0 @@
{ pkgs, ... }:
{
programs.tmux = {
enable = true;
prefix = "C-space";
escapeTime = 10;
clock24 = true;
keyMode = "vi";
mouse = true;
baseIndex = 1;
extraConfig = ''
set-option -a terminal-features "''${TERM}:RGB"
'';
plugins = with pkgs; [
{
plugin = tmuxPlugins.catppuccin;
extraConfig = ''
set -g @catppuccin_window_left_separator ""
set -g @catppuccin_window_right_separator " "
set -g @catppuccin_window_middle_separator " "
set -g @catppuccin_window_number_position "right"
set -g @catppuccin_window_default_fill "number"
set -g @catppuccin_window_default_text "#W"
set -g @catppuccin_window_current_fill "number"
set -g @catppuccin_window_current_text "#W"
set -g @catppuccin_status_modules_right "directory user host session"
set -g @catppuccin_status_left_separator " "
set -g @catppuccin_status_right_separator ""
set -g @catppuccin_status_fill "icon"
set -g @catppuccin_status_connect_separator "no"
set -g @catppuccin_directory_text "#{pane_current_path}"
set -g @catppuccin_flavor 'frappe'
'';
}
tmuxPlugins.vim-tmux-navigator
tmuxPlugins.yank
];
};
programs.fzf.tmux.enableShellIntegration = true;
}