initial commit

This commit is contained in:
swaits committed 2023-10-30 22:04:32 -06:00
commit b8dfde353a
4 files changed
+283

No files matched your search

+166
View File
@@ -0,0 +1,166 @@
local M = {}
--- Checks if the current buffer is modified.
--
-- Returns:
-- bool: True if the buffer is modified, False otherwise.
--
local function is_buffer_modified()
local buf = vim.api.nvim_get_current_buf()
return vim.api.nvim_buf_get_option(buf, "modified")
end
--- Switch to an existing buffer in Neovim.
--
-- This function checks if a buffer is already open in a window. If it is, it
-- switches to that window. If it is not, it switches to the existing buffer.
--
-- @param new_window (boolean) Whether to open the buffer in a new window. If
-- true, the buffer will be opened in a new split window. If false, the buffer
-- will be opened in the current window.
-- @param buffer_num (number) The buffer number of the buffer.
--
-- @return None
--
local function switch_to_existing_buffer(new_window, buffer_num)
-- Check if the buffer number is valid
if type(buffer_num) ~= "number" or buffer_num < 1 then
error("Invalid buffer number provided to switch_to_existing_buffer")
return
end
-- See if this buffer is already open in a window
local window_num = vim.fn.bufwinnr(buffer_num)
if window_num ~= -1 then
-- Switch to that window (even if we're already there)
vim.cmd(window_num .. " wincmd w")
else
-- Switch to the existing scratch buffer
local cmd = new_window and "split +buffer " or "buffer "
vim.cmd(cmd .. buffer_num)
end
end
--- Creates a new scratch buffer in Neovim.
--
-- This function creates a new scratch buffer in Neovim, either in a new window
-- or by editing the current buffer. The buffer is configured to work like a
-- scratch buffer, meaning it is not backed by a file and has specific options
-- set.
--
-- @param new_window (boolean) Whether to create the scratch buffer in a new
-- window. If true, the buffer will be created in a new window. If false, the
-- buffer will be created by editing the current buffer.
-- @param buffer_name (string) The name of the buffer.
--
-- @return None
--
local function create_new_scratch_buffer(new_window, buffer_name)
-- Check if the buffer name is set
if not buffer_name or type(buffer_name) ~= "string" then
error("Buffer name not set or invalid in create_new_scratch_buffer")
return
end
-- Either new (for split) or edit the new buffer with buffer_name
local cmd = new_window and "new " or "edit "
vim.cmd(cmd .. buffer_name)
-- Sets the options for the buffer to work like a scratch buffer.
local buf = vim.api.nvim_get_current_buf() -- should always be 0
vim.api.nvim_buf_set_option(buf, "bufhidden", "hide") -- what to do when the buffer is hidden
vim.api.nvim_buf_set_option(buf, "buflisted", true) -- include the buffer in the :bnext list
vim.api.nvim_buf_set_option(buf, "buftype", "nofile") -- nofile means the buffer isn't backed by a file and we control its name
vim.api.nvim_buf_set_option(buf, "swapfile", false) -- never swapfiles
end
--- Opens or splits a window based on the specified conditions.
--
-- This function checks if a new window needs to be opened or if it should
-- switch to an existing buffer. It first determines if a new window is
-- required based on the input parameter or if the current buffer is modified.
-- Then, it searches for an existing scratch buffer. If found, it switches to
-- that buffer. Otherwise, it creates a new scratch buffer.
--
-- @param new_window A boolean indicating whether a new window should be created. If not provided,
-- it defaults to the state of the buffer's modification (true if modified).
--
-- @return None
--
local function open_or_split(new_window)
-- Create new window if requested or if buffer is modified
new_window = new_window or is_buffer_modified()
-- Look for an existing scratch buffer
local scratch_buffer_num = vim.fn.bufnr(M.config.buffer_name)
if scratch_buffer_num ~= -1 then
-- Found it, switch to it
switch_to_existing_buffer(new_window, scratch_buffer_num)
else
-- Didn't find it, create one
create_new_scratch_buffer(new_window, M.config.buffer_name)
end
end
--- Splits the current window and opens or switches to the scratch buffer.
--
-- This function is designed to be a public interface for opening or switching
-- to the scratch buffer in a new split window. It internally calls the
-- `open_or_split` function with `true` to indicate the need for a split window.
--
-- Usage:
-- :lua require('scratch').split()
--
function M.split()
open_or_split(true)
end
--- Opens or switches to the scratch buffer in the current window.
--
-- This function is a public interface for opening or switching to the scratch
-- buffer in the current window without splitting. It calls the `open_or_split`
-- function with `false`, indicating no new window is needed.
--
-- Usage:
-- :lua require('scratch').open()
--
function M.open()
open_or_split(false)
end
--- Sets up the scratch buffer plugin with optional configuration.
--
-- This function initializes the scratch buffer plugin and binds Neovim
-- commands to the plugin's functionalities. It also allows for optional
-- configuration through the `opts` parameter.
--
-- @param opts (table) Optional configuration table. It can contain a key
-- `buffer_name` to specify the name of the scratch buffer. If not provided,
-- defaults to "_SCRATCH_". An error is raised if `buffer_name` is provided but
-- is not a string.
--
-- Usage:
-- :lua require('scratch').setup({ buffer_name = "my_scratch" })
--
function M.setup(opts)
-- Default configuration
M.config = {
buffer_name = "_SCRATCH_",
}
-- Check for configuration overrides passed in via opts
if opts ~= nil and type(opts) == "table" then
if opts.buffer_name and type(opts.buffer_name) ~= "string" then
error("Invalid buffer name provided in setup options")
return
end
M.config.buffer_name = opts.buffer_name or M.config.buffer_name
end
-- Bind commands to our lua functions
vim.api.nvim_create_user_command("Scratch", M.open, {})
vim.api.nvim_create_user_command("ScratchSplit", M.split, {})
end
return M