split things out into multiple files

This commit is contained in:
2026-09-07 23:16:04 +02:00
parent 4174d3b9bf
commit 042375f4ed
12 changed files with 468 additions and 504 deletions
+46 -504
View File
@@ -8,78 +8,67 @@ vim.g.python3_host_prog = get_python_venv_path()
-- GENERAL SETTINGS {{{1
vim.cmd [=[
set autowriteall
set exrc
set secure
set clipboard=unnamedplus
set tabstop=4
set shiftwidth=0
set nu
set path=**
set nowrap
set shiftround
set expandtab
set incsearch
set guicursor=n-v-c:block-Cursor
set cursorline
set noswapfile
set list
set tags+=~/tags
set grepprg=rg\ --vimgrep\ --hidden\ --smart-case\ -g\ \'!**/tags\'\ -g\ \'!**/.git\'
set grepformat=%f:%l:%c:%m
nnoremap ,co :copen<CR>
autocmd BufEnter *__virtual* setlocal buftype=nofile bufhidden=hide noswapfile
autocmd BufWinEnter *.* silent! loadview
autocmd BufWinLeave *.* silent! mkview
autocmd FileType * setlocal indentexpr=
autocmd TextYankPost * silent! lua vim.highlight.on_yank {higroup='Visual', timeout=100}
filetype plugin off
inoremap <c-f> <c-x><c-f>
inoremap <c-o> <c-x><c-o>
nnoremap ,a <C-a>
nnoremap ,cD :call setqflist(filter(getqflist(), 'v:val != getqflist()[getqflist({"idx": 0}).idx - 1]'))<CR>
nnoremap ,cc :cclose<CR>
nnoremap ,co :copen<CR>
nnoremap ,cq :call setqflist([])<CR>:cclose<CR>
nnoremap <c-n> :cnext<CR>zz
nnoremap <c-p> :cprevious<CR>zz
nnoremap ,cu :colder<CR>
nnoremap ,cr :cnewer<CR>
nnoremap ,cu :colder<CR>
nnoremap ,h H
nnoremap ,l L
nnoremap H ^
nnoremap L $
xnoremap H ^
xnoremap L $
nnoremap ,m :wa<CR>:make<CR>
nnoremap ,rl :checktime<CR>
nnoremap ,t <c-w>v<c-w>l:terminal<CR>a
nnoremap ,x <C-x>
nnoremap <C-a> <Nop>
nnoremap <C-x> <Nop>
nnoremap ,a <C-a>
nnoremap ,x <C-x>
nnoremap ,rl :checktime<CR>
nnoremap ,m :wa<CR>:make<CR>
nnoremap <silent> <Esc> :noh<CR><Esc>
inoremap <c-o> <c-x><c-o>
inoremap <c-f> <c-x><c-f>
nnoremap ,cD :call setqflist(filter(getqflist(), 'v:val != getqflist()[getqflist({"idx": 0}).idx - 1]'))<CR>
nnoremap ,t <c-w>v<c-w>l:terminal<CR>a
" Don't include curdir, it just causes pain.
set viewoptions=folds,cursor
autocmd BufWinLeave *.* silent! mkview
autocmd BufWinEnter *.* silent! loadview
nnoremap <c-d> <c-d>zz
nnoremap <c-h> <c-w>h
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-l> <c-w>l
nnoremap <c-d> <c-d>zz
nnoremap <c-n> :cnext<CR>zz
nnoremap <c-p> :cprevious<CR>zz
nnoremap <c-u> <c-u>zz
nnoremap <silent> <Esc> :noh<CR><Esc>
nnoremap H ^
nnoremap L $
set autowriteall
set clipboard=unnamedplus
set cursorline
set expandtab
set exrc
set grepformat=%f:%l:%c:%m
set grepprg=rg\ --vimgrep\ --hidden\ --smart-case\ -g\ \'!**/tags\'\ -g\ \'!**/.git\'
set guicursor=n-v-c:block-Cursor
set incsearch
set list
set noswapfile
set nowrap
set nu
set path=**
set secure
set shiftround
set shiftwidth=0
set tabstop=4
set tags+=~/tags
set viewoptions=folds,cursor
tnoremap <c-w>c <c-\><c-n><c-w>c
autocmd TextYankPost * silent! lua vim.highlight.on_yank {higroup='Visual', timeout=100}
autocmd BufEnter *__virtual* setlocal buftype=nofile bufhidden=hide noswapfile
" Disable STUPID default rust plugin. And others
filetype plugin off
" remove annoying and bad indentation
autocmd FileType * setlocal indentexpr=
xnoremap H ^
xnoremap L $
]=]
vim.opt.completeopt = { 'menu', 'popup', 'preview', 'fuzzy' }
vim.keymap.set('n', ',cf', function()
local qf = vim.fn.getqflist()
for i, item in ipairs(qf) do
@@ -118,226 +107,6 @@ vim.api.nvim_create_autocmd({
end
})
-- FILE SPECIFIC AND AUTOCMDS {{{1
local file_specific = {
c = function()
vim.bo.expandtab = false
end,
make = function()
vim.bo.expandtab = false
end,
tsv = function()
vim.bo.tabstop = 32
vim.bo.expandtab = false
end,
odin = function()
vim.bo.expandtab = false
end,
go = function()
vim.bo.expandtab = false
end,
yaml = function()
vim.bo.tabstop = 2
end
}
vim.api.nvim_create_autocmd('BufEnter', {
callback = function()
local conf = file_specific[vim.bo.filetype]
if conf then conf() end
end,
})
-- CENTER TEXT "zen mode" {{{1
do
-- one shared statusline looks better for the split.
vim.o.laststatus = 3
local ID = '4f2de2e3-a1bf-481f-919c-7f68ec6511c9'
local function is_padding_window(win)
local ok, _ = pcall(vim.api.nvim_buf_get_var, vim.api.nvim_win_get_buf(win), ID)
return ok
end
local function calculate_padding()
local screen_width = vim.o.columns
local padding = math.floor((screen_width / 2 - 84 / 2) + 0.5)
if padding <= 0 then
return
end
return padding
end
local function get_padding_window()
local windows = vim.api.nvim_list_wins()
for _, win in ipairs(windows) do
if is_padding_window(win) then
return win
end
end
return nil
end
local padding_buffer = _G[ID]
if padding_buffer == nil then
padding_buffer = vim.api.nvim_create_buf(false, true)
vim.api.nvim_set_option_value('buftype', 'nofile', {buf = padding_buffer})
vim.api.nvim_set_option_value('modifiable', false, {buf = padding_buffer})
vim.api.nvim_create_autocmd('WinEnter', {
callback = function()
local curr_buff = vim.api.nvim_get_current_buf()
if curr_buff == padding_buffer then
if #vim.api.nvim_list_wins() == 1 then
vim.cmd"q"
end
local padding_window = vim.api.nvim_get_current_win()
vim.cmd"wincmd p"
local prev_win = vim.api.nvim_get_current_win()
local padding_window_info = vim.fn.getwininfo(padding_window)[1]
local prev_win_info = vim.fn.getwininfo(prev_win)[1]
if padding_window ~= prev_win and padding_window_info.wincol ~= prev_win_info.wincol then
return
end
local windows = vim.api.nvim_list_wins()
local leftmost_non_padding_window = nil
local min_col = math.huge
for _, win in ipairs(windows) do
local info = vim.fn.getwininfo(win)[1]
if info.wincol < min_col and padding_window_info.wincol < info.wincol then
min_col = info.wincol
leftmost_non_padding_window = win
end
end
if leftmost_non_padding_window ~= nil then
vim.api.nvim_set_current_win(leftmost_non_padding_window)
end
end
end,
})
vim.api.nvim_create_autocmd('VimResized', {
callback = function()
local padding_window = get_padding_window()
if padding_window ~= nil then
local padding = calculate_padding()
if padding == nil then
vim.api.nvim_win_close(padding_window, true)
else
vim.api.nvim_win_set_width(padding_window, padding)
end
end
vim.cmd"wincmd ="
end,
})
vim.api.nvim_buf_set_var(padding_buffer, ID, true)
_G[ID] = padding_buffer
end
local function toggle_padding()
local padding_window = get_padding_window()
if padding_window == nil then
vim.cmd"only"
local padding = calculate_padding()
if padding == nil then
return
end
local win = vim.api.nvim_open_win(padding_buffer, false, {
split = 'left',
win = -1,
width = padding,
})
vim.api.nvim_set_option_value('number', false, {win = win})
vim.api.nvim_set_option_value('relativenumber', false, {win = win})
vim.api.nvim_set_option_value('cursorline', false, {win = win})
vim.api.nvim_set_option_value('winfixwidth', true, {win = win})
vim.api.nvim_set_option_value("fillchars", "eob: ", { win = win })
vim.cmd"wincmd ="
else
vim.api.nvim_win_close(padding_window, true)
end
end
vim.keymap.set('n', ',z', toggle_padding)
end
-- auto select compiler {{{1
do
local compiler_mapping = {
dotnet={'*.csproj', '*.sln'},
basedpyright={'requirements.txt', 'pyproject.toml', '.venv'},
go={'go.mod'},
gcc={'*.c'},
['g++']={'*.cpp'},
cargo={'Cargo.toml'},
zig={'*.zig'}
}
---@param dir string?
---@param glob_pattern string
---@return boolean
local function file_or_folder_exists(dir, glob_pattern)
if dir == nil then return false end
return vim.fn.globpath(dir, glob_pattern, false, false, false) ~= ''
end
local all_folders_till_root = function()
local cwd = vim.fn.getcwd()
local folders = {cwd} -- array of all folders from cwd to root
for dir in vim.fs.parents(cwd) do
table.insert(folders, dir)
end
---@param _ any
---@param i integer
---@return integer?
---@return string?
local function iter(_, i)
if file_or_folder_exists(folders[i], '.git') then
return nil
end
i = i + 1
local f = folders[i]
if f == nil then
return nil
end
return i, f
end
return iter, nil, 0
end
---@param glob_pattern string
---@return boolean
local function look_for_file(glob_pattern)
for _, dir in all_folders_till_root() do
if file_or_folder_exists(dir, glob_pattern) then
return true
end
end
return false
end
local function auto_select_compiler()
for compiler, glob_patterns in pairs(compiler_mapping) do
for _, glob_pattern in ipairs(glob_patterns) do
if look_for_file(glob_pattern) then
vim.cmd('compiler! '..compiler)
end
end
end
if look_for_file('justfile') then
vim.go.makeprg = 'just'
end
end
auto_select_compiler()
vim.api.nvim_create_autocmd('DirChanged', {
callback = auto_select_compiler,
})
end
-- LAZY.NVIM BOOTSTRAP {{{1
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
if not (vim.uv or vim.loop).fs_stat(lazypath) then
@@ -588,67 +357,8 @@ require'lazy'.setup{ --{{{1
}
}
require'mason-lspconfig'.setup()
vim.opt.completeopt = { 'menu', 'popup', 'preview', 'fuzzy' }
vim.lsp.config.zls = {
before_init = function(_, _)
vim.g.zig_fmt_autosave = false -- may not be needed anymore?
end,
}
vim.lsp.config.lua_ls = {
settings = {
Lua = { runtime = { version = 'LuaJIT' } }
}
}
vim.lsp.config.gopls = {
filetypes = { -- unsure if this is entirely correct...
'go',
'gomod',
'gowork',
'gotmpl',
'html'
},
settings = {
gopls = {
templateExtensions = {'html', 'gotmpl'}
}
}
}
vim.lsp.config.basedpyright = {
settings = {
basedpyright = {
analysis = {
useLibraryCodeForTypes = true
},
},
},
}
vim.lsp.config.sourcekit = {
filetypes = {"swift"}
}
vim.lsp.config.ols = {
settings = {
verbose=true,
}
}
do -- turtle config
local turtle_server = vim.fn.exepath("turtle-language-server")
local node = vim.fn.exepath("node")
if turtle_server ~= "" and node ~= "" then
vim.lsp.config['turtle-language-server'] = {
cmd={ node, turtle_server, '--stdio' },
filetypes = { 'turtle', 'ttl' },
}
vim.lsp.enable('turtle-language-server')
end
end
vim.lsp.enable('gdscript')
vim.lsp.config('hls', {
filetypes = { 'haskell', 'lhaskell', 'cabal' },
})
vim.lsp.enable('hls')
vim.lsp.enable('sourcekit')
@@ -885,171 +595,3 @@ require'lazy'.setup{ --{{{1
end,
},
}
do -- split line {{{1
local SPLIT_DELIMETERS = { -- single characters only
[','] = true,
[';'] = true,
['|'] = true,
}
local SPLIT_BETWEEN = { -- single characters only
['('] = ')',
['['] = ']',
['{'] = '}',
['<'] = '>',
}
local SPLIT_IGNORE_BETWEEN = { --single characters only
['"'] = '"',
["'"] = "'",
}
local split_line = function()
local SPLIT_WHITESPACE = ' '
if vim.o.expandtab then
SPLIT_WHITESPACE = ''
for _ = 1, vim.o.tabstop do
SPLIT_WHITESPACE = SPLIT_WHITESPACE .. ' '
end
end
local line = vim.api.nvim_get_current_line()
local _, col = unpack(vim.api.nvim_win_get_cursor(0))
col = col + 1 -- Doing this to make it 1-indexed
---@type integer?
local first_bracket_i = nil
for i = col, #line do
local char = line:sub(i, i)
if SPLIT_BETWEEN[char] ~= nil then
first_bracket_i = i
break
end
end
if not first_bracket_i then
print('No opening brackets found after cursor on this line.')
return
end
---@type integer[]
local split_indexes = {} -- Populate this array
---@type integer?
local last_bracket_i = nil -- And find this index
do
---@type string[]
local closing_bracket_stack = {}
local icon_to_close_ignore = ''
local in_ignore = false
for i = first_bracket_i, #line do
local char = line:sub(i,i)
if in_ignore then
in_ignore = not (char == icon_to_close_ignore)
goto continue
end
if SPLIT_IGNORE_BETWEEN[char] ~= nil then
icon_to_close_ignore = SPLIT_IGNORE_BETWEEN[char]
in_ignore = true
goto continue
end
-- string handling complete
if SPLIT_BETWEEN[char] ~= nil then
table.insert(
closing_bracket_stack,
SPLIT_BETWEEN[char]
)
end
if char == closing_bracket_stack[#closing_bracket_stack] then
table.remove(closing_bracket_stack)
end
if #closing_bracket_stack == 1 and SPLIT_DELIMETERS[char] then
table.insert(split_indexes, i)
end
if #closing_bracket_stack == 0 then
last_bracket_i = i
break
end
::continue::
end
end
if not last_bracket_i then
print('The first opening bracket found after the cursor was not closed on this line.')
return
end
---@type string
local leading_whitespace = string.match(line, '^%s*')
local first_line = line:sub(1, first_bracket_i)
local last_line = leading_whitespace .. line:sub(last_bracket_i, #line)
if #split_indexes == 0 then
if (last_bracket_i - first_bracket_i == 1) then return end
local row, _ = unpack(vim.api.nvim_win_get_cursor(0))
line = line:sub(first_bracket_i+1, last_bracket_i-1)
local leading_pattern = '^[%s'
for k, _ in pairs(SPLIT_DELIMETERS) do
leading_pattern = leading_pattern .. k
end
leading_pattern = leading_pattern .. ']*'
line = line:gsub(leading_pattern, leading_whitespace .. SPLIT_WHITESPACE, 1)
line = line:gsub('[%s]*$', '', 1)
vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {last_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {line})
return
end
local middle_lines = {}
table.insert(
middle_lines,
line:sub(first_bracket_i+1, split_indexes[1])
)
for i = 1, #split_indexes-1 do
table.insert(
middle_lines,
line:sub(split_indexes[i], split_indexes[i+1])
)
end
table.insert(
middle_lines,
line:sub(split_indexes[#split_indexes], last_bracket_i-1)
)
local leading_pattern = '^[%s'
for k, _ in pairs(SPLIT_DELIMETERS) do
leading_pattern = leading_pattern .. k
end
leading_pattern = leading_pattern .. ']*'
-- Cleanup step
for i, middle_line in ipairs(middle_lines) do
middle_line = middle_line:gsub(leading_pattern, leading_whitespace .. SPLIT_WHITESPACE, 1)
middle_line = middle_line:gsub('[%s]*$', '', 1)
middle_lines[i] = middle_line
end
if middle_lines[#middle_lines]:match('^%s*$') ~= nil then
table.remove(middle_lines)
end
local row, _ = unpack(vim.api.nvim_win_get_cursor(0))
vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {last_line})
vim.api.nvim_buf_set_lines(0, row, row, false, middle_lines)
end
vim.keymap.set(
'n',
',s',
split_line,
{ silent = true }
)
end
+9
View File
@@ -0,0 +1,9 @@
return {
settings = {
basedpyright = {
analysis = {
useLibraryCodeForTypes = true
},
},
},
}
+14
View File
@@ -0,0 +1,14 @@
return {
filetypes = { -- unsure if this is entirely correct...
'go',
'gomod',
'gowork',
'gotmpl',
'html'
},
settings = {
gopls = {
templateExtensions = {'html', 'gotmpl'}
}
}
}
+3
View File
@@ -0,0 +1,3 @@
return {
filetypes = { 'haskell', 'lhaskell', 'cabal' },
}
+9
View File
@@ -0,0 +1,9 @@
return {
settings = {
Lua = {
runtime = {
version = 'LuaJIT'
}
}
}
}
+5
View File
@@ -0,0 +1,5 @@
return {
settings = {
verbose=true,
}
}
+3
View File
@@ -0,0 +1,3 @@
return {
filetypes = {"swift"}
}
+5
View File
@@ -0,0 +1,5 @@
return {
before_init = function(_, _)
vim.g.zig_fmt_autosave = false -- may not be needed anymore?
end,
}
@@ -0,0 +1,72 @@
local compiler_mapping = {
dotnet={'*.csproj', '*.sln'},
basedpyright={'requirements.txt', 'pyproject.toml', '.venv'},
go={'go.mod'},
gcc={'*.c'},
['g++']={'*.cpp'},
cargo={'Cargo.toml'},
zig={'*.zig'}
}
---@param dir string?
---@param glob_pattern string
---@return boolean
local function file_or_folder_exists(dir, glob_pattern)
if dir == nil then return false end
return vim.fn.globpath(dir, glob_pattern, false, false, false) ~= ''
end
local all_folders_till_root = function()
local cwd = vim.fn.getcwd()
local folders = {cwd} -- array of all folders from cwd to root
for dir in vim.fs.parents(cwd) do
table.insert(folders, dir)
end
---@param _ any
---@param i integer
---@return integer?
---@return string?
local function iter(_, i)
if file_or_folder_exists(folders[i], '.git') then
return nil
end
i = i + 1
local f = folders[i]
if f == nil then
return nil
end
return i, f
end
return iter, nil, 0
end
---@param glob_pattern string
---@return boolean
local function look_for_file(glob_pattern)
for _, dir in all_folders_till_root() do
if file_or_folder_exists(dir, glob_pattern) then
return true
end
end
return false
end
local function auto_select_compiler()
for compiler, glob_patterns in pairs(compiler_mapping) do
for _, glob_pattern in ipairs(glob_patterns) do
if look_for_file(glob_pattern) then
vim.cmd('compiler! '..compiler)
end
end
end
if look_for_file('justfile') then
vim.go.makeprg = 'just'
end
end
auto_select_compiler()
vim.api.nvim_create_autocmd('DirChanged', {
callback = auto_select_compiler,
})
@@ -0,0 +1,29 @@
local file_specific = {
c = function()
vim.bo.expandtab = false
end,
make = function()
vim.bo.expandtab = false
end,
tsv = function()
vim.bo.tabstop = 32
vim.bo.expandtab = false
end,
odin = function()
vim.bo.expandtab = false
end,
go = function()
vim.bo.expandtab = false
end,
yaml = function()
vim.bo.tabstop = 2
end
}
vim.api.nvim_create_autocmd('BufEnter', {
callback = function()
local conf = file_specific[vim.bo.filetype]
if conf then conf() end
end,
})
+164
View File
@@ -0,0 +1,164 @@
local SPLIT_DELIMETERS = { -- single characters only
[','] = true,
[';'] = true,
['|'] = true,
}
local SPLIT_BETWEEN = { -- single characters only
['('] = ')',
['['] = ']',
['{'] = '}',
['<'] = '>',
}
local SPLIT_IGNORE_BETWEEN = { --single characters only
['"'] = '"',
["'"] = "'",
}
local split_line = function()
local SPLIT_WHITESPACE = ' '
if vim.o.expandtab then
SPLIT_WHITESPACE = ''
for _ = 1, vim.o.tabstop do
SPLIT_WHITESPACE = SPLIT_WHITESPACE .. ' '
end
end
local line = vim.api.nvim_get_current_line()
local _, col = unpack(vim.api.nvim_win_get_cursor(0))
col = col + 1 -- Doing this to make it 1-indexed
---@type integer?
local first_bracket_i = nil
for i = col, #line do
local char = line:sub(i, i)
if SPLIT_BETWEEN[char] ~= nil then
first_bracket_i = i
break
end
end
if not first_bracket_i then
print('No opening brackets found after cursor on this line.')
return
end
---@type integer[]
local split_indexes = {} -- Populate this array
---@type integer?
local last_bracket_i = nil -- And find this index
do
---@type string[]
local closing_bracket_stack = {}
local icon_to_close_ignore = ''
local in_ignore = false
for i = first_bracket_i, #line do
local char = line:sub(i,i)
if in_ignore then
in_ignore = not (char == icon_to_close_ignore)
goto continue
end
if SPLIT_IGNORE_BETWEEN[char] ~= nil then
icon_to_close_ignore = SPLIT_IGNORE_BETWEEN[char]
in_ignore = true
goto continue
end
-- string handling complete
if SPLIT_BETWEEN[char] ~= nil then
table.insert(
closing_bracket_stack,
SPLIT_BETWEEN[char]
)
end
if char == closing_bracket_stack[#closing_bracket_stack] then
table.remove(closing_bracket_stack)
end
if #closing_bracket_stack == 1 and SPLIT_DELIMETERS[char] then
table.insert(split_indexes, i)
end
if #closing_bracket_stack == 0 then
last_bracket_i = i
break
end
::continue::
end
end
if not last_bracket_i then
print('The first opening bracket found after the cursor was not closed on this line.')
return
end
---@type string
local leading_whitespace = string.match(line, '^%s*')
local first_line = line:sub(1, first_bracket_i)
local last_line = leading_whitespace .. line:sub(last_bracket_i, #line)
if #split_indexes == 0 then
if (last_bracket_i - first_bracket_i == 1) then return end
local row, _ = unpack(vim.api.nvim_win_get_cursor(0))
line = line:sub(first_bracket_i+1, last_bracket_i-1)
local leading_pattern = '^[%s'
for k, _ in pairs(SPLIT_DELIMETERS) do
leading_pattern = leading_pattern .. k
end
leading_pattern = leading_pattern .. ']*'
line = line:gsub(leading_pattern, leading_whitespace .. SPLIT_WHITESPACE, 1)
line = line:gsub('[%s]*$', '', 1)
vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {last_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {line})
return
end
local middle_lines = {}
table.insert(
middle_lines,
line:sub(first_bracket_i+1, split_indexes[1])
)
for i = 1, #split_indexes-1 do
table.insert(
middle_lines,
line:sub(split_indexes[i], split_indexes[i+1])
)
end
table.insert(
middle_lines,
line:sub(split_indexes[#split_indexes], last_bracket_i-1)
)
local leading_pattern = '^[%s'
for k, _ in pairs(SPLIT_DELIMETERS) do
leading_pattern = leading_pattern .. k
end
leading_pattern = leading_pattern .. ']*'
-- Cleanup step
for i, middle_line in ipairs(middle_lines) do
middle_line = middle_line:gsub(leading_pattern, leading_whitespace .. SPLIT_WHITESPACE, 1)
middle_line = middle_line:gsub('[%s]*$', '', 1)
middle_lines[i] = middle_line
end
if middle_lines[#middle_lines]:match('^%s*$') ~= nil then
table.remove(middle_lines)
end
local row, _ = unpack(vim.api.nvim_win_get_cursor(0))
vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line})
vim.api.nvim_buf_set_lines(0, row, row, false, {last_line})
vim.api.nvim_buf_set_lines(0, row, row, false, middle_lines)
end
vim.keymap.set(
'n',
',s',
split_line,
{ silent = true }
)
+109
View File
@@ -0,0 +1,109 @@
-- one shared statusline looks better for the split.
vim.o.laststatus = 3
local ID = '4f2de2e3-a1bf-481f-919c-7f68ec6511c9'
local function is_padding_window(win)
local ok, _ = pcall(vim.api.nvim_buf_get_var, vim.api.nvim_win_get_buf(win), ID)
return ok
end
local function calculate_padding()
local screen_width = vim.o.columns
local padding = math.floor((screen_width / 2 - 84 / 2) + 0.5)
if padding <= 0 then
return
end
return padding
end
local function get_padding_window()
local windows = vim.api.nvim_list_wins()
for _, win in ipairs(windows) do
if is_padding_window(win) then
return win
end
end
return nil
end
local padding_buffer = _G[ID]
if padding_buffer == nil then
padding_buffer = vim.api.nvim_create_buf(false, true)
vim.api.nvim_set_option_value('buftype', 'nofile', {buf = padding_buffer})
vim.api.nvim_set_option_value('modifiable', false, {buf = padding_buffer})
vim.api.nvim_create_autocmd('WinEnter', {
callback = function()
local curr_buff = vim.api.nvim_get_current_buf()
if curr_buff == padding_buffer then
if #vim.api.nvim_list_wins() == 1 then
vim.cmd"q"
end
local padding_window = vim.api.nvim_get_current_win()
vim.cmd"wincmd p"
local prev_win = vim.api.nvim_get_current_win()
local padding_window_info = vim.fn.getwininfo(padding_window)[1]
local prev_win_info = vim.fn.getwininfo(prev_win)[1]
if padding_window ~= prev_win and padding_window_info.wincol ~= prev_win_info.wincol then
return
end
local windows = vim.api.nvim_list_wins()
local leftmost_non_padding_window = nil
local min_col = math.huge
for _, win in ipairs(windows) do
local info = vim.fn.getwininfo(win)[1]
if info.wincol < min_col and padding_window_info.wincol < info.wincol then
min_col = info.wincol
leftmost_non_padding_window = win
end
end
if leftmost_non_padding_window ~= nil then
vim.api.nvim_set_current_win(leftmost_non_padding_window)
end
end
end,
})
vim.api.nvim_create_autocmd('VimResized', {
callback = function()
local padding_window = get_padding_window()
if padding_window ~= nil then
local padding = calculate_padding()
if padding == nil then
vim.api.nvim_win_close(padding_window, true)
else
vim.api.nvim_win_set_width(padding_window, padding)
end
end
vim.cmd"wincmd ="
end,
})
vim.api.nvim_buf_set_var(padding_buffer, ID, true)
_G[ID] = padding_buffer
end
local function toggle_padding()
local padding_window = get_padding_window()
if padding_window == nil then
vim.cmd"only"
local padding = calculate_padding()
if padding == nil then
return
end
local win = vim.api.nvim_open_win(padding_buffer, false, {
split = 'left',
win = -1,
width = padding,
})
vim.api.nvim_set_option_value('number', false, {win = win})
vim.api.nvim_set_option_value('relativenumber', false, {win = win})
vim.api.nvim_set_option_value('cursorline', false, {win = win})
vim.api.nvim_set_option_value('winfixwidth', true, {win = win})
vim.api.nvim_set_option_value("fillchars", "eob: ", { win = win })
vim.cmd"wincmd ="
else
vim.api.nvim_win_close(padding_window, true)
end
end
vim.keymap.set('n', ',z', toggle_padding)