-- [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
})
-- [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
})
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")
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 = {
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
actions.select_default:replace(function()
actions.close(prompt_bufnr)
+ -- close right window(s)
+ require("snippets.vsplit").close()
-- close all buffers
vim.cmd("bufdo bdelete")
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