initial commit
This commit is contained in:
4 files changed
+283
No files matched your search
@@ -0,0 +1,3 @@
|
||||
indent_type = "Spaces"
|
||||
indent_width = 2
|
||||
column_width = 100
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright © 2023 Stephen Waits <steve@waits.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,93 @@
|
||||
# Neovim Scratch Buffer Plugin
|
||||
|
||||
This plugin provides a simple way to work with scratch buffers in Neovim. It
|
||||
allows you to quickly open a scratch buffer in your current window or in a new
|
||||
split window. The plugin also offers the flexibility to configure the default
|
||||
name of the scratch buffer.
|
||||
|
||||
This plugin is based on
|
||||
[vim-scratch](https://github.com/duff/vim-scratch/tree/master), but written in
|
||||
lua for Neovim.
|
||||
|
||||
## Features
|
||||
|
||||
- Open a scratch buffer in the current window.
|
||||
- Open a scratch buffer in a new split window.
|
||||
- Automatically switch to an existing scratch buffer if it's already open.
|
||||
- Configure the default name for the scratch buffer.
|
||||
- The scratch buffer acts as a temporary workspace and is not backed by a file.
|
||||
|
||||
## Installation
|
||||
|
||||
To install this plugin, you can use your favorite Neovim package manager. For example:
|
||||
|
||||
### [lazy](https://github.com/folke/lazy.nvim) (recommended)
|
||||
|
||||
```lua
|
||||
{
|
||||
"https://git.sr.ht/~swaits/scratch.nvim",
|
||||
lazy = true,
|
||||
keys = {
|
||||
{ "<leader>bs", "<cmd>Scratch<cr>", desc = "Scratch Buffer", mode = "n" },
|
||||
{ "<leader>bS", "<cmd>ScratchSplit<cr>", desc = "Scratch Buffer (split)", mode = "n" },
|
||||
},
|
||||
cmd = {
|
||||
"Scratch",
|
||||
"ScratchSplit",
|
||||
},
|
||||
opts = {},
|
||||
}
|
||||
```
|
||||
|
||||
### [pckr](https://github.com/lewis6991/pckr.nvim)
|
||||
|
||||
```lua
|
||||
{
|
||||
"https://git.sr.ht/~swaits/scratch.nvim",
|
||||
config = function()
|
||||
require("scratch").setup()
|
||||
end
|
||||
}
|
||||
```
|
||||
|
||||
### [vim-plug](https://github.com/junegunn/vim-plug)
|
||||
|
||||
```vim
|
||||
Plug 'https://git.sr.ht/~swaits/scratch.nvim'
|
||||
lua require("scratch").setup()
|
||||
```
|
||||
|
||||
### Configuring
|
||||
|
||||
The default configuration options are listed below:
|
||||
|
||||
```lua
|
||||
opts = {
|
||||
-- The name of the scratch buffer
|
||||
buffer_name = "_SCRATCH_",
|
||||
}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Commands
|
||||
|
||||
The plugin provides two commands:
|
||||
|
||||
- `:Scratch` — Opens or switches to the scratch buffer in the current window.
|
||||
- `:ScratchSplit` — Opens or switches to the scratch buffer in a new split window.
|
||||
|
||||
### Lua Functions
|
||||
|
||||
You can also use the plugin's Lua functions directly:
|
||||
|
||||
- `require('scratch').open()` — Equivalent to `:Scratch`.
|
||||
- `require('scratch').split()` — Equivalent to `:ScratchSplit`.
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](LICENSE)
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Feel free to open issues or submit pull requests.
|
||||
@@ -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
|
||||
Reference in new issue
Block a user