Compare commits

..

39 Commits

Author SHA1 Message Date
18d5f5896b Add gopls language server 2025-04-27 22:08:00 +01:00
Kenneth Benzie (Benie)
946d1e7b4a Add :LStrip command to strip whitespace on the left 2025-04-03 16:27:43 +01:00
14709a12a7 Remove unicode from statusline
Some terminals use more characters than others for to display certain
unicode code points, this resulted the statusline to "leak" past the end
of the line causing characters at the next line to be highlighted
incorrectly.
2025-03-05 10:48:56 +00:00
830ace507e Add tablegen treesitter parser 2025-02-04 17:23:16 +00:00
96e912181c Use nvim_treesitter#indent() for Python 2025-01-25 20:33:06 +00:00
7536173150 Add confTodo to list of Comment highlights 2025-01-24 13:28:14 +00:00
d0315cc1ee Fix typo of vim.cmd.highlight 2025-01-24 13:28:14 +00:00
de0e52f0db Add WezTerm multiplex support to navigation bindings 2025-01-12 20:21:35 +00:00
e929956a8c Add markdown table mode plugin 2024-12-20 22:44:55 +00:00
c895484b75 Fix comment alignment 2024-12-07 16:36:16 +00:00
2814270762 Add C/C++ include guard snippet 'once' 2024-12-04 14:54:59 +00:00
dc78a25253 Add :DiagnosticToggle command to quickly (dis,en)able diagnositcs 2024-11-22 14:20:59 +00:00
a13d97f3ff Switch to ruff from deprecated ruff_lsp 2024-11-08 22:08:52 +00:00
33f3e8e920 Refactor TODO highlight group overrides 2024-10-04 16:49:38 +01:00
cd5cd3ba69 Update comments in commands.lua 2024-09-21 10:32:18 +01:00
7963c56fd9 Add :Tac command to replace :!tac & be cross-platform 2024-09-21 10:26:46 +01:00
55f5da7db7 Make Powershell script TODO's not highlighted 2024-09-18 10:22:40 +01:00
0434fc3ac2 Don't use compdb on Windows since its borked 2024-09-18 10:22:22 +01:00
Kenneth Benzie (Benie)
2cd7d34375 Actually fix restarting the LSP in :BuildDir job callback 2024-08-06 17:29:36 +01:00
d1f83a05b9 Use LspStop and LspStart instead of LspRestart 2024-07-19 20:58:27 +01:00
8b4258408e Add :CheckboxToggle and mapping 2024-07-11 20:09:43 +01:00
8a5f4a3063 Switch to lazydev from the archived neodev 2024-07-11 19:50:31 +01:00
Kenneth Benzie (Benie)
aa7da3dfe2 Don't be clever with number/relativenumber in terminals 2024-07-08 14:12:14 +01:00
68e8635ae1 Switch back to upstream cmp-git 2024-07-02 13:15:26 +01:00
Kenneth Benzie (Benie)
6217dd7f54 Don't map 0 to #if 0 in normal mode 2024-06-11 12:34:56 +01:00
2bae0d50d6 Switch to nvim-impairative for pairwise mappings 2024-06-01 15:07:06 +01:00
59d3ea0978 Make cpp for snippet dynamic 2024-06-01 10:30:52 +01:00
0410dfc23d Switch to mini.comment from comment.nvim
Even though v0.10.0 introduced builtin support for `gc{motion}` to
toggle comments it does not support ignoring blank lines. Also switch to
using mini.comment as its the same author as the builtin support.
2024-05-28 23:28:49 +01:00
0d1983e8bb Fix weirdness in gopls completions 2024-05-25 23:37:57 +01:00
c3fe8e033a Remove stray print in :Rg command 2024-05-25 23:32:14 +01:00
0f4e759266 Add main Go snippet 2024-05-25 23:11:27 +01:00
b146971918 Change document symbols mapping 2024-05-25 13:17:54 +01:00
a365bcb6b5 Don't repeat yourself in custom lspconfigs 2024-05-25 13:14:05 +01:00
6affd78df7 Cleanup nvim-cmp config callback 2024-05-25 13:13:35 +01:00
fcd5cfbd54 Extend :Rg to support visual select mode
Also move away from using the telescope builtin grep for word under
cursor mapping by extending the `:Rg` command to work in the following
circumstances:

* `:Rg text to search for`
* `:Rg` word under cursor
* `'<,'>Rg` visual selection
2024-05-25 11:03:06 +01:00
1996e631a3 Add :PreProcIfWrap command and C/C++ mappings
Quickly wrap a line or range in `#if 0`/`#endif` to quickly disable
compilation of sections of code.
2024-05-25 11:02:57 +01:00
0602390a2d Add telescope extension to list luasnip snippets 2024-05-25 10:22:35 +01:00
b0cfb31645 Add func snippet for go 2024-05-24 23:09:47 +01:00
Kenneth Benzie (Benie)
aba1664d09 Cleanup unused arg in statusline implementation 2024-05-24 16:04:23 +01:00
24 changed files with 444 additions and 205 deletions

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

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

View File

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

2
after/indent/python.lua Normal file
View File

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

View File

@ -31,8 +31,16 @@ local kanagawa = {
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('TreesitterContext', 'guibg=' .. dragon.ui.bg_gutter)
-- Don't lighlight TODO specially in comments
for _, todo_group in pairs({
'confTodo',
'ps1CommentTodo',
'zshTodo',
}) do
vim.cmd.highlight('link ' .. todo_group .. ' Comment')
end
end
}

View File

@ -1,10 +0,0 @@
return {
-- TODO: v0.10.0 Added built-in |commenting| support.
'terrortylor/nvim-comment',
config = function()
require('nvim_comment').setup({
-- should comment out empty or whitespace only lines
comment_empty = false,
})
end
}

View File

@ -26,13 +26,22 @@ if vim.fn.executable('pip') == 1 then
local ensure_install_from_pip = {
'cmake', -- CMake
'esbonio', -- Sphinx
'ruff_lsp', -- Python
'ruff', -- Python
}
for _, package in ipairs(ensure_install_from_pip) do
table.insert(ensure_installed, package)
end
end
if vim.fn.executable('go') then
local ensure_installed_from_go = {
'gopls', -- Go
}
for _, package in ipairs(ensure_installed_from_go) do
table.insert(ensure_installed, package)
end
end
if vim.fn.has('win32') == 1 then
table.insert(ensure_installed, 'powershell_es')
end
@ -50,11 +59,11 @@ return {
'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
'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/neodev.nvim',
{ 'folke/lazydev.nvim', ft = 'lua', opts = {} },
-- Expose clangd extensions
'p00f/clangd_extensions.nvim',
@ -72,57 +81,48 @@ return {
},
config = function()
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = vim.tbl_deep_extend(
'force', capabilities, require('cmp_nvim_lsp').default_capabilities())
local lspconfig_default_opts = {
-- Broadcast full client capabilities to language servers
capabilities = vim.tbl_deep_extend(
'force', vim.lsp.protocol.make_client_capabilities(),
require('cmp_nvim_lsp').default_capabilities()),
}
local lspconfig_custom_opts = {
clangd = {
cmd = { 'clangd', '--completion-style=detailed' },
},
lua_ls = {
settings = {
Lua = {
diagnostics = {
disable = { 'missing-fields', },
globals = { 'vim', },
},
},
},
},
pyright = {
settings = {
pyright = {
disableOrganizeImports = true,
},
},
},
}
require('mason').setup()
require('mason-lspconfig').setup({
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,
})
local opts = vim.tbl_deep_extend("force",
lspconfig_default_opts, lspconfig_custom_opts[server_name] or {})
require('lspconfig')[server_name].setup(opts)
end,
['clangd'] = function()
require('lspconfig').clangd.setup({
capabilities = capabilities,
cmd = { 'clangd', '--completion-style=detailed' }
})
end,
['lua_ls'] = function()
require('neodev').setup()
require('lspconfig').lua_ls.setup({
capabilities = capabilities,
settings = {
Lua = {
diagnostics = {
disable = { 'missing-fields', },
globals = { 'vim', },
}
}
}
})
end,
['pyright'] = function()
require('lspconfig').pyright.setup({
capabilities = capabilities,
settings = {
pyright = {
disableOrganizeImports = true, -- Use ruff import sorter instead
},
}
})
end,
},
})
@ -147,8 +147,8 @@ return {
}),
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'nvim_lsp' },
{ name = 'buffer' },
{ name = 'path' },
{ name = 'git' },
@ -172,6 +172,8 @@ return {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
preselect = 'none', -- Don't preselect completions suggested by source
})
require("cmp_git").setup({})
@ -180,11 +182,12 @@ return {
vim.api.nvim_create_autocmd('LspAttach', {
pattern = '*',
group = augroup,
callback = function(ev)
local opts = { noremap = true, buffer = ev.buf }
callback = function(event)
local opts = { noremap = true, buffer = event.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')
@ -195,7 +198,7 @@ return {
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>sd', tb.lsp_document_symbols, opts)
vim.keymap.set('n', '<leader>sw', tb.lsp_workspace_symbols, opts)
-- Refactoring mappings
@ -212,7 +215,8 @@ return {
-- Swtich file using clangd extension
-- TODO: limit this to only filetypes supported by clangd
vim.keymap.set('n', '<leader>sf', ':ClangdSwitchSourceHeader<CR>', { silent = true })
vim.keymap.set('n', '<leader>sf',
':ClangdSwitchSourceHeader<CR>', { silent = true })
end
})

64
lua/plugins/mux.lua Normal file
View File

@ -0,0 +1,64 @@
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

@ -22,5 +22,15 @@ return {
luasnip.jump(-1)
end
end, { silent = true })
-- vim.keymap.set('s', '<M-l>', function()
-- if luasnip.choice_active() then
-- luasnip.change_choice(1)
-- end
-- end, { silent = true })
-- vim.keymap.set('s', '<M-h>', function()
-- if luasnip.choice_active() then
-- luasnip.change_choice(-1)
-- end
-- end, { silent = true })
end
}

View File

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

View File

@ -5,11 +5,10 @@ return {
'nvim-telescope/telescope-fzy-native.nvim',
'nvim-tree/nvim-web-devicons',
'axkirillov/easypick.nvim',
'catgoose/telescope-helpgrep.nvim',
'benfowler/telescope-luasnip.nvim',
},
config = function()
local telescope = require('telescope')
local actions = require('telescope.actions')
telescope.setup({
defaults = {
mappings = {
@ -22,38 +21,23 @@ 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')
telescope.load_extension('luasnip')
local builtin = require('telescope.builtin')
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>gh', builtin.help_tags, opts)
vim.keymap.set('n', '<leader>bl', builtin.current_buffer_fuzzy_find, opts)
require('easypick').setup({

View File

@ -1,39 +0,0 @@
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

@ -62,6 +62,7 @@ return {
'rst',
'ssh_config',
'strace',
'tablegen',
'tmux',
'toml',
'vim',

View File

@ -33,12 +33,13 @@ local noice = {
return {
-- noice,
{ 'echasnovski/mini.comment', opts = { options = { ignore_blank_line = true } } },
{
'tummetott/unimpaired.nvim',
'idanarye/nvim-impairative',
config = function()
require('unimpaired').setup({})
end
},
require('impairative').setup({})
require('impairative.replicate-unimpaired')()
end},
{ 'stevearc/dressing.nvim' },
{ 'kevinhwang91/nvim-bqf' },
}

View File

@ -31,26 +31,6 @@ vim.api.nvim_create_autocmd('TermOpen', {
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,

View File

@ -21,42 +21,58 @@ function build.set_dir(dirname)
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, {
-- Restart clangd language server
-- TODO: Configure cmake language server?
on_exit = function()
vim.cmd.LspRestart('clangd')
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end,
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, {
-- 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)
-- 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')
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
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,
}
)
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')
echo('Build directory selected: ' .. dirname, 'DiagnosticInfo')
end)
end
)
end
end
function build.select_dir(callback)

View File

@ -1,4 +1,4 @@
-- :RString strip white psace from right of all lines, ranges supported
-- :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
@ -7,6 +7,15 @@ vim.api.nvim_create_user_command('RStrip', function(opts)
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
@ -42,7 +51,7 @@ vim.api.nvim_create_user_command('Remove', function(opts)
end
end
end
-- Actually remove the file using the selecte callback.
-- Actually remove the file using the selected callback.
vim.loop.fs_unlink(path, callback)
end, { bang = true })
@ -116,13 +125,83 @@ end, {
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
-- :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 grep_opts = { search = opts.args }
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, nargs = '*' })
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, {})

View File

@ -43,3 +43,10 @@ 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

@ -60,7 +60,7 @@ local function get_mode()
end
-- Display cusor line/total and column
local position = '# ☰ %l/%L 󰠷 %2c '
local position = '# %l/%L:%2c '
-- Construct a statusline for special buffer types.
local function special(group, name, title)
@ -75,7 +75,7 @@ local function special(group, name, title)
end
-- Construct a statusline for generic buffer types.
local function generic(group, name, show_lsp)
local function generic(group, name)
-- Display current mode with dynamic highlights.
local line = '%#' .. group .. '# ' .. name .. ' '
-- Display spell or paste if set with dusk highlights in a group to swallow
@ -131,11 +131,11 @@ 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, false)
return generic('StatusLineLight', mode)
elseif vim.o.filetype == 'man' then
return special('StatusLineDusk', 'Manual', '%f')
end
return generic('StatusLineLight', mode, true)
return generic('StatusLineLight', mode)
end
function _G.statusline_inactive()
@ -152,11 +152,11 @@ function _G.statusline_inactive()
elseif vim.o.buftype == 'terminal' then
line = special('StatusLineDusk', 'Terminal', '%f')
elseif vim.o.previewwindow then
line = generic('StatusLineDusk', 'Preview', false)
line = generic('StatusLineDusk', 'Preview')
elseif vim.o.filetype == 'man' then
line = special('StatusLineDusk', 'Manual', '%f')
else
line = generic('StatusLineDusk', 'Idle', false)
line = generic('StatusLineDusk', 'Idle')
end
return line
end

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 insert = luasnip.insert_node
local ins = 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) .. ': '),
insert(0),
ins(0),
func(comment_suffix),
})
)

View File

@ -7,6 +7,11 @@ local insert = luasnip.insert_node
local func = luasnip.function_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 = {
snip('#include', {
text('#include '),
@ -20,6 +25,21 @@ local snippets = {
end
end, key('open')),
}),
snip('once', {
text('#ifndef '),
func(function(args)
return args[1][1]
end, key('name')),
text({ '', '#define ' }),
insert(1, getIncludeGuardName(), { key = 'name' }),
text({ '', '', '', }),
insert(0, ''),
text({ '', '', '#endif // ' }),
func(function(args)
return args[1][1]
end, key('name')),
}),
}
return snippets

View File

@ -1,5 +1,48 @@
# 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,16 +2,6 @@
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

59
snippets/go.lua Normal file
View File

@ -0,0 +1,59 @@
# 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

8
snippets/go.snippets Normal file
View File

@ -0,0 +1,8 @@
# Go SnipMate snippets
snippet main
package main
func main() {
$0
}