rewrite vsplit
authorLukas Hägele <lukas.haegele93@web.de>
Sun, 4 Oct 2026 13:05:03 +0000 (15:05 +0200)
committerLukas Hägele <lukas.haegele93@web.de>
Sun, 4 Oct 2026 13:05:03 +0000 (15:05 +0200)
lua/config/autocommands.lua
lua/config/keymap.lua
lua/snippets/vsplit.lua
plugin/sessionmanager.lua

index ef9e79abb066fc13e9b58af3d54f88a4a3405bdd..590a94ef369c84bb3171f62370efb9d050188518 100644 (file)
@@ -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
 })
index ac323f991e3a848729a402b6e480f6da3675aeb2..a9efdf8ef47f0f3517d684d68574d8e0a182012c 100644 (file)
@@ -5,8 +5,8 @@ vim.keymap.set('i', 'jj', '<Esc>')
 vim.keymap.set("n", "<space>#", "Vgc", { desc = "select line and toggle comment", remap = true })
 vim.keymap.set("v", "<space>#", "gc", { desc = "toggle comment of selected line", remap = true })
 
--- restore vsplit
-vim.keymap.set("n", "<space>s", require("snippets.vsplit").reset, { desc = "split vertically and move to new window" })
+-- [vsplit]: duplicate buffer to other window
+vim.keymap.set("n", "<space>vd", require("snippets.vsplit").duplicate, { desc = "duplicate current buffer to other window" })
 
 -- move highlighted lines
 vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
index 1640ee05949c5958459a5351a16e1845f29342ee..9da0fd4eb43dc3d59e9641217fb46c3ececf44ca 100644 (file)
@@ -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
index 0f9eba0c1b88d32304458049670f0e54f8516ede..9a00e886e9b4d2dd216808d3185cb937f26e52ca 100644 (file)
@@ -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