Neovim Lua plugin to split and join arguments. Part of 'mini.nvim' library.
Split and join arguments
See more details in Features and Documentation.
[!NOTE]
This was previously hosted at a personal echasnovski GitHub account. It was transferred to a dedicated organization to improve long term project stability. See more details here.
โฆฟ This is a part of mini.nvim library. Please use this link if you want to mention this module.
โฆฟ All contributions (issues, pull requests, discussions, etc.) are done inside of 'mini.nvim'.
โฆฟ See whole library documentation to learn about general design principles, disable/configuration recipes, and more.
โฆฟ See MiniMax for a full config example that uses this module.
If you want to help this project grow but don't know where to start, check out contributing guides of 'mini.nvim' or leave a Github star for 'mini.nvim' project and/or any its standalone Git repositories.
Demo
https://user-images.githubusercontent.com/24854248/223969793-e0e461ff-5a98-444f-9bc3-7b490ebfe59e.mp4
Features
- Mappings and Lua functions that modify arguments (regions inside brackets between allowed separators) under cursor.
MiniSplitjoin.toggle() in help file.
- Split - make every argument separator be on end of separate line. See MiniSplitjoin.split() in help file.
- Join - make all arguments be on single line. See MiniSplitjoin.join() in help file.
- Mappings are dot-repeatable in Normal mode and work in Visual mode.
- Customizable argument detection (see
MiniSplitjoin.config.detectin help file):
- Customizable pre and post hooks for both split and join. See
splitandjoinofMiniSplitjoin.configin help file.
- Works inside comments by using modified notion of indent. See
MiniSplitjoin.getindentpart()in help file.
- Provides low-level Lua functions for split and join at positions. See
MiniSplitjoin.splitat()andMiniSplitjoin.joinat()in help file.
- Search for arguments is done using Lua patterns (regex-like approach). Certain amount of false positives is to be expected.
- This module is mostly designed around
MiniSplitjoin.toggle(). If initial split positions are on different lines, join first and then split.
- Actions can be done on Visual mode selection, which mostly present as a safety route in case of incorrect detection of initial region. It uses
MiniSplitjoin.getvisualregion()which treats selection as full brackets (useva)and notvi)).
Installation
This plugin can be installed as part of 'mini.nvim' library (recommended) or as a standalone Git repository.
There are two branches to install from:
main(default, recommended) will have latest development version of plugin. All changes since last stable release should be perceived as being in beta testing phase (meaning they already passed alpha-testing and are moderately settled).stablewill be updated only upon releases with code tested during public beta-testing phase inmainbranch.
(Recommended) With vim.pack (on Neovim 0.12 and newer)
Full library
Follow 'mini.nvim' installation.
Standalone plugin
Main branch:
vim.pack.add({ 'https://github.com/nvim-mini/mini.splitjoin' })
Stable branch:
vim.pack.add({
{ src = 'https://github.com/nvim-mini/mini.splitjoin', version = 'stable' },
})
With mini.deps (before Neovim 0.12)
Full library
Follow recommended 'mini.deps' installation.
Standalone plugin:
Main branch:
add('nvim-mini/mini.splitjoin')
Stable branch:
add({ source = 'nvim-mini/mini.splitjoin', checkout = 'stable' })
With folke/lazy.nvim
Full library
Follow 'mini.nvim' installation.
Standalone plugin
Main branch:
{ 'nvim-mini/mini.splitjoin', version = false },
Stable branch:
{ 'nvim-mini/mini.splitjoin', version = '*' },
Important: don't forget to call require('mini.splitjoin').setup() to enable its functionality.
Note: if you are on Windows, there might be problems with too long file paths (like error: unable to create file <some file name>: Filename too long). Try doing one of the following:
- Enable corresponding git global config value:
git config --system core.longpaths true. Then try to reinstall. - Install plugin in other place with shorter path.
Default config
-- No need to copy this inside setup(). Will be used automatically.
{
-- Module mappings. Use '' (empty string) to disable one.
-- Created for both Normal and Visual modes.
mappings = {
toggle = 'gS',
split = '',
join = '',
},
-- Detection options: where split/join should be done detect = { -- Array of Lua patterns to detect region with arguments. -- Default: { '%b()', '%b[]', '%b{}' } brackets = nil,
-- String Lua pattern defining argument separator separator = ',',
-- Array of Lua patterns for sub-regions to exclude separators from. -- Enables correct detection in presence of nested brackets and quotes. -- Default: { '%b()', '%b[]', '%b{}', '%b""', "%b''" } exclude_regions = nil, },
-- Split options split = { hooks_pre = {}, hooks_post = {}, },
-- Join options join = { hooks_pre = {}, hooks_post = {}, }, }