169 lines
4.4 KiB
Lua
169 lines
4.4 KiB
Lua
require('modules.theme')
|
|
require('modules.terminal')
|
|
|
|
local api = vim.api
|
|
local au = api.nvim_create_autocmd
|
|
local group = api.nvim_create_augroup('core.events', { clear = true })
|
|
|
|
vim.api.nvim_create_user_command('W', function()
|
|
vim.cmd('w')
|
|
end, { desc = 'Write current buffer' })
|
|
|
|
function _G.see(val)
|
|
local lines = vim.split(vim.inspect(val), '\n')
|
|
vim.cmd('new')
|
|
vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
|
|
vim.bo.buftype = 'nofile'
|
|
vim.bo.bufhidden = 'wipe'
|
|
end
|
|
|
|
vim.api.nvim_create_user_command('MessagesToBuffer', function()
|
|
local output = vim.api.nvim_exec2('silent messages', { output = true }).output or ''
|
|
local lines = vim.split(output, '\n', { plain = true, trimempty = false })
|
|
|
|
vim.cmd('new')
|
|
local bufnr = vim.api.nvim_get_current_buf()
|
|
vim.bo[bufnr].buftype = 'nofile'
|
|
vim.bo[bufnr].bufhidden = 'wipe'
|
|
vim.bo[bufnr].swapfile = false
|
|
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
|
|
end, { desc = 'Open :messages output in a scratch buffer' })
|
|
|
|
vim.api.nvim_create_user_command('CmdToBuffer', function(opts)
|
|
local cmd = table.concat(opts.fargs, ' ')
|
|
|
|
vim.g.__cmd_to_buffer_cmd = cmd
|
|
vim.g.__cmd_to_buffer_out = nil
|
|
|
|
local exec_line = opts.bang and 'silent execute' or 'execute'
|
|
local ok, err = pcall(vim.cmd, string.format(
|
|
[[
|
|
redir => g:__cmd_to_buffer_out
|
|
%s g:__cmd_to_buffer_cmd
|
|
redir END
|
|
]],
|
|
exec_line
|
|
))
|
|
if not ok then
|
|
pcall(vim.cmd, 'redir END')
|
|
error(err)
|
|
end
|
|
|
|
local output = vim.g.__cmd_to_buffer_out or ''
|
|
vim.g.__cmd_to_buffer_cmd = nil
|
|
vim.g.__cmd_to_buffer_out = nil
|
|
local lines = vim.split(output, '\n', { plain = true, trimempty = false })
|
|
|
|
vim.cmd('new')
|
|
local bufnr = vim.api.nvim_get_current_buf()
|
|
vim.bo[bufnr].buftype = 'nofile'
|
|
vim.bo[bufnr].bufhidden = 'wipe'
|
|
vim.bo[bufnr].swapfile = false
|
|
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
|
|
end, { nargs = '+', bang = true, complete = 'command', desc = 'Run an Ex command and open its output in a scratch buffer' })
|
|
|
|
-- Automatically create a scratch buffer if Neovim starts with no files
|
|
au('VimEnter', {
|
|
group = group,
|
|
callback = function()
|
|
-- Only trigger if no file arguments are passed
|
|
if vim.fn.argc() == 0 then
|
|
vim.cmd('enew')
|
|
vim.bo.buftype = 'nofile'
|
|
vim.bo.bufhidden = 'wipe'
|
|
vim.bo.swapfile = false
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Highlight when yanking (copying) text
|
|
au('TextYankPost', {
|
|
group = group,
|
|
callback = function()
|
|
vim.highlight.on_yank({ timeout = 200 })
|
|
end,
|
|
})
|
|
|
|
-- Disable comment continuation only when using 'o'/'O', but keep it for <Enter>
|
|
au('FileType', {
|
|
group = group,
|
|
pattern = '*',
|
|
callback = function()
|
|
vim.opt_local.formatoptions:remove('o')
|
|
end,
|
|
})
|
|
|
|
-- Show cursor line only in active window
|
|
au({ 'WinEnter', 'InsertLeave' }, {
|
|
group = group,
|
|
callback = function()
|
|
if vim.w.auto_cursorline then
|
|
vim.wo.cursorline = true
|
|
vim.w.auto_cursorline = nil
|
|
end
|
|
end,
|
|
})
|
|
|
|
au({ 'WinLeave', 'InsertEnter' }, {
|
|
group = group,
|
|
callback = function()
|
|
-- Keep it on NvimTree to show current file
|
|
if vim.bo.filetype == 'NvimTree' then
|
|
return
|
|
end
|
|
if vim.wo.cursorline then
|
|
vim.w.auto_cursorline = true
|
|
vim.wo.cursorline = false
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Autocompletion
|
|
au('LspAttach', {
|
|
group = group,
|
|
callback = function(event)
|
|
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
|
if not client then
|
|
return
|
|
end
|
|
|
|
-- Enable native completion
|
|
if client:supports_method('textDocument/completion') then
|
|
vim.lsp.completion.enable(true, client.id, event.buf, { autotrigger = true })
|
|
end
|
|
end,
|
|
})
|
|
vim.lsp.handlers['textDocument/completion'] = function(err, result, ctx, config)
|
|
if err or not result then
|
|
return
|
|
end
|
|
for _, item in ipairs(result.items or result) do
|
|
if item.kind then
|
|
local kind = vim.lsp.protocol.CompletionItemKind[item.kind] or ''
|
|
item.menu = '[' .. kind .. ']'
|
|
end
|
|
end
|
|
return vim.lsp.completion._on_completion_result(err, result, ctx, config)
|
|
end
|
|
|
|
au('InsertEnter', {
|
|
group = group,
|
|
once = true,
|
|
callback = function()
|
|
require('nvim-ts-autotag').setup()
|
|
require('nvim-autopairs').setup()
|
|
end,
|
|
})
|
|
|
|
au('UIEnter', {
|
|
group = group,
|
|
once = true,
|
|
callback = function()
|
|
vim.schedule(function()
|
|
require('modules.navigation')
|
|
require('plugins.language-manager').setup()
|
|
require('modules.diagnostics')
|
|
end)
|
|
end,
|
|
})
|