diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index fe02583e..6c1cc842 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -22,4 +22,22 @@ vim.cmd [[ vim.keymap.set('v', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) vim.keymap.set('v', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) +-- Provide function and keymap binding to show not saved changes of current buffer +function showBufferDiff() + vim.cmd [[w !diff % - ]] +end +-- ":vim.cmd([[w !diff % - ]])" +vim.keymap.set('n', 'pd', showBufferDiff, { expr = true, silent = true, desc = 'Print diff between buffer and file' }) + +-- Mimic the tmux config here. S for vertical split, v for horizontal: +-- - Remap for easier window control access +-- - Remap general the window control access to . +-- - Remap (swapping) particular "s" to "v" when entering window control access. +-- (Bear in mind that you have to release keys, and then press "s" or "v". +-- Otherwise the swapping of "s" and "v" does not work. +local map = vim.api.nvim_set_keymap +map('n', '', '', { noremap = false }) +map('n', 's', 'v', { noremap = true }) +map('n', 'v', 's', { noremap = true }) + return {} diff --git a/lua/custom/plugins/smart-split.lua b/lua/custom/plugins/smart-split.lua new file mode 100644 index 00000000..00abbb3a --- /dev/null +++ b/lua/custom/plugins/smart-split.lua @@ -0,0 +1,132 @@ +return { + 'mrjones2014/smart-splits.nvim', + dependencies = { + 'pogyomo/submode.nvim', + }, + -- config = function() end, + config = function() + require('smart-splits').setup { + -- Ignored filetypes (only while resizing) + ignored_filetypes = { + 'nofile', + 'quickfix', + 'prompt', + }, + -- Ignored buffer types (only while resizing) + ignored_buftypes = { 'NvimTree' }, + -- the default number of lines/columns to resize by at a time + default_amount = 3, + -- Desired behavior when your cursor is at an edge and you + -- are moving towards that same edge: + -- 'wrap' => Wrap to opposite side + -- 'split' => Create a new split in the desired direction + -- 'stop' => Do nothing + -- function => You handle the behavior yourself + -- NOTE: If using a function, the function will be called with + -- a context object with the following fields: + -- { + -- mux = { + -- type:'tmux'|'wezterm'|'kitty' + -- current_pane_id():number, + -- is_in_session(): boolean + -- current_pane_is_zoomed():boolean, + -- -- following methods return a boolean to indicate success or failure + -- current_pane_at_edge(direction:'left'|'right'|'up'|'down'):boolean + -- next_pane(direction:'left'|'right'|'up'|'down'):boolean + -- resize_pane(direction:'left'|'right'|'up'|'down'):boolean + -- split_pane(direction:'left'|'right'|'up'|'down',size:number|nil):boolean + -- }, + -- direction = 'left'|'right'|'up'|'down', + -- split(), -- utility function to split current Neovim pane in the current direction + -- wrap(), -- utility function to wrap to opposite Neovim pane + -- } + -- NOTE: `at_edge = 'wrap'` is not supported on Kitty terminal + -- multiplexer, as there is no way to determine layout via the CLI + at_edge = 'wrap', + -- when moving cursor between splits left or right, + -- place the cursor on the same row of the *screen* + -- regardless of line numbers. False by default. + -- Can be overridden via function parameter, see Usage. + move_cursor_same_row = false, + -- whether the cursor should follow the buffer when swapping + -- buffers by default; it can also be controlled by passing + -- `{ move_cursor = true }` or `{ move_cursor = false }` + -- when calling the Lua function. + cursor_follows_swapped_bufs = false, + -- resize mode options + resize_mode = { + -- key to exit persistent resize mode + quit_key = '', + -- keys to use for moving in resize mode + -- in order of left, down, up' right + resize_keys = { 'h', 'j', 'k', 'l' }, + -- set to true to silence the notifications + -- when entering/exiting persistent resize mode + silent = false, + -- must be functions, they will be executed when + -- entering or exiting the resize mode + hooks = { + on_enter = nil, + on_leave = nil, + }, + }, + -- ignore these autocmd events (via :h eventignore) while processing + -- smart-splits.nvim computations, which involve visiting different + -- buffers and windows. These events will be ignored during processing, + -- and un-ignored on completed. This only applies to resize events, + -- not cursor movement events. + ignored_events = { + 'BufEnter', + 'WinEnter', + }, + -- enable or disable a multiplexer integration; + -- automatically determined, unless explicitly disabled or set, + -- by checking the $TERM_PROGRAM environment variable, + -- and the $KITTY_LISTEN_ON environment variable for Kitty + multiplexer_integration = nil, + -- disable multiplexer navigation if current multiplexer pane is zoomed + -- this functionality is only supported on tmux and Wezterm due to kitty + -- not having a way to check if a pane is zoomed + disable_multiplexer_nav_when_zoomed = true, + -- Supply a Kitty remote control password if needed, + -- or you can also set vim.g.smart_splits_kitty_password + -- see https://sw.kovidgoyal.net/kitty/conf/#opt-kitty.remote_control_password + kitty_password = nil, + -- default logging level, one of: 'trace'|'debug'|'info'|'warn'|'error'|'fatal' + log_level = 'info', + persistent_resize_mode = true, + } + + -- vim.keymap.set('n', 'r', require('smart-splits').start_resize_mode, { desc = 'Start resize mode' }) + vim.keymap.set('n', '', require('smart-splits').move_cursor_right, { desc = 'Move right' }) + vim.keymap.set('n', '', require('smart-splits').move_cursor_left, { desc = 'Move left' }) + vim.keymap.set('n', '', require('smart-splits').move_cursor_down, { desc = 'Move down' }) + vim.keymap.set('n', '', require('smart-splits').move_cursor_up, { desc = 'Move up' }) + + -- Resize + local submode = require 'submode' + submode.create('WinResize', { + mode = 'n', + enter = 'r', + leave = { '', 'q', '' }, + hook = { + on_enter = function() + vim.notify 'Use { h, j, k, l } or { , , , } to resize the window' + end, + on_leave = function() + vim.notify '' + end, + }, + default = function(register) + register('h', require('smart-splits').resize_left, { desc = 'Resize left' }) + register('j', require('smart-splits').resize_down, { desc = 'Resize down' }) + register('k', require('smart-splits').resize_up, { desc = 'Resize up' }) + register('l', require('smart-splits').resize_right, { desc = 'Resize right' }) + register('', require('smart-splits').resize_left, { desc = 'Resize left' }) + register('', require('smart-splits').resize_down, { desc = 'Resize down' }) + register('', require('smart-splits').resize_up, { desc = 'Resize up' }) + register('', require('smart-splits').resize_right, { desc = 'Resize right' }) + end, + }) + end, +}