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
41 changed files with 254 additions and 777 deletions

1
.gitignore vendored
View File

@@ -1,2 +1 @@
lazy-lock.json
spell/*.spl

1
after/ftplugin/c.lua Normal file
View File

@@ -0,0 +1 @@
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,2 +1,3 @@
vim.opt.commentstring = '//%s'
vim.opt.matchpairs:append('<:>')
vim.bo.commentstring = '//%s'
require('build').create_commands()

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,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,5 +1,9 @@
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
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,6 +19,10 @@ 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
@@ -32,7 +36,7 @@ function build.set_dir(dirname)
-- Restart clangd language server
-- TODO: Configure cmake language server?
on_exit = function()
vim.cmd.LspRestart('clangd')
vim.cmd [[ LspRestart clangd ]]
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end,
@@ -151,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,15 +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.highligh('TreesitterContext', 'guibg=' .. dragon.ui.bg_gutter)
vim.cmd.highlight('link zshTodo Comment')
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

View File

@@ -1,5 +1,4 @@
return {
-- TODO: v0.10.0 Added built-in |commenting| support.
'terrortylor/nvim-comment',
config = function()
require('nvim_comment').setup({

View File

@@ -1,106 +1,60 @@
-- Language servers
local ensure_installed = {
'clangd', -- C/C++
'lua_ls', -- Lua
'opencl_ls', -- OpenCL
}
if vim.fn.executable('npm') == 1 then
local ensure_install_from_npm = {
'ansiblels', -- Ansible
'bashls', -- Bash
'docker_compose_language_service', -- Docker Compose
'dockerls', -- Dockerfile
'html', -- HTML
'jsonls', -- JSON
'pyright', -- Python
'vimls', -- VimScript
'yamlls', -- YAML
}
for _, package in ipairs(ensure_install_from_npm) do
table.insert(ensure_installed, package)
end
end
if vim.fn.executable('pip') == 1 then
local ensure_install_from_pip = {
'cmake', -- CMake
'esbonio', -- Sphinx
'ruff_lsp', -- Python
}
for _, package in ipairs(ensure_install_from_pip) do
table.insert(ensure_installed, package)
end
end
if vim.fn.has('win32') == 1 then
table.insert(ensure_installed, 'powershell_es')
end
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
'kbenzie/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/neodev.nvim',
-- 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.lsp.protocol.make_client_capabilities()
capabilities = vim.tbl_deep_extend(
'force', capabilities, require('cmp_nvim_lsp').default_capabilities())
require('mason').setup()
require('mason-lspconfig').setup({
ensure_installed = {
'clangd',
'cmake',
'jsonls',
'lua_ls',
'lemminx',
'vimls',
'yamlls',
},
automatic_installation = false,
ensure_installed = ensure_installed,
handlers = {
-- Default handler, sets up everything unless a custom language server
-- setup handler is defined below
function(server_name)
require('lspconfig')[server_name].setup({
capabilities = capabilities,
})
end,
['clangd'] = function()
require('lspconfig').clangd.setup({
capabilities = capabilities,
cmd = { 'clangd', '--completion-style=detailed' }
})
require('lspconfig')[server_name].setup({})
end,
['lua_ls'] = function()
require('neodev').setup()
require('lspconfig').lua_ls.setup({
capabilities = capabilities,
local lspconfig = require('lspconfig')
lspconfig.lua_ls.setup({
settings = {
Lua = {
diagnostics = {
@@ -110,19 +64,7 @@ return {
}
}
})
end,
['pyright'] = function()
require('lspconfig').pyright.setup({
capabilities = capabilities,
settings = {
pyright = {
disableOrganizeImports = true, -- Use ruff import sorter instead
},
}
})
end,
end
},
})
@@ -133,49 +75,30 @@ 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 = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'buffer' },
{ name = 'nvim_lsp' },
-- { name = 'buffer' },
{ name = 'path' },
{ name = 'git' },
},
formatting = {
format = function(entry, 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(),
-- { name = 'cmdline' },
},
})
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 = '*',
@@ -184,46 +107,46 @@ return {
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)
vim.keymap.set('n', '<leader>fi',
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>ss', 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)
-- Help mappings
-- TODO: v0.10.0 |vim.lsp.start()| now maps |K| to use
-- |vim.lsp.buf.hover()| if the server supports it, unless
-- |'keywordprg'| was customized before calling |vim.lsp.start()|.
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
-- Format whole buffer mapping
vim.keymap.set('n', '<leader>gq', vim.lsp.buf.format, opts)
-- Swtich 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 })
-- 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,18 +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', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<leader>ds', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '<leader>dq', function()
require('trouble').toggle()
end, opts)
end
}
}

View File

@@ -1,26 +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 })
end
}

View File

@@ -5,11 +5,9 @@ return {
'nvim-telescope/telescope-fzy-native.nvim',
'nvim-tree/nvim-web-devicons',
'axkirillov/easypick.nvim',
'catgoose/telescope-helpgrep.nvim',
},
config = function()
local telescope = require('telescope')
local actions = require('telescope.actions')
telescope.setup({
defaults = {
mappings = {
@@ -22,39 +20,24 @@ return {
['<C-s>'] = 'select_horizontal',
['<C-h>'] = 'preview_scrolling_left',
['<C-l>'] = 'preview_scrolling_right',
},
}
},
layout_config = {
height = 0.7,
},
},
extensions = {
helpgrep = {
mappings = {
i = {
["<CR>"] = actions.select_default,
["<C-v>"] = actions.select_vertical,
},
n = {
["<CR>"] = actions.select_default,
["<C-s>"] = actions.select_horizontal,
}
},
},
}
},
})
telescope.load_extension('fzy_native')
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>rg', builtin.grep_string, opts)
vim.keymap.set('n', '<leader>gb', builtin.buffers, opts)
vim.keymap.set('n', '<leader>ht', builtin.help_tags, opts)
vim.keymap.set('n', '<leader>gh', require('telescope-helpgrep').live_grep, opts)
vim.keymap.set('n', '<leader>bl', builtin.current_buffer_fuzzy_find, 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 = { },

View File

@@ -2,9 +2,7 @@ return {
'nvim-treesitter/nvim-treesitter',
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',
@@ -13,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 = {
@@ -47,8 +45,6 @@ return {
'llvm',
'lua',
'make',
'markdown',
'markdown_inline',
'meson',
'ninja',
'objc',
@@ -80,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,44 +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,
{
'tummetott/unimpaired.nvim',
config = function()
require('unimpaired').setup({})
end
},
{ 'stevearc/dressing.nvim' },
{ 'kevinhwang91/nvim-bqf' },
}

View File

@@ -77,18 +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.fillchars = 'fold: '
-- FIXME: Replace this with transparent fold text in 0.10
-- https://github.com/neovim/neovim/pull/20750
function _G.fold_text()
return vim.fn.getline(vim.v.foldstart)
end
vim.opt.foldtext = 'v:lua.fold_text()'
-- Enable all mouse features
vim.opt.mouse = 'a'
@@ -117,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,7 +67,7 @@ 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
@@ -94,6 +92,10 @@ local function generic(group, name, show_lsp)
.. '%#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, show_lsp)
'%{&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)
@@ -138,7 +136,7 @@ function _G.statusline_active()
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
@@ -158,6 +156,8 @@ function _G.statusline_inactive()
else
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,67 +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()
vim.cmd.startinsert()
end
})
-- Don't show the line number column in terminal-insert mode
vim.api.nvim_create_autocmd('TermEnter', {
group = group, pattern = 'term://*',
callback = function()
vim.opt.number = false
vim.opt.relativenumber = false
vim.opt.signcolumn = 'no'
end
})
-- But do show the line number column in terminal-normal mode
vim.api.nvim_create_autocmd('TermLeave', {
group = group, pattern = 'term://*',
callback = function()
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.signcolumn = 'yes'
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,128 +0,0 @@
-- :RString strip white psace 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 = '%' })
-- :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 selecte 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 and fuzzy find the results, bang to enable
-- regex in given string
-- FIXME: Support visual select modes
vim.api.nvim_create_user_command('Rg', function(opts)
local grep_opts = { search = opts.args }
if opts.bang then
grep_opts['use_regex'] = true
end
require('telescope.builtin').grep_string(grep_opts)
end, { bang = true, nargs = '*' })

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,45 +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)

View File

@@ -1,37 +0,0 @@
-- 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')
local directory = vim.fn.expand('%:hp')
if directory == '' then
directory = vim.fn.getcwd()
end
-- Invoke netrw on the directory containing the current file
vim.fn.execute(string.format("edit %s", directory))
if filename ~= '' then
-- In the netrw buffer, move the cursor to the first character of filename
vim.fn.search('\\<' .. filename .. '\\>')
end
end)
-- Unmap <C-l> in netrw buffers so it can be used for natigation
vim.api.nvim_create_autocmd('FileType', {
pattern = 'netrw',
group = vim.api.nvim_create_augroup('netrw_unmap', {}),
callback = function()
local buffer = vim.api.nvim_get_current_buf()
if vim.fn.hasmapto('<Plug>NetrwRefresh') == 1 then
vim.keymap.del('n', '<C-l>', { buffer = buffer })
end
end
})

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

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

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