Column-first window management for Neovim.
windowcolumns.nvim helps you manage your Neovim layout with a column-first (vertical split–oriented) workflow. It lets you create full-height vertical splits, move entire columns of horizontal splits, and reposition windows between columns.
⚠️ Note: This plugin is not compatible with vertical splits nested inside horizontal splits.
create_column(direction)
Creates a new full-height vertical window (column) on the left or right of the current window.
Unlike a standard :vsplit, this works even when the current window is nested inside horizontal splits.
Parameters:
direction (optional): 'left' or 'right'.
If omitted, it defaults to the splitright option.Example:
require('windowcolumns').create_column('right')
move_column(direction)
Moves the entire column (all horizontal splits in the current column) to the left or right. This allows repositioning a group of vertically aligned windows as a unit.
Parameters:
direction: 'left' or 'right'.Example:
require('windowcolumns').move_column('right')
move_window(direction, column_opt)
Moves the current window in the specified direction, with special logic for horizontal moves between columns.
'up' or 'down': moves the window vertically within the current column.'left' or 'right': the behavior is determined by column_opt.Parameters:
direction: 'up', 'down', 'left', or 'right'.column_opt (optional): 'new', 'existing', or 'both'. Defaults to 'both'.Column Option Behavior:
'new': Moves the window out to a new column.'existing': Moves the window into an existing column based on the cursor's screen row.'both':Example:
require('windowcolumns').move_window('right', 'new')
Using lazy.nvim:
{
'mkajsjo/windowcolumns.nvim',
version = 'v1.0.0',
keys = {
{ '<leader>wv', function() require('windowcolumns').create_column() end },
{ '<leader>wh', function() require('windowcolumns').move_column('left') end },
{ '<leader>wl', function() require('windowcolumns').move_column('right') end },
{ '<leader>wj', function() require('windowcolumns').move_window('down') end },
{ '<leader>wk', function() require('windowcolumns').move_window('up') end },
{ '<leader>Wh', function() require('windowcolumns').move_window('left') end },
{ '<leader>Wl', function() require('windowcolumns').move_window('right') end },
},
}
Using vim-plug:
Plug 'mkajsjo/windowcolumns.nvim', { 'tag': 'v1.0.0' }
Using packer.nvim:
use {
'mkajsjo/windowcolumns.nvim',
tag = 'v1.0.0',
}
Example configuration if not using lazy.nvim:
vim.keymap.set('n', '<leader>wv', function() require('windowcolumns').create_column() end)
vim.keymap.set('n', '<leader>wh', function() require('windowcolumns').move_column('left') end)
vim.keymap.set('n', '<leader>wl', function() require('windowcolumns').move_column('right') end)
vim.keymap.set('n', '<leader>wj', function() require('windowcolumns').move_window('down') end)
vim.keymap.set('n', '<leader>wk', function() require('windowcolumns').move_window('up') end)
vim.keymap.set('n', '<leader>Wh', function() require('windowcolumns').move_window('left') end)
vim.keymap.set('n', '<leader>Wl', function() require('windowcolumns').move_window('right') end)