mirror of
https://github.com/pnx/dotfiles
synced 2026-06-16 11:24:55 +02:00
moar nvim: snippets and other things
This commit is contained in:
parent
bcb84e54eb
commit
0fb3cfeef9
14 changed files with 426 additions and 138 deletions
|
|
@ -1,4 +1,5 @@
|
|||
local autocmd = vim.api.nvim_create_autocmd
|
||||
local augroup = vim.api.nvim_create_augroup
|
||||
|
||||
-- Highlight on yank
|
||||
autocmd('TextYankPost', {
|
||||
|
|
|
|||
|
|
@ -1,61 +1,73 @@
|
|||
return function()
|
||||
local cmp = require('cmp')
|
||||
local lspkind = require('utils.lspkind')
|
||||
local icons = require('config.icons')
|
||||
local cmp = require("cmp")
|
||||
local utils = require("utils.cmd")
|
||||
local luasnip = require("luasnip")
|
||||
local lspkind = require("utils.lspkind")
|
||||
local icons = require("config.icons")
|
||||
|
||||
local selectPrev = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert })
|
||||
local selectNext = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert })
|
||||
local selectPrev = utils.selectPrev({ behavior = cmp.SelectBehavior.Insert })
|
||||
local selectNext = utils.selectNext({ behavior = cmp.SelectBehavior.Insert })
|
||||
|
||||
local windowstyle = {
|
||||
border = vim.g.float_border or 'none',
|
||||
winhighlight = 'Normal:Pmenu,FloatBorder:FloatBorder,CursorLine:PmenuSel,Search:None',
|
||||
}
|
||||
local windowstyle = {
|
||||
border = vim.g.float_border or "none",
|
||||
winhighlight = "Normal:Pmenu,FloatBorder:FloatBorder,CursorLine:PmenuSel,Search:None",
|
||||
}
|
||||
|
||||
return {
|
||||
preselect = false,
|
||||
completion = {
|
||||
completeopt = "menuone,longest,noinsert,preview"
|
||||
},
|
||||
view = {
|
||||
entries = { name = 'custom', selection_order = 'near_cursor' },
|
||||
},
|
||||
window = {
|
||||
documentation = windowstyle,
|
||||
completion = windowstyle
|
||||
},
|
||||
mapping = {
|
||||
["<Up>"] = selectPrev,
|
||||
["<S-Tab>"] = selectPrev,
|
||||
["<Down>"] = selectNext,
|
||||
["<Tab>"] = selectNext,
|
||||
["<C-c>"] = cmp.mapping.abort(),
|
||||
['<CR>'] = cmp.mapping.confirm({ select = true }),
|
||||
},
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require('luasnip').lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
formatting = {
|
||||
fields = { "abbr", "kind", "menu" },
|
||||
format = lspkind.format({
|
||||
mode = 'symbol',
|
||||
preset = 'codicons',
|
||||
symbol_map = icons.symbols,
|
||||
maxwidth = 40,
|
||||
ellipsis_char = "...",
|
||||
}),
|
||||
},
|
||||
sources = {
|
||||
{ name = 'nvim_lsp' },
|
||||
{ name = 'buffer' },
|
||||
{ name = 'path' },
|
||||
{ name = 'luasnip' }
|
||||
},
|
||||
experimental = {
|
||||
ghost_text = {
|
||||
hl_group = "NonText",
|
||||
},
|
||||
},
|
||||
}
|
||||
return {
|
||||
preselect = false,
|
||||
completion = {
|
||||
completeopt = "menuone,longest,noinsert,preview",
|
||||
},
|
||||
view = {
|
||||
entries = { name = "custom", selection_order = "near_cursor" },
|
||||
},
|
||||
window = {
|
||||
documentation = windowstyle,
|
||||
completion = windowstyle,
|
||||
},
|
||||
mapping = {
|
||||
["<Up>"] = selectPrev,
|
||||
["<S-Tab>"] = selectPrev,
|
||||
["<Down>"] = selectNext,
|
||||
["<Tab>"] = selectNext,
|
||||
["<C-c>"] = cmp.mapping.abort(),
|
||||
["<CR>"] = utils.confirm({ select = true }),
|
||||
},
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require("luasnip").lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
formatting = {
|
||||
fields = { "abbr", "kind", "menu" },
|
||||
format = lspkind.format({
|
||||
mode = "symbol",
|
||||
preset = "codicons",
|
||||
symbol_map = icons.symbols,
|
||||
maxwidth = 40,
|
||||
ellipsis_char = "...",
|
||||
}),
|
||||
},
|
||||
sources = {
|
||||
{ name = "nvim_lsp" },
|
||||
{ name = "luasnip" },
|
||||
{ name = "buffer" },
|
||||
{ name = "path" },
|
||||
{
|
||||
name = "spell",
|
||||
option = {
|
||||
keep_all_entries = false,
|
||||
enable_in_context = function()
|
||||
return true
|
||||
end,
|
||||
preselect_correct_word = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
experimental = {
|
||||
ghost_text = {
|
||||
hl_group = "NonText",
|
||||
},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
|
|
|||
|
|
@ -51,6 +51,14 @@ return {
|
|||
staged = "✓",
|
||||
conflict = "",
|
||||
},
|
||||
todo = {
|
||||
default = '',
|
||||
warn = '',
|
||||
perf = '',
|
||||
bug = '',
|
||||
hack = '',
|
||||
test = '',
|
||||
},
|
||||
diagnostics = {
|
||||
error = '',
|
||||
warn = '',
|
||||
|
|
@ -66,7 +74,7 @@ return {
|
|||
unknown = '',
|
||||
},
|
||||
symbols = {
|
||||
Text = "",
|
||||
Text = "TXT",
|
||||
Method = "",
|
||||
Function = "",
|
||||
Constructor = "",
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ return {
|
|||
{ { "n", "v" }, "<leader>p", [["+p]], { desc = "Paste from system clipboard register" } },
|
||||
|
||||
-- File operations
|
||||
-- { "n", "<leader>Fe", "<cmd>Ex<CR>", { silent = true, desc = "Open Netrw" } },
|
||||
{ "n", "gf", "<cmd>e <cfile><CR>", { silent = true, desc = "Open (or create) file under cursor" } },
|
||||
{ "n", "<leader>Fc", ":CreateFile ", { silent = true, desc = "Create new file" } },
|
||||
{ "n", "<leader>Fx", "<cmd>!chmod +x %<CR>", { silent = true, desc = "Set execute flag on current file" } },
|
||||
|
||||
|
|
@ -71,11 +71,15 @@ return {
|
|||
{ "n", "<leader>rw", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]],
|
||||
{ desc = "search+replace word under cursor" } },
|
||||
|
||||
{ { "x" }, "<leader>fhx", [[:s/\(\x\{2\}\)/0x\1, /g]], { desc = "Format hex" } },
|
||||
{ { "x" }, "<leader>fha", [[:s/0x\(\x\{1\}\X\)/0x0\1/g]], { desc = "Format each hex number to be 2 characters long" } },
|
||||
{ { "x" }, "<leader>fhn", [[:s/\(\(0x\x\{1,2\}, \)\{8\}\)/\1\r/g]], { desc = "Format hex with 8 bytes per row" } },
|
||||
-- Hex formatting
|
||||
{ "x", "<leader>fhx", [[:s/\(\x\{2\}\)/0x\1, /g]], { desc = "Format hex" } },
|
||||
{ "x", "<leader>fha", [[:s/0x\(\x\{1\}\X\)/0x0\1/g]], { desc = "Format each hex number to be 2 characters long" } },
|
||||
{ "x", "<leader>fhn", [[:s/\(\(0x\x\{1,2\}, \)\{8\}\)/\1\r/g]], { desc = "Format hex with 8 bytes per row" } },
|
||||
-- {{"x"}, "<leader>hb", [[:'<,'>s/\(\x\{2\}\)/0x\1, /g<cr>]], { desc = "Format a hex string to byte array"}},
|
||||
|
||||
-- Case formatting
|
||||
{ "x", "<leader>fcsc", [[:s/\%V\([a-z]\+\)_\?/\u\1/g]], { desc = "Convert text from snake_case to CamelCase" } },
|
||||
|
||||
-- diagnostics
|
||||
{ "n", "<leader>do", vim.diagnostic.open_float, { desc = "Open diagnostics" } },
|
||||
{ "n", "<leader>dn", vim.diagnostic.get_next, { desc = "Goto next" } },
|
||||
|
|
@ -85,14 +89,17 @@ return {
|
|||
{ "n", "<leader>m", ":terminal tmuxs<cr>i", { desc = "Open tmux manager" } },
|
||||
|
||||
|
||||
{ "n", "Q", "<nop>" },
|
||||
{ "n", "Q", "<nop>" }, -- NOPE
|
||||
|
||||
},
|
||||
whichkey = {
|
||||
mode = { "n", "v" },
|
||||
mode = { "n", "v", "x" },
|
||||
["<leader>r"] = { name = "+Rename" },
|
||||
["<leader>b"] = { name = "+Buffers" },
|
||||
["<leader>f"] = { name = "+Format" },
|
||||
["<leader>fc"] = { name = "+Case" },
|
||||
["<leader>fcs"] = { name = "+snake_case" },
|
||||
["<leader>fh"] = { name = "+Hex" },
|
||||
["<leader>F"] = { name = "+Files" },
|
||||
["<leader>d"] = { name = "+Diagnostics" },
|
||||
["<leader>s"] = { name = "+Search" },
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
vim.g.lsp_zero_ui_float_border = vim.g.float_border or 'none'
|
||||
|
||||
return {
|
||||
document_highlight = true,
|
||||
servers = {
|
||||
-- PHP
|
||||
phpactor = {
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ set.wrap = false -- Disable line wrap
|
|||
set.pumheight = 20
|
||||
set.laststatus = 3
|
||||
set.splitkeep = "screen"
|
||||
set.scrolloff = 20
|
||||
set.scrolloff = 10
|
||||
|
||||
-- Configure how new splits should be opened
|
||||
set.splitright = true
|
||||
|
|
@ -67,6 +67,10 @@ set.incsearch = true
|
|||
set.ignorecase = true
|
||||
set.smartcase = true
|
||||
|
||||
-- Spell stuff, because i cant english
|
||||
set.spell = true
|
||||
set.spelllang = { 'en_us' }
|
||||
|
||||
-- line numbers
|
||||
set.number = true
|
||||
set.relativenumber = true
|
||||
|
|
|
|||
|
|
@ -166,5 +166,18 @@ return {
|
|||
keys = keys.oil or {},
|
||||
opts = require('config.oil'),
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
}
|
||||
},
|
||||
{
|
||||
"folke/trouble.nvim",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
opts = {},
|
||||
},
|
||||
{
|
||||
'L3MON4D3/LuaSnip',
|
||||
opts = {},
|
||||
config = function (_, opts)
|
||||
require("luasnip.loaders.from_lua").load({paths = "~/.config/nvim/snippets"})
|
||||
require("luasnip").setup(opts)
|
||||
end
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,64 +1,66 @@
|
|||
return {
|
||||
'VonHeikemen/lsp-zero.nvim',
|
||||
branch = 'v3.x',
|
||||
dependencies = {
|
||||
'neovim/nvim-lspconfig',
|
||||
'hrsh7th/cmp-nvim-lsp',
|
||||
"VonHeikemen/lsp-zero.nvim",
|
||||
branch = "v3.x",
|
||||
dependencies = {
|
||||
"neovim/nvim-lspconfig",
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
|
||||
-- completion
|
||||
{
|
||||
'hrsh7th/nvim-cmp',
|
||||
version = false,
|
||||
event = "InsertEnter",
|
||||
dependencies = {
|
||||
'hrsh7th/cmp-buffer',
|
||||
'hrsh7th/cmp-path',
|
||||
'hrsh7th/cmp-nvim-lsp',
|
||||
'L3MON4D3/LuaSnip',
|
||||
'onsails/lspkind-nvim',
|
||||
},
|
||||
opts = require('config.cmp'),
|
||||
config = function(_, opts)
|
||||
local cmp = require('cmp')
|
||||
cmp.setup(opts)
|
||||
-- completion
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
version = false,
|
||||
event = "InsertEnter",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-buffer", -- autocomplete from buffer
|
||||
"hrsh7th/cmp-path", -- autocomplete from filesystem
|
||||
"hrsh7th/cmp-nvim-lsp", -- autocomplete from lsp
|
||||
"saadparwaiz1/cmp_luasnip", -- autocomplete from snippet engine
|
||||
"L3MON4D3/LuaSnip", -- snippet engine
|
||||
"onsails/lspkind-nvim", -- icons for kind
|
||||
},
|
||||
opts = require("config.cmp"),
|
||||
config = function(_, opts)
|
||||
local cmp = require("cmp")
|
||||
cmp.setup(opts)
|
||||
|
||||
-- insert () on function completion using autopairs
|
||||
cmp.event:on(
|
||||
'confirm_done',
|
||||
require('nvim-autopairs.completion.cmp').on_confirm_done()
|
||||
)
|
||||
end
|
||||
},
|
||||
},
|
||||
opts = require('config.lsp'),
|
||||
config = function(_, opts)
|
||||
local lsp_zero = require('lsp-zero')
|
||||
local lsp_config = require('lspconfig')
|
||||
local augroup = vim.api.nvim_create_augroup("Lsp", {})
|
||||
local map = require('utils.keys')
|
||||
-- insert () on function completion using autopairs
|
||||
cmp.event:on("confirm_done", require("nvim-autopairs.completion.cmp").on_confirm_done())
|
||||
end,
|
||||
},
|
||||
},
|
||||
opts = require("config.lsp"),
|
||||
config = function(_, opts)
|
||||
local lsp_zero = require("lsp-zero")
|
||||
local lsp_config = require("lspconfig")
|
||||
local augroup = vim.api.nvim_create_augroup("Lsp", {})
|
||||
local map = require("utils.keys")
|
||||
|
||||
lsp_zero.on_attach(function(_, bufnr)
|
||||
for _, v in ipairs(require('config.keymaps').lsp or {}) do
|
||||
map(v, { buffer = bufnr })
|
||||
end
|
||||
end)
|
||||
lsp_zero.on_attach(function(_, bufnr)
|
||||
for _, v in ipairs(require("config.keymaps").lsp or {}) do
|
||||
map(v, { buffer = bufnr })
|
||||
end
|
||||
end)
|
||||
|
||||
for name, server_opt in pairs(opts.servers) do
|
||||
local on_attach = function(_, bufnr)
|
||||
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
|
||||
for name, server_opt in pairs(opts.servers) do
|
||||
local on_attach = function(client, bufnr)
|
||||
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
|
||||
|
||||
if server_opt.on_save then
|
||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
group = augroup,
|
||||
buffer = bufnr,
|
||||
callback = server_opt.on_save,
|
||||
})
|
||||
end
|
||||
end
|
||||
if server_opt.on_save then
|
||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
group = augroup,
|
||||
buffer = bufnr,
|
||||
callback = server_opt.on_save,
|
||||
})
|
||||
end
|
||||
|
||||
server_opt = vim.tbl_deep_extend("force", {on_attach = on_attach}, server_opt or {})
|
||||
if (opts.document_highlight or false) and client.supports_method('textDocument/documentHighlight')then
|
||||
require("utils.lsp").document_highlight(bufnr)
|
||||
end
|
||||
end
|
||||
|
||||
lsp_config[name].setup(server_opt)
|
||||
end
|
||||
end,
|
||||
server_opt = vim.tbl_deep_extend("force", { on_attach = on_attach }, server_opt or {})
|
||||
|
||||
lsp_config[name].setup(server_opt)
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ local M = {}
|
|||
M.keymaps = function(opts)
|
||||
opts = type(opts) == 'string' and require(opts) or opts
|
||||
vim.g.mapleader = opts.leader
|
||||
|
||||
for _, v in ipairs(opts.global) do
|
||||
vim.keymap.set(unpack(v))
|
||||
end
|
||||
|
|
|
|||
45
nvim/lua/utils/cmd.lua
Normal file
45
nvim/lua/utils/cmd.lua
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
local luasnip = require('luasnip')
|
||||
local cmp = require('cmp')
|
||||
|
||||
local M = {}
|
||||
|
||||
function M.selectNext(opts)
|
||||
return cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item(opts or {})
|
||||
elseif luasnip.locally_jumpable(1) then
|
||||
luasnip.jump(1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, {"i", "s"})
|
||||
end
|
||||
|
||||
function M.selectPrev(opts)
|
||||
return cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item(opts or {})
|
||||
elseif luasnip.locally_jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, {"i", "s"})
|
||||
end
|
||||
|
||||
function M.confirm(opts)
|
||||
return cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
if luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
else
|
||||
cmp.confirm(opts or {})
|
||||
end
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
return M
|
||||
22
nvim/lua/utils/lsp.lua
Normal file
22
nvim/lua/utils/lsp.lua
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
local M = {}
|
||||
|
||||
function M.document_highlight(bufnr)
|
||||
local group = vim.api.nvim_create_augroup('lsp_document_highlight', { clear = false })
|
||||
vim.api.nvim_clear_autocmds({
|
||||
buffer = bufnr,
|
||||
group = group,
|
||||
})
|
||||
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
|
||||
group = group,
|
||||
buffer = bufnr,
|
||||
callback = vim.lsp.buf.document_highlight,
|
||||
})
|
||||
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
|
||||
group = group,
|
||||
buffer = bufnr,
|
||||
callback = vim.lsp.buf.clear_references,
|
||||
})
|
||||
end
|
||||
|
||||
return M
|
||||
Loading…
Add table
Add a link
Reference in a new issue