Compare commits

..

1 Commits

Author SHA1 Message Date
15d3879525 Actually run compdb asynchronously
Turns out vim.schedule() only defers calling the function until main
event loop has some free cycles but can still block the UI, just a bit
later. This patch replaces the external command invoked in the callback
passed into vim.schedule() with vim.fn.jobstart() and moves the other
code into job callbacks.
2024-03-14 21:13:28 +00:00
57 changed files with 375 additions and 1321 deletions

2
.gitignore vendored
View File

@@ -1,3 +1 @@
lazy-lock.json
spell/*.spl
lua/local.lua

View File

@@ -1,2 +1 @@
local opts = { buffer = true, remap = false, silent = true }
vim.keymap.set('v', '0', ':PreProcIfWrap<CR>', opts)
require('build').create_commands()

View File

@@ -1,3 +0,0 @@
vim.opt.commentstring = '#%s'
vim.opt.cinkeys = '0{,0},0),0],:,#1,!^F,o,O,e'
vim.opt.indentkeys = ':,!^F,o,O,e,=endif(,=ENDIF(,=endforeach(,=ENDFOREACH(,=endmacro(,=ENDMACRO(,=else(,=ELSE(,=elseif(,=ELSEIF(,=endwhile(,=ENDWHILE('

View File

@@ -1,6 +1,3 @@
vim.opt.commentstring = '//%s'
vim.opt.matchpairs:append('<:>')
vim.bo.commentstring = '//%s'
local opts = { buffer = true, remap = false, silent = true }
-- vim.keymap.set('n', '0', ':PreProcIfWrap<CR>', opts)
vim.keymap.set('v', '0', ':PreProcIfWrap<CR>', opts)
require('build').create_commands()

View File

@@ -1 +0,0 @@
vim.o.signcolumn = 'no'

View File

@@ -1,15 +0,0 @@
vim.opt.spell = true
vim.opt.textwidth = 72
-- Auto-wrap text using textwidth
vim.opt.formatoptions:append('t')
-- When formatting text, recognize numbered lists
vim.opt.formatoptions:append('n')
-- Allow formatting of comments with 'gq'
vim.opt.formatoptions:append('q')
-- Automatically insert the current comment leader after hitting 'o' or 'O' in
-- Normal mode
vim.opt.formatoptions:append('o')
-- A pattern that is used to recognize a list header
vim.opt.formatlistpat = "^\\s*\\d\\+\\.\\s\\+\\|^[-*+]\\s\\+"

View File

@@ -1,5 +0,0 @@
-- Setup tabs
vim.opt.expandtab = false
vim.opt.tabstop = 8
vim.opt.shiftwidth = 8
vim.opt.softtabstop = 8

View File

@@ -1,6 +0,0 @@
vim.opt.expandtab = false
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.wo.listchars = 'extends:»,nbsp:⦸,precedes:«,tab: ,trail:·'
vim.bo.formatprg = 'gofmt'

View File

@@ -1,6 +0,0 @@
vim.opt.expandtab = false
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.wo.listchars = 'extends:»,nbsp:⦸,precedes:«,tab: ,trail:·'
vim.bo.formatprg = 'gofmt'

View File

@@ -1,4 +0,0 @@
vim.opt.spell = false
vim.opt.number = false
vim.opt.relativenumber = false
vim.opt.signcolumn = 'no'

View File

@@ -1,3 +0,0 @@
-- Include % and . in keywords for easier navigation of ID's
vim.opt.iskeyword:append('%')
vim.opt.iskeyword:append('.')

View File

@@ -1 +0,0 @@
vim.opt.tabstop = 8

View File

@@ -1,2 +0,0 @@
vim.opt.showbreak = ''
vim.opt.signcolumn = 'no'

View File

@@ -1 +0,0 @@
vim.opt.commentstring = '//%s'

View File

@@ -1,20 +0,0 @@
-- Use sane tab settings for Python
vim.opt.expandtab = true
vim.opt.tabstop = 8
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.opt.textwidth = 0
-- Auto-wrap comments using textwidth
vim.opt.formatoptions:append('c')
-- Automatically insert the current comment leader after hitting <Enter> in
-- Insert mode
vim.opt.formatoptions:append('r')
-- Automatically insert the current comment leader after hitting 'o' or 'O' in
-- Normal mode.
vim.opt.formatoptions:append('o')
-- Set file encoding and format to sane values for Python
vim.opt.encoding = 'utf-8'
vim.opt.fileformat = 'unix'

View File

@@ -1 +0,0 @@
vim.opt.commentstring = '#%s'

View File

@@ -1 +0,0 @@
vim.opt.expandtab = false

View File

@@ -1,2 +0,0 @@
vim.opt.spell = true
vim.opt.textwidth = 80

View File

@@ -1,2 +0,0 @@
-- Use treesitter for Python indenting since regex indenting is broken
vim.opt.indentexpr = 'nvim_treesitter#indent()'

View File

@@ -1,14 +1,9 @@
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
if vim.g.neovide then
vim.o.guifont = "CaskaydiaCove Nerd Font:h12"
vim.g.neovide_cursor_animation_length = 0
vim.g.neovide_show_border = true -- macOS only
end
-- load config from lua/local.lua if present
pcall(function() require('local') end)
require('settings')
require('mappings')
require('netrw')
require('autocmds')
require('statusline')
require('build')
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
if not vim.loop.fs_stat(lazypath) then

24
lua/autocmds.lua Normal file
View File

@@ -0,0 +1,24 @@
-- Create a group to namespace autocmds
local group = vim.api.nvim_create_augroup('benie', { clear = true })
-- Restore cursor position across sessions
-- https://github.com/neovim/neovim/issues/16339#issuecomment-1457394370
vim.api.nvim_create_autocmd('BufRead', {
group = group,
callback = function(opts)
vim.api.nvim_create_autocmd('BufWinEnter', {
once = true,
buffer = opts.buf,
callback = function()
local ft = vim.bo[opts.buf].filetype
local last_known_line = vim.api.nvim_buf_get_mark(opts.buf, '"')[1]
if not (ft:match('commit') and ft:match('rebase'))
and last_known_line > 1
and last_known_line <= vim.api.nvim_buf_line_count(opts.buf)
then
vim.api.nvim_feedkeys([[g`"]], 'nx', false)
end
end
})
end
})

View File

@@ -19,60 +19,48 @@ function build.set_dir(dirname)
echo('directory does not exist: ' .. build_dir, 'Error')
return
end
if vim.fn.filereadable(build_dir .. '/compile_commands.json') == 0 then
echo('compile_commands.json not found in: ' .. build_dir, 'Error')
return
end
build.dir = build_dir
echo('Processing compile_commands.json with compdb ...', 'DiagnosticInfo')
local compile_commands = current_dir .. '/compile_commands.json'
-- Post-process compile_commands.json with compdb as an async job to avoid
-- blocking the user interface
vim.fn.jobstart(
'compdb -p ' .. build.dir .. ' list > ' .. compile_commands, {
if vim.fn.executable('compdb') == 1 then
echo('Processing compile_commands.json with compdb ...', 'DiagnosticInfo')
-- Post-process compile_commands.json with compdb as an async job to avoid
-- blocking the user interface
vim.fn.jobstart(
'compdb -p ' .. build.dir .. ' list > ' .. compile_commands, {
-- Restart clangd language server
-- TODO: Configure cmake language server?
on_exit = function()
vim.cmd [[ LspRestart clangd ]]
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end,
-- Restart clangd language server
on_exit = function()
-- This is a callback so doesn't run on the main thread which causes
-- issues for running commands, so schedule that on the main thread.
vim.schedule(function()
vim.cmd('LspRestart clangd')
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end)
end,
-- Display any error messages to the user
on_stderr = function(_, output, _)
-- Remove any lines containing a compdb warning
local error = {}
local warning = 'WARNING:compdb'
for _, line in ipairs(output) do
if string.sub(line, 1, #warning) ~= warning then
table.insert(error, line)
end
-- Display any error messages to the user
on_stderr = function(_, output, _)
-- Remove any lines containing a compdb warning
local error = {}
local warning = 'WARNING:compdb'
for _, line in ipairs(output) do
if string.sub(line, 1, #warning) ~= warning then
table.insert(error, line)
end
end
-- Display the error message if there was one
if table.maxn(error) > 0 then
echo(vim.fn.join(error, '\n'), 'Error')
return
end
end,
-- Display the error message if there was one
if table.maxn(error) > 0 then
echo(vim.fn.join(error, '\n'), 'Error')
return
end
end,
stderr_buffered = true,
}
)
else
vim.uv.fs_copyfile(build_dir .. '/compile_commands.json', compile_commands, nil,
function()
-- This is a callback so doesn't run on the main thread which causes
-- issues for running commands, so schedule that on the main thread.
vim.schedule(function()
vim.cmd('LspRestart clangd')
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end)
end
)
end
stderr_buffered = true,
}
)
end
function build.select_dir(callback)
@@ -167,18 +155,22 @@ function build.list_targets()
return targets
end
-- Create :BuildDir command
vim.api.nvim_create_user_command('BuildDir', function(opts)
build.set_dir(opts.fargs[1])
end, {
bang = true, nargs = '?', complete = build.list_dirs,
})
function build.create_commands()
local buffer = vim.api.nvim_get_current_buf()
-- Create :Build command
vim.api.nvim_create_user_command('Build', function(opts)
build.run(opts.fargs)
end, {
bang = true, nargs = '*', complete = build.list_targets,
})
-- Create :BuildDir command
vim.api.nvim_buf_create_user_command(buffer, 'BuildDir', function(opts)
build.set_dir(opts.fargs[1])
end, {
bang = true, nargs = '?', complete = build.list_dirs,
})
-- Create :Build command
vim.api.nvim_buf_create_user_command(buffer, 'Build', function(opts)
build.run(opts.fargs)
end, {
bang = true, nargs = '*', complete = build.list_targets,
})
end
return build

45
lua/mappings.lua Normal file
View File

@@ -0,0 +1,45 @@
vim.g.mapleader = ' '
-- Quick write
vim.keymap.set('n', '<leader>w', ':w!<CR>', {noremap = true})
-- Treat long lines as line containing breaks
vim.keymap.set('n', 'j', 'gj', {noremap = true})
vim.keymap.set('n', 'k', 'gk', {noremap = true})
vim.keymap.set('n', '<leader>tn', ':tabnew<Space>', {noremap = true})
vim.keymap.set('n', '<leader>tc', ':tabclose<CR>', {noremap = true})
vim.keymap.set('n', '<leader>to', ':tabonly<CR>', {noremap = true})
vim.keymap.set('n', '<leader>tm', ':tabmove<Space>', {noremap = true})
-- Quickly access spelling menu
vim.keymap.set('i', '<C-s>', '<C-g>u<C-X>s', {noremap = true})
vim.keymap.set('n', '<C-s>', 'i<C-g>u<C-X>s', {noremap = true})
-- Clear search highlights
vim.keymap.set('n', '<leader><Space>', ':nohlsearch<CR>', {noremap = true})
-- Disable 'Q' from opening Ex mode
vim.keymap.set('n', 'Q', '<nop>', {noremap = true})
-- Yank and put mappings
-- TODO: This doesn't handle all use cases, only the basics. For example,
-- this doesn't handle a local tmux session with a remote nvim in a pane.
-- if tmux#isOption('set-clipboard', 'on') || $SSH_CONNECTION !=# ''
-- " When connected to a remote session the + selection register is not
-- " available and the unnamed register is used instead. Add mappings using the
-- " z register instead.
-- noremap <leader>y "zy
-- noremap <leader>Y "zY
-- " Enable OSC 52 copy on yank.
-- call osc52#autocmd()
-- else
-- System clipboard yank/put
vim.keymap.set('', '<leader>y', '"+y', { noremap = true })
vim.keymap.set('', '<leader>Y', '"+Y', { noremap = true })
vim.keymap.set('', '<leader>p', '"+p', { noremap = true })
vim.keymap.set('', '<leader>P', '"+P', { noremap = true })
-- end
-- Undo neovim's default mapping of Y to y$
vim.cmd('unmap Y')

27
lua/netrw.lua Normal file
View File

@@ -0,0 +1,27 @@
-- Disable banner
vim.g.netrw_banner = 0
-- Fix gx when running inside WSL
if vim.env.WSLENV then
vim.g.netrw_browsex_viewer = 'cmd.exe /C start'
end
-- Map - key to open netrw in current files parent directory
vim.keymap.set('n', '-', function()
-- Get the filename before invoking netrw
local filename = vim.fn.expand('%:t')
-- Invoke netrw on the directory containing the current file
vim.fn.execute(string.format("edit %s", vim.fn.expand('%:hp')))
-- In the netrw buffer, move the cursor to the first character of filename
local buffer = vim.api.nvim_get_current_buf()
local lines = vim.api.nvim_buf_get_lines(buffer, 0, -1, true)
for row, content in ipairs(lines) do
local column = string.find(content, filename)
if column then
vim.api.nvim_win_set_cursor(0, { row, column - 1 })
break
end
end
end)

View File

@@ -1,4 +1,18 @@
local kanagawa = {
return {
-- 'rose-pine/neovim',
-- name = 'rose-pine',
-- config = function()
-- require('rose-pine').setup({
-- styles = {
-- transparency = true,
-- },
-- -- TODO: Ideally only certain groups would have italics disabled
-- disable_italics = true,
-- })
-- vim.cmd('colorscheme rose-pine')
-- end
'rebelot/kanagawa.nvim',
config = function()
local kanagawa = require('kanagawa')
@@ -8,12 +22,6 @@ local kanagawa = {
bg = '#080808',
bg_m3 = '#262626',
bg_gutter = '#121212',
bg_search = '#404000',
bg_visual = '#202020',
float = {
bg = '#080808',
bg_border = '#080808',
}
},
}
@@ -25,24 +33,7 @@ local kanagawa = {
kanagawa.load('dragon')
-- Override highlight groups
vim.cmd.highlight('TabLine', 'guifg=#949494', 'guibg=' .. dragon.ui.bg_m3)
vim.cmd.highlight('TabLineFill', 'guibg=' .. dragon.ui.bg_gutter)
vim.cmd.highlight('TabLineSel', 'guifg=#c8c093', 'guibg=' .. dragon.ui.bg_m3)
vim.cmd.highlight('WinSeparator', 'guifg=' .. dragon.ui.bg_m3, 'guibg=' .. dragon.ui.bg_m3)
vim.cmd.highlight('MsgSeparator', 'guifg=' .. dragon.ui.bg_m3, 'guibg=' .. dragon.ui.bg_m3)
vim.cmd.highlight('TreesitterContext', 'guibg=' .. dragon.ui.bg_gutter)
-- Don't lighlight TODO specially in comments
for _, todo_group in pairs({
'confTodo',
'ps1CommentTodo',
'pythonTodo',
'zshTodo',
}) do
vim.cmd.highlight('link ' .. todo_group .. ' Comment')
end
vim.cmd('highlight WinSeparator guifg=' .. dragon.ui.bg_m3 .. ' guibg=' .. dragon.ui.bg_m3)
vim.cmd('highlight MsgSeparator guifg=' .. dragon.ui.bg_m3 .. ' guibg=' .. dragon.ui.bg_m3)
end
}
return kanagawa

9
lua/plugins/comment.lua Normal file
View File

@@ -0,0 +1,9 @@
return {
'terrortylor/nvim-comment',
config = function()
require('nvim_comment').setup({
-- should comment out empty or whitespace only lines
comment_empty = false,
})
end
}

View File

@@ -1,149 +1,71 @@
return {
'neovim/nvim-lspconfig',
dependencies = {
-- Language server management plugins
-- 'williamboman/mason.nvim',
'kbenzie/mason.nvim',
'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
-- Completion sources plugins
'hrsh7th/cmp-nvim-lsp', -- Source for built-in language server client
'saadparwaiz1/cmp_luasnip', -- Source for LuaSnip snippets
'hrsh7th/cmp-buffer', -- Source for buffer words
'hrsh7th/cmp-path', -- Source for filesystem paths
'petertriho/cmp-git', -- Source for Git/GitHub/GitLab
'hrsh7th/nvim-cmp', -- Completion engine combines and uses the above
-- Lua vim module support in lua language server
{ 'folke/lazydev.nvim', ft = 'lua', opts = {} },
-- Expose clangd extensions
'p00f/clangd_extensions.nvim',
-- Completion plugins
'hrsh7th/cmp-nvim-lsp', -- Source for built-in language server client
'hrsh7th/cmp-buffer', -- Source for buffer words
'hrsh7th/cmp-path', -- Source for filesystem paths
'hrsh7th/cmp-cmdline', -- Source for command-line
'hrsh7th/nvim-cmp', -- Completion engine combines and use the above
-- LSP UI plugins
'aznhe21/actions-preview.nvim',
'j-hui/fidget.nvim',
'nvim-tree/nvim-web-devicons',
'ray-x/lsp_signature.nvim',
-- TODO: https://github.com/b0o/SchemaStore.nvim
-- TODO: https://github.com/jmbuhr/otter.nvim
-- Lue vim module support in lua language server
'folke/neodev.nvim',
-- Snippet pluggins
'L3MON4D3/LuaSnip',
'saadparwaiz1/cmp_luasnip',
-- TODO: https://github.com/j-hui/fidget.nvim
-- TODO: https://github.com/nvimtools/none-ls.nvim
-- TODO: https://github.com/mfussenegger/nvim-dap
-- TODO: https://github.com/rcarriga/nvim-dap-ui
},
config = function()
local capabilities = vim.tbl_deep_extend(
'force', vim.lsp.protocol.make_client_capabilities(),
require('cmp_nvim_lsp').default_capabilities())
local server_opts = {
clangd = {
cmd = { 'clangd', '--completion-style=detailed' },
require('mason').setup()
require('mason-lspconfig').setup({
ensure_installed = {
'clangd',
'cmake',
'jsonls',
'lua_ls',
'lemminx',
'vimls',
'yamlls',
},
automatic_installation = false,
handlers = {
-- Default handler, sets up everything unless a custom language server
-- setup handler is defined below
function(server_name)
require('lspconfig')[server_name].setup({})
end,
lua_ls = {
settings = {
Lua = {
diagnostics = {
disable = { 'missing-fields', },
globals = { 'vim', },
},
workspace = {
library = {
vim.fn.expand('~/.hammerspoon/Spoons'),
vim.fn.expand('~/.hammerspoon/Spoons/EmmyLua.spoon/annotations/'),
['lua_ls'] = function()
require('neodev').setup()
local lspconfig = require('lspconfig')
lspconfig.lua_ls.setup({
settings = {
Lua = {
diagnostics = {
disable = { 'missing-fields', },
globals = { 'vim', },
}
}
}
},
},
},
pyright = {
settings = {
pyright = {
disableOrganizeImports = true,
},
},
},
harper_ls = {
filetypes = {}, -- Disable for all filetypes
},
}
for server, opts in pairs(server_opts) do
-- Broadcast full client capabilities to language servers
opts.capabilities = vim.tbl_deep_extend(
'force', {}, capabilities, opts.capabilities or {})
vim.lsp.config(server, opts)
end
require('mason').setup()
local language_servers = {
'clangd', -- C/C++
'lua_ls', -- Lua
'opencl_ls', -- OpenCL
'harper_ls', -- Spelling & grammar
'marksman', -- Markdown
'tinymist', -- Typst
}
if vim.fn.executable('npm') == 1 then
for _, package in ipairs({
'ansiblels', -- Ansible
'bashls', -- Bash
'docker_compose_language_service', -- Docker Compose
'dockerls', -- Dockerfile
'html', -- HTML
'jsonls', -- JSON
'pyright', -- Python
'vimls', -- VimScript
'yamlls', -- YAML
}) do table.insert(language_servers, package) end
end
if vim.fn.executable('pip') == 1 then
for _, package in ipairs({
'cmake', -- CMake
'esbonio', -- Sphinx
'ruff', -- Python
}) do table.insert(language_servers, package) end
end
if vim.fn.executable('go') == 1 then
table.insert(language_servers, 'gopls') -- Go
end
if vim.fn.has('win32') == 1 then
table.insert(language_servers, 'powershell_es') -- PowerShell
end
require('mason-lspconfig').setup({
ensure_installed = language_servers,
})
-- (Dis|en)able harper-ls when spell mode is (dis|en)enabled.
vim.api.nvim_create_autocmd("OptionSet", {
pattern = "spell",
callback = function()
local bufnr = vim.api.nvim_get_current_buf()
if vim.v.option_new then
vim.lsp.start({
name = "harper_ls",
cmd = { "harper-ls", "--stdio" },
root_dir = vim.fn.getcwd(),
}, { bufnr = bufnr })
else
for _, client in pairs(vim.lsp.get_clients({ bufnr = bufnr })) do
if client.name == "harper_ls" then
vim.lsp.buf_detach_client(bufnr, client.id)
break
end
end
})
end
end,
},
})
local cmp = require('cmp')
@@ -153,73 +75,48 @@ return {
require('luasnip').lsp_expand(args.body)
end
},
mapping = cmp.mapping.preset.insert({
-- Open completion menu/confirm completion
['<C-Space>'] = cmp.mapping.complete(),
['<C-l>'] = cmp.mapping.confirm({ select = true }),
-- Select completion from menu
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
-- Scroll documentation of selected completion item
['<C-d>'] = cmp.mapping.scroll_docs(4),
['<C-u>'] = cmp.mapping.scroll_docs(-4),
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-l>'] = cmp.mapping.confirm({ select = true }),
}),
sources = {
{ name = 'luasnip' },
{ name = 'nvim_lsp' },
{ name = 'buffer' },
-- { name = 'buffer' },
{ name = 'path' },
{ name = 'git' },
-- { name = 'cmdline' },
},
formatting = {
format = function(_, vim_item)
-- Set a limit to how wide the completion menu can be
local winwidth = vim.fn.winwidth(vim.api.nvim_get_current_win())
local menuwidth = math.min(winwidth / 2, 70)
if menuwidth < 70 then
vim_item.menu = ''
vim_item.kind = ''
end
vim_item.abbr = string.sub(vim_item.abbr, 1, menuwidth)
return vim_item
end
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
preselect = 'None', -- Don't preselect completions suggested by source
})
require("cmp_git").setup({})
-- Mappings created when LSP is attached to a buffer
-- Disable displaying diagnostics as virtual text
vim.diagnostic.config({ virtual_text = false })
-- Diagnostic mappings
-- TODO: trouble.nvim mappings instead? https://youtu.be/MuUrCcvE-Yw?t=631
vim.keymap.set('n', '<C-n>', vim.diagnostic.goto_next, { noremap = true })
vim.keymap.set('n', '<C-p>', vim.diagnostic.goto_prev, { noremap = true })
vim.keymap.set('n', '<leader>sd', vim.diagnostic.open_float, { noremap = true })
-- LSP mappings created when attached to a buffer
local augroup = vim.api.nvim_create_augroup('lsp', { clear = true })
vim.api.nvim_create_autocmd('LspAttach', {
pattern = '*',
group = augroup,
callback = function(event)
local opts = { noremap = true, buffer = event.buf }
callback = function(ev)
local opts = { noremap = true, buffer = ev.buf }
-- Fixit mapping, or close enough, actually any code action
vim.keymap.set('n', '<leader>fi',
require('actions-preview').code_actions, opts)
require("actions-preview").code_actions, opts)
-- Goto mappings
local tb = require('telescope.builtin')
vim.keymap.set('n', 'gd', tb.lsp_definitions, opts)
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gi', tb.lsp_implementations, opts)
vim.keymap.set('n', 'go', tb.lsp_type_definitions, opts)
vim.keymap.set('n', 'gr', tb.lsp_references, opts)
vim.keymap.set('n', '<leader>ic', tb.lsp_incoming_calls, opts)
vim.keymap.set('n', '<leader>oc', tb.lsp_outgoing_calls, opts)
vim.keymap.set('n', '<leader>sd', tb.lsp_document_symbols, opts)
vim.keymap.set('n', '<leader>sw', tb.lsp_workspace_symbols, opts)
-- Goto definition mapping
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
-- TODO: nnoremap <silent> <leader>gt <Plug>(coc-type-definition)
-- TODO: nnoremap <silent> <leader>gu <Plug>(coc-references-used)
-- Get references to symbol under cursor, store in quickfix window
vim.keymap.set('n', '<leader>gr', vim.lsp.buf.references, opts)
-- Refactoring mappings
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts)
@@ -227,31 +124,29 @@ return {
-- Format whole buffer mapping
vim.keymap.set('n', '<leader>gq', vim.lsp.buf.format, opts)
-- Switch file using clangd extension
-- TODO: limit this to only filetypes supported by clangd
vim.keymap.set('n', '<leader>sf',
':ClangdSwitchSourceHeader<CR>', { silent = true })
-- Help mappings
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('i', '<C-h>', vim.lsp.buf.signature_help, opts)
end
})
-- LSP UI plugins
require('fidget').setup({})
require('lsp_signature').setup({
floating_window = true,
hint_enable = false,
toggle_key = '<C-h>',
toggle_key_flip_floatwin_setting = true,
select_signature_key = '<C-l>',
})
-- Snippet mappings
local luasnip = require('luasnip')
luasnip.setup({})
vim.keymap.set({ 'i', 's' }, '<C-j>', function()
if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
end
end, { silent = true })
vim.keymap.set({ 'i', 's' }, '<C-K>', function()
if luasnip.jumpable(-1) then
luasnip.jump(-1)
end
end, { silent = true })
-- When harper-ls is installed
local mason_registry = require('mason-registry')
if mason_registry.is_installed('harper-ls') then
-- Disable builtin spell mode highlighting
vim.cmd.highlight('SpellBad', 'NONE')
vim.cmd.highlight('SpellCap', 'NONE')
vim.cmd.highlight('SpellLocal', 'NONE')
vim.cmd.highlight('SpellRare', 'NONE')
end
-- Load snippets
local opts = { paths = vim.fn.stdpath('config') .. '/snippets' }
require('luasnip.loaders.from_snipmate').lazy_load(opts)
require('luasnip.loaders.from_lua').lazy_load(opts)
end
}

View File

@@ -1,64 +0,0 @@
return {
'mfussenegger/nvim-dap',
dependencies = {
'igorlfs/nvim-dap-view',
'kbenzie/mason.nvim',
'jay-babu/mason-nvim-dap.nvim',
'theHamsta/nvim-dap-virtual-text',
'Jorenar/nvim-dap-disasm',
},
config = function()
local dap = require('dap')
-- Installation
local debug_adapters = {
'codelldb', -- C/C++/Rust/Zig
}
if vim.fn.executable('pip') == 1 then
table.insert(debug_adapters, 'python') -- Python
end
if vim.fn.executable('go') == 1 then
table.insert(debug_adapters, 'delve') -- Go
end
require("mason-nvim-dap").setup({
ensure_installed = debug_adapters,
handlers = {},
})
-- UI plugins
require('dap-view').setup({
auto_toggle = true,
})
require('nvim-dap-virtual-text').setup({})
require('dap-disasm').setup({
dapview_register = true,
})
vim.api.nvim_create_autocmd({ "FileType" }, {
pattern = {
'dap-float',
},
callback = function(args)
vim.keymap.set("n", "q", "<C-w>q", { buffer = args.buf })
end,
})
local widgets = require('dap.ui.widgets')
-- Mappings
vim.keymap.set('n', '<leader>D', vim.cmd.DapViewToggle)
vim.keymap.set('n', '<F5>', dap.continue)
vim.keymap.set('n', '<F17>', dap.terminate) -- Shift-F5
vim.keymap.set('n', '<F9>', dap.toggle_breakpoint)
vim.keymap.set('n', '<F21>', vim.cmd.DapViewWatch) -- Shift-F9
vim.keymap.set('n', '<F41>', dap.restart) -- Ctrl-Shift-F5
vim.keymap.set('n', '<F34>', dap.run_to_cursor) -- Ctrl-F10
vim.keymap.set('n', '<F11>', dap.step_into)
vim.keymap.set('n', '<F23>', dap.step_out) -- Shift-F11
vim.keymap.set('n', '<F10>', dap.step_over)
vim.keymap.set('n', '<leader>K', widgets.hover)
end,
}

View File

@@ -1,22 +0,0 @@
return {
{
'folke/trouble.nvim',
dependencies = {
'nvim-tree/nvim-web-devicons',
},
config = function()
require('trouble').setup({})
local opts = { remap = false }
vim.keymap.set('n', '[d', function()
vim.diagnostic.jump({ count = -1, float = true })
end, opts)
vim.keymap.set('n', ']d', function()
vim.diagnostic.jump({ count = 1, float = true })
end, opts)
vim.keymap.set('n', '<leader>ds', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '<leader>dq', function()
require('trouble').toggle('diagnostics')
end, opts)
end
}
}

View File

@@ -1,6 +1,5 @@
return {
{ 'tpope/vim-fugitive', lazy = false },
{ 'tpope/vim-rhubarb', lazy = false },
{
'lewis6991/gitsigns.nvim',
config = function()

View File

@@ -1,6 +0,0 @@
return {
'davidmh/mdx.nvim',
dependencies = {
'nvim-treesitter/nvim-treesitter',
},
}

View File

@@ -1,64 +0,0 @@
return {
'numToStr/Navigator.nvim',
config = function()
local navigator = require('Navigator')
navigator.setup({
disable_on_zoom = true,
})
local augroup = vim.api.nvim_create_augroup('mux', { clear = true })
if vim.env.TMUX ~= nil then
-- Integrate tmux navigation flag
local navigation_flag =
'@vim' .. vim.fn.substitute(vim.env.TMUX_PANE, '%', '\\%', 'g')
local function set_navigation_flag()
vim.fn.system('tmux set-window-option ' .. navigation_flag .. ' 1')
end
local function unset_navigation_flag()
-- FIXME: Due to a regression this causes SIGABRT when RelWithDebInfo
-- vim.fn.system('tmux set-window-option -u ' .. navigation_flag)
-- https://github.com/neovim/neovim/issues/21856 contains a workaround
vim.fn.jobstart(
'tmux set-window-option -u ' .. navigation_flag, { detach = true })
end
-- [Un]set tmux window option to detect when to change pane.
set_navigation_flag()
vim.api.nvim_create_autocmd('FocusGained', {
pattern = '*', group = augroup, callback = set_navigation_flag,
})
vim.api.nvim_create_autocmd('VimLeave', {
pattern = '*', group = augroup, callback = unset_navigation_flag,
})
elseif vim.env.TERM_PROGRAM ~= nil and vim.env.TERM_PROGRAM == 'WezTerm' then
local function set_wezterm_user_var(in_vim)
local value = in_vim and '1' or '0'
local template = "\x1b]1337;SetUserVar=%s=%s\a"
local command = template:format('vim', vim.base64.encode(tostring(value)))
vim.api.nvim_chan_send(vim.v.stderr, command)
end
vim.api.nvim_create_autocmd({ 'VimEnter', 'VimResume' }, {
pattern = '*',
group = augroup,
callback = function()
set_wezterm_user_var(true)
end,
})
vim.api.nvim_create_autocmd({ 'VimLeave', 'VimSuspend' }, {
pattern = '*',
group = augroup,
callback = function()
set_wezterm_user_var(false)
end,
})
end
-- Map nativation bindings
vim.keymap.set('n', "<C-h>", navigator.left)
vim.keymap.set('n', "<C-j>", navigator.down)
vim.keymap.set('n', "<C-k>", navigator.up)
vim.keymap.set('n', "<C-l>", navigator.right)
end
}

View File

@@ -1,29 +0,0 @@
return {
'stevearc/oil.nvim',
dependencies = {
"nvim-tree/nvim-web-devicons",
},
lazy = false,
config = function()
require('oil').setup({
keymaps = {
["g?"] = { "actions.show_help", mode = "n" },
["<CR>"] = "actions.select",
["<leader>l"] = "actions.refresh",
["-"] = { "actions.parent", mode = "n" },
["_"] = { "actions.open_cwd", mode = "n" },
["`"] = { "actions.cd", mode = "n" },
["~"] = { "actions.cd", opts = { scope = "tab" }, mode = "n" },
["gs"] = { "actions.change_sort", mode = "n" },
["gx"] = "actions.open_external",
["g."] = { "actions.toggle_hidden", mode = "n" },
["g\\"] = { "actions.toggle_trash", mode = "n" },
},
use_default_keymaps = false,
})
vim.keymap.set("n", "-", function()
local dir = vim.fn.expand("%:h")
vim.cmd.Oil(dir ~= "" and dir or ".")
end, {})
end
}

View File

@@ -1,36 +0,0 @@
return {
-- TODO: v0.10.0 might have builtins snippets?
'L3MON4D3/LuaSnip',
build = 'make install_jsregexp',
config = function()
local luasnip = require('luasnip')
luasnip.setup({})
-- Load snippets
local opts = { paths = vim.fn.stdpath('config') .. '/snippets' }
require('luasnip.loaders.from_snipmate').lazy_load(opts)
require('luasnip.loaders.from_lua').lazy_load(opts)
-- Snippet keybindings
vim.keymap.set({ 'i', 's' }, '<C-j>', function()
if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
end
end, { silent = true })
vim.keymap.set({ 'i', 's' }, '<C-k>', function()
if luasnip.jumpable(-1) then
luasnip.jump(-1)
end
end, { silent = true })
vim.keymap.set({ "i", "s" }, "<C-n>", function()
if luasnip.choice_active() then
luasnip.change_choice(1)
end
end, { silent = true })
vim.keymap.set({ "i", "s" }, "<C-p>", function()
if luasnip.choice_active() then
luasnip.change_choice(-1)
end
end, { silent = true })
end
}

View File

@@ -1,6 +0,0 @@
return {
'Kicamon/markdown-table-mode.nvim',
config = function()
require('markdown-table-mode').setup()
end
}

View File

@@ -3,10 +3,8 @@ return {
dependencies = {
'nvim-lua/plenary.nvim',
'nvim-telescope/telescope-fzy-native.nvim',
'nvim-telescope/telescope-live-grep-args.nvim',
'nvim-tree/nvim-web-devicons',
'axkirillov/easypick.nvim',
'benfowler/telescope-luasnip.nvim',
},
config = function()
local telescope = require('telescope')
@@ -17,13 +15,11 @@ return {
['<C-s>'] = 'select_horizontal',
['<C-h>'] = 'preview_scrolling_left',
['<C-l>'] = 'preview_scrolling_right',
['<C-q>'] = require("trouble.sources.telescope").open,
},
n = {
['<C-s>'] = 'select_horizontal',
['<C-h>'] = 'preview_scrolling_left',
['<C-l>'] = 'preview_scrolling_right',
['<C-q>'] = require("trouble.sources.telescope").open,
}
},
layout_config = {
@@ -32,19 +28,16 @@ return {
},
})
telescope.load_extension('fzy_native')
telescope.load_extension('live_grep_args')
telescope.load_extension('luasnip')
local builtin = require('telescope.builtin')
-- TODO: Add more mappings?
local opts = { noremap = true }
vim.keymap.set('n', '<leader>gF', builtin.find_files, opts)
vim.keymap.set('n', '<leader>gf', builtin.git_files, opts)
vim.keymap.set('n', '<leader>gg', builtin.live_grep, opts)
vim.keymap.set('n', '<leader>gG', telescope.extensions.live_grep_args.live_grep_args, opts)
vim.keymap.set('n', '<leader>gb', builtin.buffers, opts)
vim.keymap.set('n', '<leader>gh', builtin.help_tags, opts)
vim.keymap.set('n', '<leader>gl', builtin.current_buffer_fuzzy_find, opts)
vim.keymap.set('n', '<leader>gc', builtin.commands, opts)
vim.keymap.set('n', '<leader>gF', ':Telescope find_files<CR>', opts)
vim.keymap.set('n', '<leader>gf', ':Telescope git_files<CR>', opts)
vim.keymap.set('n', '<leader>gg', ':Telescope live_grep<CR>', opts)
vim.keymap.set('n', '<leader>gb', ':Telescope buffers<CR>', opts)
vim.keymap.set('n', '<leader>gh', ':Telescope help_tags<CR>', opts)
vim.keymap.set('n', '<leader>gs', ':Telescope lsp_document_symbols<CR>', opts)
vim.keymap.set('n', '<leader>gr', ':Telescope lsp_references<CR>', opts)
require('easypick').setup({
pickers = { },

39
lua/plugins/tmux.lua Normal file
View File

@@ -0,0 +1,39 @@
return {
'alexghergh/nvim-tmux-navigation',
config = function()
local plugin = require('nvim-tmux-navigation')
plugin.setup({
disable_when_zoomed = true,
})
-- Integrate tmux navigation flag
local navigation_flag =
'@vim' .. vim.fn.substitute(vim.env.TMUX_PANE, '%', '\\%', 'g')
local function set_navigation_flag()
vim.fn.system('tmux set-window-option ' .. navigation_flag .. ' 1')
end
local function unset_navigation_flag()
-- FIXME: Due to a regression this causes SIGABRT when RelWithDebInfo
-- vim.fn.system('tmux set-window-option -u ' .. navigation_flag)
-- https://github.com/neovim/neovim/issues/21856 contains a workaround
vim.fn.jobstart(
'tmux set-window-option -u ' .. navigation_flag, { detach = true})
end
-- [Un]set tmux window option to detect when to change pane.
set_navigation_flag()
local augroup = vim.api.nvim_create_augroup('tmux', { clear = true })
vim.api.nvim_create_autocmd('FocusGained', {
pattern = '*', group = augroup, callback = set_navigation_flag,
})
vim.api.nvim_create_autocmd('VimLeave', {
pattern = '*', group = augroup, callback = unset_navigation_flag,
})
-- Map nativation bindings
vim.keymap.set('n', "<C-h>", plugin.NvimTmuxNavigateLeft)
vim.keymap.set('n', "<C-j>", plugin.NvimTmuxNavigateDown)
vim.keymap.set('n', "<C-k>", plugin.NvimTmuxNavigateUp)
vim.keymap.set('n', "<C-l>", plugin.NvimTmuxNavigateRight)
end
}

View File

@@ -1,11 +1,8 @@
return {
'nvim-treesitter/nvim-treesitter',
branch = 'master',
dependencies = {
'nvim-treesitter/nvim-treesitter-textobjects',
{ 'nvim-treesitter/nvim-treesitter-context', opts = {} },
-- TODO: Fork this and add CMake support
-- TODO: Add shell support (sh/bash/zsh if/for/while/etc)
'RRethy/nvim-treesitter-endwise',
},
build = ':TSUpdate',
@@ -14,7 +11,7 @@ return {
require('nvim-treesitter.configs').setup({
sync_install = false,
highlight = { enable = true },
indent = { enable = false },
indent = { enable = true },
-- List of languages that must be available
ensure_installed = {
@@ -48,8 +45,6 @@ return {
'llvm',
'lua',
'make',
'markdown',
'markdown_inline',
'meson',
'ninja',
'objc',
@@ -63,7 +58,6 @@ return {
'rst',
'ssh_config',
'strace',
'tablegen',
'tmux',
'toml',
'vim',
@@ -82,9 +76,6 @@ return {
lookahead = true,
-- include_surrounding_whitespace = true,
keymaps = {
-- Class text objects
['ac'] = '@class.outer',
['ic'] = '@class.inner',
-- Function text objects
['af'] = '@function.outer',
['if'] = '@function.inner',

View File

@@ -0,0 +1,6 @@
return {
'tummetott/unimpaired.nvim',
config = function()
require('unimpaired').setup({})
end
}

View File

@@ -1,40 +0,0 @@
local noice = {
'folke/noice.nvim',
dependencies = {
'MunifTanjim/nui.nvim',
},
config = function()
require('noice').setup({
cmdline = {
enable = true,
format = {
cmdline = { icon = ':', title = '' },
search_down = { icon = '/', title = '' },
search_up = { icon = '?', title = '' },
}
},
messages = { enable = false },
popmenu = { enable = false },
notify = { enable = false },
lsp = {
progress = { enable = false },
hover = { enable = false },
signature = { enable = false },
message = { enable = false },
},
signature = { enabled = false },
})
-- Override highlight groups
vim.cmd.highlight('NoiceCmdlinePopupBorder', 'guibg=#080808')
vim.cmd.highlight('link', 'NoiceCmdlinePopupBorder', 'NoiceCmdlinePopupBorderSearch')
end
}
return {
-- noice,
{ 'echasnovski/mini.comment', opts = { options = { ignore_blank_line = true } } },
{ 'tpope/vim-unimpaired', lazy = false },
{ 'stevearc/dressing.nvim' },
{ 'kevinhwang91/nvim-bqf' },
}

View File

@@ -3,12 +3,6 @@ vim.g.loaded_node_provider = 0
vim.g.loaded_perl_provider = 0
vim.g.loaded_ruby_provider = 0
if vim.env.TMUX ~= nil and vim.env.WAYLAND_DISPLAY ~= nil then
-- Use tmux instead of wl-clipboard on Wayland to avoid annoying notification
-- popups when copying/pasting from the system clipboard.
vim.g.clipboard = "tmux"
end
-- Keep cursor from buffer edges
vim.opt.sidescrolloff = 5
@@ -46,9 +40,6 @@ vim.opt.completeopt = 'menu'
-- Set window title to titlestring
vim.opt.title = true
-- Use rounded borders for floating windows
vim.o.winborder = 'rounded'
-- Don't show mode in command line
vim.opt.showmode = false
@@ -78,7 +69,7 @@ vim.opt.splitbelow = true
vim.opt.splitright = true
-- Use existing windows and tabs when jumping to errors
vim.opt.switchbuf = 'usetab,uselast'
vim.opt.switchbuf = 'usetab'
-- Automatically write changes to files
vim.opt.autowrite = true
@@ -86,13 +77,6 @@ vim.opt.autowrite = true
-- Don't add 2 spaces after end of sentence
vim.opt.joinspaces = false
-- Set fold level to something high
vim.opt.foldlevel = 20
vim.opt.foldmethod = 'expr'
vim.opt.foldexpr = 'nvim_treesitter#foldexpr()'
vim.opt.foldtext = ''
vim.opt.fillchars = 'fold: '
-- Enable all mouse features
vim.opt.mouse = 'a'
@@ -121,24 +105,3 @@ vim.opt.smartindent = true
-- (0,W4 - indent inside unclosed parenthesis
-- i2 - indent C++ class base declarations and constructor initializers
vim.opt.cinoptions = 'N-sE-sg1h1l1(0,W4i2'
-- Avoid prompts and short/remove messages
-- f use "(3 of 5)" instead of "(file 3 of 5)"
-- i use "[noeol]" instead of "[Incomplete last line]"
-- l use "999L, 888B" instead of "999 lines, 888 bytes"
-- n use "[New]" instead of "[New File]"
-- x use "[dos]" instead of "[dos format]", "[unix]" instead of
-- "[unix format]" and "[mac]" instead of "[mac format]"
-- o overwrite message for writing a file with subsequent message for reading
-- a file (useful for ":wn" or when 'autowrite' on)
-- O message for reading a file overwrites any previous message; also for
-- quickfix message (e.g., ":cn")
-- t truncate file message at the start if it is too long to fit on the
-- command-line, "<" will appear in the left most column; ignored in
-- Ex mode
-- T truncate other messages in the middle if they are too long to fit on
-- the command line; "..." will appear in the middle; ignored in Ex mode
-- I don't give the intro message when starting Vim, see :intro
-- F don't give the file info when editing a file, like `:silent` was used
-- for the command
vim.opt.shortmess = 'filnxoOtTIF'

View File

@@ -27,11 +27,12 @@ modes[116] = { name = 'Terminal', color = 'light_blue' }
modes[33] = { name = 'Shell', color = 'light_grey' }
local function highlight(group, color, attrs)
local args = { group, 'guifg=' .. color.fg, 'guibg=' .. color.bg }
local command = 'highlight ' .. group ..
' guifg=' .. color.fg .. ' guibg=' .. color.bg
if attrs then
table.insert(args, 'gui=' .. attrs)
command = command .. ' gui=' .. attrs
end
vim.cmd.highlight(args)
vim.cmd(command)
end
-- StatusLineLight is shows the mode and cursor information, it is dynamically
@@ -59,9 +60,6 @@ local function get_mode()
return current_mode.name
end
-- Display cusor line/total and column
local position = '# %l/%L:%2c '
-- Construct a statusline for special buffer types.
local function special(group, name, title)
-- Display current mode with dynamic highlights.
@@ -69,13 +67,13 @@ local function special(group, name, title)
-- Display filename with dark highlights.
line = line .. '%#StatusLineDark# ' .. title
-- Display current/total lines and column with dynamic highlights.
line = line .. '%=' .. '%#' .. group .. position
line = line .. '%=' .. '%#' .. group .. '# ☰%l/%L ·%2c '
-- Combine the elements into a single string to be evaluated.
return line
end
-- Construct a statusline for generic buffer types.
local function generic(group, name)
local function generic(group, name, show_lsp)
-- Display current mode with dynamic highlights.
local line = '%#' .. group .. '# ' .. name .. ' '
-- Display spell or paste if set with dusk highlights in a group to swallow
@@ -94,6 +92,10 @@ local function generic(group, name)
.. '%#StatusLineDark#'
.. '%{&readonly ? " 🔒" : ""}'
.. '%{&modifiable ? "" : " ⛔"}'
-- FIXME: if show_lsp and vim.fn.exists('*coc#status') then
-- -- Display LSP status.
-- line = line .. '%#StatusLineDuskFade#%( %{coc#status()}%)'
-- end
-- Display filetype if set.
line = line .. '%=' .. '%#StatusLineDark# %{&filetype} '
-- Display fileencoding if not utf-8 and fileformat if not unix with dusk
@@ -102,14 +104,14 @@ local function generic(group, name)
'%{&fileencoding ==# "utf-8" ? "" : &fileencoding}' ..
'%{&fileformat ==# "unix" ? "" : "[".&fileformat."]"}' .. ' %)'
-- Display current/total lines and column with dynamic highlights.
line = line .. '%#' .. group .. position
line = line .. '%#' .. group .. '# ☰ %l/%L 󰠷 %2c '
-- Combine the elements into a single string to be evaluated.
return line
end
-- Define active statusline, this statusline is dynamic with StatusLineLight
-- being updated based on the current mode and only used for current buffer.
function _G.statusline_active()
function statusline.active()
local mode = get_mode()
if vim.o.buftype == 'help' then
if mode == 'Normal' then mode = 'Help' end
@@ -119,11 +121,7 @@ function _G.statusline_active()
-- loclist flag, query the window info.
local info = vim.fn.getwininfo(vim.fn.win_getid())[1]
if mode == 'Normal' then
if info.loclist == 1 then
mode = 'Location'
else
mode = 'Quickfix'
end
if info.loclist then mode = 'Location' else mode = 'Quickfix' end
end
local title = info.variables.quickfix_title
return special('StatusLineLight', mode, title)
@@ -131,14 +129,14 @@ function _G.statusline_active()
return special('StatusLineLight', 'Terminal', '%f')
elseif vim.o.previewwindow then
if mode == 'Normal' then mode = 'Preview' end
return generic('StatusLineLight', mode)
return generic('StatusLineLight', mode, false)
elseif vim.o.filetype == 'man' then
return special('StatusLineDusk', 'Manual', '%f')
end
return generic('StatusLineLight', mode)
return generic('StatusLineLight', mode, true)
end
function _G.statusline_inactive()
function statusline.inactive()
local mode = modes[vim.fn.char2nr(vim.fn.mode())].name
local line = ''
if vim.o.buftype == 'help' then
@@ -152,12 +150,14 @@ function _G.statusline_inactive()
elseif vim.o.buftype == 'terminal' then
line = special('StatusLineDusk', 'Terminal', '%f')
elseif vim.o.previewwindow then
line = generic('StatusLineDusk', 'Preview')
line = generic('StatusLineDusk', 'Preview', false)
elseif vim.o.filetype == 'man' then
line = special('StatusLineDusk', 'Manual', '%f')
else
line = generic('StatusLineDusk', 'Idle')
line = generic('StatusLineDusk', 'Idle', false)
end
-- Escape spaces and double quotes for use in setlocal.
-- FIXME: let l:statusline = substitute(l:statusline, '\([ "]\)', '\\\0', 'g')
return line
end
@@ -169,7 +169,7 @@ vim.api.nvim_create_autocmd({ 'BufEnter', 'WinEnter', 'BufWinEnter' }, {
pattern = '*',
group = group,
callback = function()
vim.cmd.setlocal("statusline=%{%v:lua.statusline_active()%}")
vim.cmd [[ setlocal statusline=%{%v:lua.require('statusline').active()%} ]]
end
})
@@ -178,7 +178,7 @@ vim.api.nvim_create_autocmd({ 'BufLeave', 'WinLeave' }, {
pattern = '*',
group = group,
callback = function()
vim.cmd.setlocal("statusline=%{%v:lua.statusline_inactive()%}")
vim.cmd [[ setlocal statusline=%{%v:lua.require('statusline').inactive()%} ]]
end
})

View File

@@ -1,54 +0,0 @@
-- Create a group to namespace autocmds
local group = vim.api.nvim_create_augroup('benie', { clear = true })
-- Restore cursor position across sessions
-- https://github.com/neovim/neovim/issues/16339#issuecomment-1457394370
vim.api.nvim_create_autocmd('BufRead', {
group = group,
callback = function(opts)
vim.api.nvim_create_autocmd('BufWinEnter', {
once = true,
buffer = opts.buf,
callback = function()
local ft = vim.bo[opts.buf].filetype
local last_known_line = vim.api.nvim_buf_get_mark(opts.buf, '"')[1]
if not (ft:match('commit') and ft:match('rebase'))
and last_known_line > 1
and last_known_line <= vim.api.nvim_buf_line_count(opts.buf)
then
vim.api.nvim_feedkeys([[g`"]], 'nx', false)
end
end
})
end
})
-- Start terminals in insert mode
vim.api.nvim_create_autocmd('TermOpen', {
group = group,
pattern = 'term://*',
callback = function(args)
-- nvim-dap/nvim-dap-view uses terminal buffers in the background which are
-- not visible, don't start insert mode if the dap-type variable exists.
local success, dap_type = pcall(vim.api.nvim_buf_get_var, args.buf, 'dap-type')
if success and dap_type then
return
end
vim.cmd.startinsert()
end,
})
-- Automatically press enter when the terminal process exit successfully
vim.api.nvim_create_autocmd('TermClose', {
group = group,
pattern = 'term://*',
callback = function()
if vim.v.event.status == 0 then
-- Exit success, send enter to close the buffer
vim.api.nvim_input('<CR>')
else
-- Exit failure, enter normal mode for inspection
vim.api.nvim_input('<C-\\><C-n>')
end
end
})

View File

@@ -1,239 +0,0 @@
-- :RStrip strip white space from right of all lines, ranges supported
vim.api.nvim_create_user_command('RStrip', function(opts)
local pos = vim.fn.getcurpos(vim.api.nvim_get_current_win())
local range = opts.line1 .. ',' .. opts.line2
vim.cmd.execute("'" .. range .. 's/\\s\\+$//e' .. "'")
vim.cmd.nohlsearch()
vim.fn.setpos('.', pos)
end, { range = '%' })
-- :LStrip strip white space from left of all lines, ranges supported
vim.api.nvim_create_user_command('LStrip', function(opts)
local pos = vim.fn.getcurpos(vim.api.nvim_get_current_win())
local range = opts.line1 .. ',' .. opts.line2
vim.cmd.execute("'" .. range .. 's/^\\s\\+//e' .. "'")
vim.cmd.nohlsearch()
vim.fn.setpos('.', pos)
end, { range = '%' })
-- :TabWidth set the tab width for the current buffer
vim.api.nvim_create_user_command('TabWidth', function(opts)
-- Set the tab width for the current filetype
local width = tonumber(opts.args)
vim.opt.tabstop = width
vim.opt.shiftwidth = width
vim.opt.softtabstop = width
end, { nargs = 1 })
-- :Remove the file associated with the current buffer, bang to delete buffer
vim.api.nvim_create_user_command('Remove', function(opts)
local path = vim.fn.expand('%:p')
-- Using opts.bang in the callback can cause a SEGFAULT, instead use it
-- before invoking the async unlink to select which callback should be called
-- on completion.
local callback = nil
if opts.bang then
-- Invoked as :Remove! so also delete the buffer.
callback = function(err, success)
if success then
vim.schedule(function()
vim.api.nvim_buf_delete(vim.api.nvim_get_current_buf(), {})
end)
else
error(err)
end
end
else
-- Invoked as :Remove so don't delete the buffer.
callback = function(err, success)
if not success then
error(err)
end
end
end
-- Actually remove the file using the selected callback.
vim.loop.fs_unlink(path, callback)
end, { bang = true })
-- :Move the file associated with the current buffer
vim.api.nvim_create_user_command('Move', function(opts)
local source = vim.fn.expand('%:p')
local dest = opts.args
if vim.fn.isdirectory(dest) ~= 0 then
dest = vim.fn.resolve(dest .. '/' .. vim.fn.expand('%:t'))
end
vim.loop.fs_rename(source, dest, function(err, success)
if success then
vim.schedule(function()
vim.cmd.edit(dest)
end)
else
error(err)
end
end)
end, {
nargs = 1,
complete = 'file',
})
-- :Rename the file associated with current buffer
vim.api.nvim_create_user_command('Rename', function(opts)
local source = vim.fn.expand('%')
local dest = nil
local dir = vim.fn.expand('%:h')
if dir == '.' then
dest = opts.args
else
dest = vim.fn.resolve(dir .. '/' .. opts.args)
end
local buffer = vim.api.nvim_get_current_buf()
vim.loop.fs_rename(source, dest, function(err, success)
if not success then
error(err)
else
vim.schedule(function()
vim.cmd.edit(dest)
vim.api.nvim_buf_delete(buffer, {})
end)
end
end)
end, {
nargs = 1,
complete = function()
return { vim.fn.expand('%:t') }
end
})
-- :Chmod change file mode bits
if vim.fn.executable('chmod') == 1 then
vim.api.nvim_create_user_command('Chmod', function(opts)
local file = vim.fn.expand('%:p')
vim.fn.system('chmod ' .. opts.args .. ' ' .. file)
end, { nargs = '+' })
end
-- :Mkdir create a directory, bang to create intermediate directories
vim.api.nvim_create_user_command('Mkdir', function(opts)
local flags = nil
if opts.bang then
flags = 'p'
end
vim.fn.mkdir(opts.args, flags)
end, {
bang = true,
nargs = 1,
complete = 'file',
})
-- :Rg grep for the given string, word under the cursor, or visual selection
-- then fuzzy find the results. Bang to enable regex in given string.
vim.api.nvim_create_user_command('Rg', function(opts)
local search = opts.args
if opts.range == 2 then
local lines = vim.fn.getline(vim.fn.line("'<"), vim.fn.line("'>"))
local start_col = vim.fn.col("'<")
local end_col = vim.fn.col("'>")
if #lines == 1 then
lines[1] = string.sub(lines[1], start_col, end_col)
else
lines[1] = string.sub(lines[1], start_col)
lines[#lines] = string.sub(lines[#lines], 1, end_col)
end
search = table.concat(lines, "\n")
elseif #search == 0 then
search = vim.fn.expand('<cword>')
end
local grep_opts = { search = search }
if opts.bang then
grep_opts['use_regex'] = true
end
require('telescope.builtin').grep_string(grep_opts)
end, { bang = true, range = true, nargs = '*' })
-- :PreProcIfWrap wraps the given range of lines in #if 0 / #endif.
vim.api.nvim_create_user_command('PreProcIfWrap', function(opts)
local buffer = vim.api.nvim_get_current_buf()
vim.api.nvim_buf_set_lines(
buffer, opts.line2, opts.line2, true, { '#endif' })
vim.api.nvim_buf_set_lines(
buffer, opts.line1 - 1, opts.line1 - 1, true, { '#if 0' })
local window = vim.api.nvim_get_current_win()
vim.api.nvim_win_set_cursor(window, { opts.line1, 5 })
end, { range = true })
-- :CheckboxToggle toggles GitHub Flavoured Markdown style checkboxes.
vim.api.nvim_create_user_command('CheckboxToggle', function(opts)
local linenr = vim.fn.line('.')
local line = vim.fn.getline(linenr)
local pos = string.find(line, '[ ]', 0, true)
if pos == nil then
pos = string.find(line, '[x]', 0, true)
if pos == nil then
return
end
end
local x = string.sub(line, pos + 1, pos + 1)
if x == 'x' then x = ' ' else x = 'x' end
vim.fn.setline(linenr, string.sub(line, 1, pos) .. x .. string.sub(line, pos + 2))
end, {})
-- :Tac reverse the order of lines in the selected range or the whole file if
-- no range is specificed, works as if executing :!tac but purely in Lua making
-- it cross-platform.
vim.api.nvim_create_user_command('Tac', function(opts)
local buffer = vim.api.nvim_get_current_buf()
local line1 = opts.line1 - 1
local line2 = opts.line2
if opts.range == 0 then
line1 = 0
line2 = -1
end
print(opts.range, line1, line2)
local lines = vim.api.nvim_buf_get_lines(buffer, line1, line2, false)
if lines and #lines > 1 then
local temp = nil
for n = 1, math.floor(#lines / 2) do
temp = lines[n]
lines[n] = lines[#lines - (n - 1)]
lines[#lines - (n - 1)] = temp
end
vim.api.nvim_buf_set_lines(buffer, line1, line2, true, lines)
end
end, { range = true })
-- :DiagnosticToggle to disable diagnostics when enabled and vise versa.
vim.api.nvim_create_user_command('DiagnosticToggle', function(_)
vim.diagnostic.enable(not vim.diagnostic.is_enabled())
end, {})
-- -- :QuickFiles creates a floating window for the user to input a list of files
-- -- then populates and opens the quickfix list.
-- vim.api.nvim_create_user_command('QuickFiles', function()
-- -- Create scratch buffer & set options
-- local buffer = vim.api.nvim_create_buf(false, true)
-- vim.bo[buffer].errorformat = "%f"
-- -- Calculate floating window dimensions
-- local ui = vim.api.nvim_list_uis()[1]
-- local width = math.floor(ui.width * 0.6)
-- local height = math.floor(ui.height * 0.4)
-- -- Create the floating window
-- local window = vim.api.nvim_open_win(buffer, true, {
-- relative = 'editor',
-- width = width,
-- height = height,
-- row = math.floor((ui.height - height) / 2),
-- col = math.floor((ui.width - width) / 2),
-- style = 'minimal',
-- border = 'rounded',
-- title = 'QuickFiles',
-- title_pos = "center",
-- })
-- vim.keymap.set('n', 'q', function()
-- vim.cmd.cbuffer()
-- vim.api.nvim_win_close(window, true)
-- vim.cmd.cwindow()
-- end, { buffer = buffer, nowait = true, silent = true })
-- end, {})

View File

@@ -1,19 +0,0 @@
vim.filetype.add({
extension = {
cl = 'opencl',
def = 'cpp',
ll = 'llvm',
md = 'markdown',
ronn = 'markdown',
td = 'tablegen',
test = 'llvm',
},
filename = {
['.enter'] = 'zsh',
['.exit'] = 'zsh',
['CMakeCache.txt'] = 'cmakecache',
['lit.cfg'] = 'python',
['lit.local.cfg'] = 'python',
['requirements.txt'] = 'requirements',
},
})

View File

@@ -1,52 +0,0 @@
local opts = { remap = false, silent = true }
-- Quick write
vim.keymap.set('n', '<leader>w', ':w!<CR>', opts)
-- Treat long lines as line containing breaks
vim.keymap.set('n', 'j', 'gj', opts)
vim.keymap.set('n', 'k', 'gk', opts)
vim.keymap.set('n', '<leader>tn', ':tabnew<Space>', { remap = false })
vim.keymap.set('n', '<leader>tm', ':tabmove<Space>', { remap = false })
vim.keymap.set('n', '<leader>tc', ':tabclose<CR>', opts)
vim.keymap.set('n', '<leader>to', ':tabonly<CR>', opts)
-- Quickly access spelling menu
vim.keymap.set('i', '<C-s>', '<C-g>u<C-X>s', opts)
vim.keymap.set('n', '<C-s>', 'i<C-g>u<C-X>s', opts)
-- Clear search highlights
vim.keymap.set('n', '<leader><Space>', ':nohlsearch<CR>', opts)
-- Disable 'Q' from opening Ex mode
vim.keymap.set('n', 'Q', '<nop>', opts)
-- System clipboard yank/put
vim.keymap.set('', '<leader>y', '"+y', opts)
vim.keymap.set('', '<leader>Y', '"+Y', opts)
vim.keymap.set('', '<leader>p', '"+p', opts)
vim.keymap.set('', '<leader>P', '"+P', opts)
-- Undo neovim's default mapping of Y to y$
vim.cmd.unmap('Y')
-- Make nvim :terminal more like vim :terminal
vim.keymap.set('t', '<C-w>N', '<C-\\><C-n>', opts)
-- Mappings to make navigating :Termdebug
vim.keymap.set('n', '<C-w><C-g>', ':Gdb<CR>:startinsert<CR>', opts)
vim.keymap.set('n', '<C-w><C-e>', ':Program<CR>', opts)
vim.keymap.set('n', '<C-w><C-s>', ':Source<CR>', opts)
vim.keymap.set('n', '<C-w><C-a>', ':Asm<CR>', opts)
vim.keymap.set('t', '<C-w><C-g>', '<C-\\><C-n>:Gdb<CR>:startinsert<CR>', opts)
vim.keymap.set('t', '<C-w><C-e>', '<C-\\><C-n>:Program<CR>', opts)
vim.keymap.set('t', '<C-w><C-s>', '<C-\\><C-n>:Source<CR>', opts)
vim.keymap.set('t', '<C-w><C-a>', '<C-\\><C-n>:Asm<CR>', opts)
-- Mappings to grep for then fuzzy find the word under the cursor or visual selection
vim.keymap.set('n', '<leader>rg', ':Rg<CR>', opts)
vim.keymap.set('v', '<leader>rg', ":'<,'>Rg<CR>", opts)
-- Mapping to toggle checkboxes
vim.keymap.set('n', '<leader><CR>', ':CheckboxToggle<CR>', opts)

View File

@@ -1,22 +0,0 @@
-- Customise LSP UI
vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(
vim.lsp.handlers.hover, {
border = 'rounded',
title = 'Hover',
}
)
vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(
vim.lsp.handlers.signature_help, {
border = 'rounded',
title = 'Signature Help',
}
)
-- Customise diagnostic UI
vim.diagnostic.config({
float = {
border = 'rounded',
title = 'Diagnostics',
},
virtual_text = false,
})

View File

@@ -6,7 +6,7 @@ local snip = luasnip.snippet
local text = luasnip.text_node
-- local isn = luasnip.indent_snippet_node
-- local t = luasnip.text_node
local ins = luasnip.insert_node
local insert = luasnip.insert_node
local func = luasnip.function_node
-- local c = luasnip.choice_node
-- local d = luasnip.dynamic_node
@@ -67,7 +67,7 @@ for _, name in ipairs({ 'fixme', 'todo', 'hack', 'warn', 'note' }) do
snip(name, {
func(comment_prefix),
text(string.upper(name) .. ': '),
ins(0),
insert(0),
func(comment_suffix),
})
)

View File

@@ -1,19 +1,7 @@
# Global SnipMate snippets
snippet joy
(◦U ◡ U◦)
snippet shrug
¯\_(ツ)_/¯
snippet confuse
(ノ*・_・)ノ
snippet tableflip
(╯°▪°)╯︵┻━┻
snippet cry
(ㅠ﹏ㅠ)
snippet think
(╭ರ_•́)

View File

@@ -1,60 +1,25 @@
-- C LuaSnip Snippets
# C LuaSnip Snippets
local luasnip = require('luasnip')
local snippet = luasnip.snippet
local snip = luasnip.snippet
local text = luasnip.text_node
local insert = luasnip.insert_node
local func = luasnip.function_node
local choice = luasnip.choice_node
local dynamic = luasnip.dynamic_node
local restore = luasnip.restore_node
local snip = luasnip.snippet_node
local key = require("luasnip.nodes.key_indexer").new_key
local function getIncludeGuardName()
local filename = vim.fn.expand('%'):gsub('[^%w_]', '_'):upper()
return filename .. '_INCLUDED'
end
local snippets = {
snippet('#include', {
snip('#include', {
text('#include '),
choice(1, {
snip(nil, { text('<'), restore(1, 'header'), text('>') }),
snip(nil, { text('"'), restore(1, 'header'), text('"') }),
}),
}, { stored = { ['header'] = insert(1, 'header') } }),
snippet('once', {
text('#ifndef '),
func(function(opts)
return opts[1][1]
end, key('guard')),
text({ '', '#define ' }),
dynamic(1, function()
return snip(nil, {
insert(1, getIncludeGuardName(), { key = 'guard' }),
})
end),
text({ '', '', '', }),
insert(0, ''),
text({ '', '', '#endif // ' }),
func(function(opts)
return opts[1][1]
end, key('guard')),
}, {}),
-- Doxygen
snippet('p', {
text('@param'),
choice(1, { text('[in]'), text('[out]'), text('[in,out]'), text('') }),
text(' '),
insert(2, 'name'),
text(' '),
insert(0, 'desc'),
insert(1, '<', { key = 'open' }),
insert(2, 'header'),
func(function(args)
if args[1][1] == '<' then
return '>'
else
return '"'
end
end, key('open')),
}),
}
return snippets

View File

@@ -4,13 +4,3 @@ snippet main
int main(${1:int argc, const char **argv}) {
$0
}
# Doxygen
snippet b
@brief ${0:desc}
snippet r
@return ${0:desc}
snippet rv
@retval ${1:val} ${0:desc}

View File

@@ -1,48 +1,5 @@
-- C++ LuaSnip Snippets
# C++ LuaSnip Snippets
local luasnip = require('luasnip')
luasnip.filetype_extend('cpp', { 'c' })
local snip = luasnip.snippet
local text = luasnip.text_node
local ins = luasnip.insert_node
local dyn = luasnip.dynamic_node
local node = luasnip.snippet_node
local key = require("luasnip.nodes.key_indexer").new_key
local snippets = {
snip('for', {
text('for ('),
ins(1, 'auto'),
text(' '),
ins(2, 'index'),
text(' '),
ins(3, '='),
dyn(4, function(args)
local choice = args[2][1]
if choice == '=' then -- index based for loop
local var = args[1][1]
return node(nil, {
text(' '),
ins(1, '0'),
text('; ' .. var .. ' < '),
ins(2, 'count'),
text('; '),
ins(3, var .. '++'),
})
elseif choice == ':' then -- range based for loop
return node(nil, {
text(' '),
ins(1, 'container')
})
end
return node(nil, {})
end, { 2, 3 }, key('var')),
text({ ') {', '\t' }),
ins(0, ''),
text({ '', '}' })
}),
}
return snippets

View File

@@ -2,6 +2,16 @@
extends c
snippet for Range based
for (${1:auto} ${2:value} : ${3:container}) {
$0
}
snippet for Index based
for (${1:int} i = ${2:0}; i < ${3:count}; i++) {
$0
}
snippet namespace
namespace ${1} {
$0

View File

@@ -1,59 +0,0 @@
# Go LuaSnip Snippets
local luasnip = require('luasnip')
local snip = luasnip.snippet
local text = luasnip.text_node
local ins = luasnip.insert_node
local func = luasnip.function_node
local node = luasnip.snippet_node
local key = require("luasnip.nodes.key_indexer").new_key
local function short_name(name)
local short = string.lower(string.sub(name, 1, 1))
for i = 2, #name do
local char = string.sub(name, i, i)
if char == string.upper(char) then
short = short .. char
end
end
return string.lower(short)
end
local snippets = {
snip('func', {
text('func '),
node(1, {
func(function(args)
if string.len(args[1][1]) > 0 then
return '(' .. short_name(args[1][1]) .. ' *'
end
return ''
end, key('type')),
ins(1, '', { key = 'type' }),
func(function(args)
if string.len(args[1][1]) > 0 then
return ') '
end
return ''
end, key('type')),
}),
ins(2, 'name'),
text('('),
ins(3, ''),
text(') '),
ins(4, '', { key = 'return' }),
func(function(args)
if string.len(args[1][1]) > 0 then
return ' '
end
return ''
end, key('return')),
text({ '{', '\t' }),
ins(0, ''),
text({ '', '}' }),
}),
}
return snippets

View File

@@ -1,13 +0,0 @@
# Go SnipMate snippets
snippet main
package main
func main() {
$0
}
snippet err
if err != nil {
$0
}

View File

@@ -1,15 +0,0 @@
# Python SnipMate snippets
snippet main
def main():
${0:pass}
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
exit(130)
snippet debug
import ipdb; ipdb.set_trace()

View File

@@ -1,6 +0,0 @@
# reStructuredText snippets
snippet code
.. code-block:: ${1:language}
$0