From: Lukas Hägele Date: Sun, 4 Oct 2026 13:05:03 +0000 (+0200) Subject: rewrite vsplit X-Git-Url: https://git.lhaegele.de/?a=commitdiff_plain;h=1af2fe937372f308d35660341b8f569677257c59;p=dotfiles_nvim.git rewrite vsplit --- diff --git a/lua/config/autocommands.lua b/lua/config/autocommands.lua index ef9e79a..590a94e 100644 --- a/lua/config/autocommands.lua +++ b/lua/config/autocommands.lua @@ -1,13 +1,11 @@ -- [vsplit]: create vsplit on startup -group_vsplit = vim.api.nvim_create_augroup('enforce-single-vsplit', { clear = true }), vim.api.nvim_create_autocmd( "VimEnter", { - desc = "run explore & create vsplit", - group = group_vsplit, + desc = "create vsplit on startup", + group = require("snippets.vsplit").augroup, callback = function() if vim.bo.filetype ~= "gitcommit" then -- split window on startup - local vsplit = require("snippets.vsplit") - vsplit.reset{ start_explorer = true } + require("snippets.vsplit").init() end end }) @@ -15,23 +13,12 @@ vim.api.nvim_create_autocmd( "VimEnter", { -- [vsplit]: force new window to the left pane vim.api.nvim_create_autocmd( "FileType", { desc = "force new window to the left pane", - group = group_vsplit, + group = require("snippets.vsplit").augroup, pattern = { "man", "help", "qf" }, callback = function() vim.schedule(function() - local vsplit = require("snippets.vsplit") local new_win = vim.api.nvim_get_current_win() - local new_buf = vim.api.nvim_get_current_buf() - if not ((new_win == vsplit.left_id) or (new_win == vsplit.right_id)) then - -- move new buffer to left pane - vim.api.nvim_win_set_buf(vsplit.left_id, new_buf) - -- close new window - vim.api.nvim_win_close(new_win, false) - -- switch focus - if vim.bo.filetype == "qf" then - vim.api.nvim_set_current_win(M.right_id) - end - end + require("snippets.vsplit").open_left(new_win) end) end }) diff --git a/lua/config/keymap.lua b/lua/config/keymap.lua index ac323f9..a9efdf8 100644 --- a/lua/config/keymap.lua +++ b/lua/config/keymap.lua @@ -5,8 +5,8 @@ vim.keymap.set('i', 'jj', '') vim.keymap.set("n", "#", "Vgc", { desc = "select line and toggle comment", remap = true }) vim.keymap.set("v", "#", "gc", { desc = "toggle comment of selected line", remap = true }) --- restore vsplit -vim.keymap.set("n", "s", require("snippets.vsplit").reset, { desc = "split vertically and move to new window" }) +-- [vsplit]: duplicate buffer to other window +vim.keymap.set("n", "vd", require("snippets.vsplit").duplicate, { desc = "duplicate current buffer to other window" }) -- move highlighted lines vim.keymap.set("v", "J", ":m '>+1gv=gv") diff --git a/lua/snippets/vsplit.lua b/lua/snippets/vsplit.lua index 1640ee0..9da0fd4 100644 --- a/lua/snippets/vsplit.lua +++ b/lua/snippets/vsplit.lua @@ -1,13 +1,14 @@ local M = {} --- create vsplit -M.reset = function(opts) - opts = opts or {} +--- group for all related autocommands +M.augroup = vim.api.nvim_create_augroup('enforce-single-vsplit', { clear = true }) - -- make sure that both windows exist - if not (M.left_id and M.right_id) then +--- initializes vertical split +function M.init() + local windows = vim.api.nvim_tabpage_list_wins(0) + if #windows == 1 then -- remember window id of left pane for later - M.left_id = vim.api.nvim_get_current_win() + M.left = vim.api.nvim_get_current_win() -- Define window configuration local win_config = { @@ -17,28 +18,48 @@ M.reset = function(opts) height = vim.o.lines } -- split window - M.right_id = vim.api.nvim_open_win(0, true, win_config) + M.right = vim.api.nvim_open_win(0, true, win_config) end +end - -- set working directory and start file browser (for each window) - do - local set_cwd = function(win_id, cwd) - vim.api.nvim_set_current_win(win_id) +--- moves buffer of {new_window} to the left window +--- +--- @param new_window integer `window-ID` newly opened window +function M.open_left(new_window) + if not ((new_window == M.left) or (new_window == M.right)) then + -- move new buffer to left window + local new_buffer = vim.api.nvim_win_get_buf(new_window) + local new_view = vim.fn.winsaveview() + vim.api.nvim_set_current_win(M.left) + vim.api.nvim_win_set_buf(M.left, new_buffer) + vim.fn.winrestview(new_view) - if cwd then - vim.cmd("cd" ..cwd) - else - cwd = vim.fn.getcwd() - end + -- close new window + vim.api.nvim_win_close(new_window, false) + end +end - if opts.start_explorer then - vim.cmd.Explore(cwd) - end +--- closes all windows except for the leftmost +function M.close() + local windows = vim.api.nvim_tabpage_list_wins(0) + for _, window in ipairs(windows) do + if not (window == M.left) then + vim.api.nvim_win_close(window, false) end - - set_cwd(M.left_id, opts.path) - set_cwd(M.right_id, opts.path) end end +--- duplicates the buffer of the current window to the left window +function M.duplicate() + local current_window = vim.api.nvim_get_current_win() + local other_window = (current_window == M.left) and M.right or M.left + + local current_buffer = vim.api.nvim_get_current_buf() + vim.api.nvim_win_set_buf(other_window, current_buffer) + + local view = vim.fn.winsaveview() + vim.api.nvim_set_current_win(other_window) + vim.fn.winrestview(view) +end + return M diff --git a/plugin/sessionmanager.lua b/plugin/sessionmanager.lua index 0f9eba0..9a00e88 100644 --- a/plugin/sessionmanager.lua +++ b/plugin/sessionmanager.lua @@ -63,6 +63,8 @@ local function session_picker(opts) actions.select_default:replace(function() actions.close(prompt_bufnr) + -- close right window(s) + require("snippets.vsplit").close() -- close all buffers vim.cmd("bufdo bdelete") @@ -75,9 +77,19 @@ local function session_picker(opts) history[path].timestamp = os.time() serialize_to_disk() + -- set new working directory + vim.cmd("cd" ..path) + -- open file explorer + vim.cmd.Explore(path) -- split window - local vsplit = require("snippets.vsplit") - vsplit.reset{ path = path, start_explorer = true } + require("snippets.vsplit").init() + -- load local config + vim.schedule(function() + local local_config = ".nvim.lua" + if vim.secure.read(local_config) then + vim.cmd("luafile" ..local_config) + end + end) end) return true end