Compare commits

...

7 Commits

25 changed files with 1077 additions and 595 deletions

View File

@@ -0,0 +1,24 @@
---
name: Pre-commit autoupdate
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
auto-update:
runs-on: self-hosted
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4.5.0
- run: pip install pre-commit
- run: pre-commit autoupdate
- uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: update/pre-commit-hooks
title: "chore: update pre-commit hooks"
commit-message: "chore: update pre-commit hooks"
body: Update versions of pre-commit hooks to latest version.

2
.gitignore vendored
View File

@@ -26,4 +26,6 @@ config/iterm2/AppSupport
config/gnupg/S.*
config/gnupg/s
config/gnupg/private-keys-v1.d
config/nvim/spell/*
!config/nvim/spell/.gitkeep

View File

@@ -2,8 +2,8 @@ column_width = 120
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 2
quote_style = "AutoPreferDouble"
call_parentheses = "Always"
quote_style = "AutoPreferSingle"
call_parentheses = "None"
collapse_simple_statement = "Always"
[sort_requires]

View File

@@ -27,3 +27,4 @@ bats 1.11.0
gitleaks 8.18.4
delta 0.18.1
sops 3.9.0
eza system

View File

@@ -204,8 +204,6 @@ cask "font-open-sans"
cask "font-roboto"
cask "font-source-code-pro"
cask "font-source-code-pro-for-powerline"
cask "font-source-sans-pro"
cask "font-source-serif-pro"
# GIT client
cask "fork"
# HTTP and GraphQL Client

View File

@@ -9,7 +9,7 @@ insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
max_line_length = 100
max_line_length = 120
trim_trailing_whitespace = true
[*.md]

3
config/nvim/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
spell/*
!spell/.gitkeep

View File

@@ -1,7 +1,11 @@
column_width = 160
column_width = 80
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 2
quote_style = "AutoPreferSingle"
call_parentheses = "None"
collapse_simple_statement = "Always"
[sort_requires]
enabled = true

View File

@@ -7,7 +7,14 @@
local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim'
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
local out = vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
local out = vim.fn.system {
'git',
'clone',
'--filter=blob:none',
'--branch=stable',
lazyrepo,
lazypath,
}
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ 'Failed to clone lazy.nvim:\n', 'ErrorMsg' },
@@ -21,7 +28,10 @@ end
vim.opt.rtp:prepend(lazypath)
-- ── Add ~/.local/bin to the PATH ────────────────────────────────────
vim.fn.setenv('PATH', vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH')
vim.fn.setenv(
'PATH',
vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH'
)
require 'options'
require 'autogroups'

View File

@@ -7,28 +7,48 @@ local autocmd = vim.api.nvim_create_autocmd -- Create autocommand
-- ── Highlight on yank ───────────────────────────────────────────────
-- See `:help vim.highlight.on_yank()`
local highlight_group = augroup('YankHighlight', { clear = true })
autocmd('TextYankPost', {
callback = function()
vim.highlight.on_yank()
end,
group = highlight_group,
callback = function() vim.highlight.on_yank() end,
group = augroup('YankHighlight', { clear = true }),
pattern = '*',
})
-- ── Windows to close with "q" ───────────────────────────────────────
autocmd('FileType', {
callback = function()
vim.keymap.set('n', '<esc>', ':bd<CR>', { buffer = true, silent = true })
end,
group = augroup('close_with_q', { clear = true }),
pattern = {
'PlenaryTestPopup',
'checkhealth',
'dbout',
'gitsigns.blame',
'grug-far',
'help',
'startuptime',
'qf',
'lspinfo',
'man',
'checkhealth',
'neotest-output',
'neotest-output-panel',
'neotest-summary',
'notify',
'qf',
'spectre_panel',
'startuptime',
'tsplayground',
},
callback = function(event)
vim.bo[event.buf].buflisted = false
vim.keymap.set('n', 'q', '<cmd>close<cr>', {
buffer = event.buf,
silent = true,
desc = 'Quit buffer',
})
end,
})
-- ── make it easier to close man-files when opened inline ────────────
autocmd('FileType', {
group = augroup('man_unlisted', { clear = true }),
pattern = { 'man' },
callback = function(event) vim.bo[event.buf].buflisted = false end,
})
-- vim: ts=2 sts=2 sw=2 et

View File

@@ -33,7 +33,8 @@ vim.opt.showmode = false
-- Schedule the setting after `UiEnter` because it can increase startup-time.
-- See `:help 'clipboard'`
vim.schedule(function()
vim.opt.clipboard = 'unnamedplus'
local c = vim.env.SSH_TTY and '' or 'unnamedplus'
vim.opt.clipboard = c
end)
vim.opt.breakindent = true -- Enable break indent
@@ -94,7 +95,8 @@ vim.g.loaded_ruby_provider = 0
-- kevinhwang91/nvim-ufo settings
vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]]
vim.o.foldcolumn = '1' -- '0' is not bad
vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value
-- Using ufo provider need a large value, feel free to decrease the value
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
@@ -103,9 +105,27 @@ vim.o.winwidth = 15
vim.o.winminwidth = 10
vim.o.equalalways = false
-- folke/noice.nvim settings
vim.g.noice_ignored_filetypes = {
'fugitiveblame',
'fugitive',
'gitcommit',
'noice',
}
-- ── Deal with word wrap ───────────────────────────────────────────────────────
local m = vim.api.nvim_set_keymap
m('n', 'k', "v:count == 0 ? 'gk' : 'k'", { desc = 'Move up', noremap = true, expr = true })
m('n', 'j', "v:count == 0 ? 'gj' : 'j'", { desc = 'Move down', noremap = true, expr = true })
m(
'n',
'k',
"v:count == 0 ? 'gk' : 'k'",
{ desc = 'Move up', noremap = true, expr = true }
)
m(
'n',
'j',
"v:count == 0 ? 'gj' : 'j'",
{ desc = 'Move down', noremap = true, expr = true }
)
-- vim: ts=2 sts=2 sw=2 et

View File

@@ -1,36 +0,0 @@
-- Autoformat
-- https://github.com/stevearc/conform.nvim
return {
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
keys = {
{
'<leader>cf',
'<cmd>lua require("conform").format({ async = true, lsp_fallback = true })<cr>',
mode = '',
desc = 'Format buffer',
},
},
opts = {
notify_on_error = false,
format_on_save = function(bufnr)
-- Disable "format_on_save lsp_fallback" for languages that don't
-- have a well standardized coding style. You can add additional
-- languages here or re-enable it for the disabled ones.
local disable_filetypes = { c = true, cpp = true }
return {
timeout_ms = 500,
lsp_fallback = not disable_filetypes[vim.bo[bufnr].filetype],
}
end,
formatters_by_ft = {
lua = { 'stylua' },
-- Conform can also run multiple formatters sequentially
-- python = { "isort", "black" },
--
-- You can use 'stop_after_first' to run the first available formatter from the list
javascript = { 'prettierd', 'prettier', stop_after_first = true },
},
},
}

View File

@@ -4,9 +4,11 @@ return {
{
'hrsh7th/nvim-cmp',
lazy = false,
version = false, -- Use the latest version of the plugin
event = 'InsertEnter',
dependencies = {
'hrsh7th/cmp-nvim-lsp',
-- ── LuaSnip Dependencies ────────────────────────────────────────────
-- Snippet Engine for Neovim written in Lua.
-- https://github.com/L3MON4D3/LuaSnip
@@ -14,14 +16,17 @@ return {
-- luasnip completion source for nvim-cmp
-- https://github.com/saadparwaiz1/cmp_luasnip
{ 'saadparwaiz1/cmp_luasnip' },
-- ── Adds other completion capabilities. ─────────────────────────────
-- ── nvim-cmp does not ship with all sources by default.
-- ── They are split into multiple repos for maintenance purposes.
{ 'hrsh7th/cmp-nvim-lsp' },
{ 'hrsh7th/cmp-buffer' },
{ 'hrsh7th/cmp-path' },
-- cmp import and use all environment variables from .env.* and system
-- https://github.com/SergioRibera/cmp-dotenv
{ 'SergioRibera/cmp-dotenv' },
-- ── Other deps ──────────────────────────────────────────────────────
-- vscode-like pictograms for neovim lsp completion items
-- https://github.com/onsails/lspkind.nvim
@@ -39,8 +44,8 @@ return {
cmd = 'Copilot',
build = ':Copilot setup',
event = { 'InsertEnter', 'LspAttach' },
fix_pairs = true,
opts = {
fix_pairs = true,
suggestion = { enabled = false },
panel = { enabled = false },
filetypes = {
@@ -50,9 +55,7 @@ return {
},
},
},
config = function()
require('copilot_cmp').setup()
end,
config = function() require('copilot_cmp').setup() end,
},
},
config = function()
@@ -66,36 +69,36 @@ return {
if vim.api.nvim_get_option_value('buftype', {}) == 'prompt' then
return false
end
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_text(0, line - 1, 0, line - 1, col, {})[1]:match '^%s*$' == nil
local line, col = table.unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0
and vim.api
.nvim_buf_get_text(0, line - 1, 0, line - 1, col, {})[1]
:match '^%s*$'
== nil
end
cmp.setup {
formatting = {
format = lspkind.cmp_format {
mode = 'symbol',
max_width = function()
return math.floor(0.45 * vim.o.columns)
end,
max_width = function() return math.floor(0.45 * vim.o.columns) end,
show_labelDetails = true,
symbol_map = {
Copilot = '',
Text = '',
Constructor = '',
},
},
},
view = {
width = function(_, _)
return math.min(80, vim.o.columns)
end,
width = function(_, _) return math.min(80, vim.o.columns) end,
entries = {
name = 'custom',
selection_order = 'near_cursor',
},
},
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
expand = function(args) luasnip.lsp_expand(args.body) end,
},
mapping = cmp.mapping.preset.insert {
['<C-d>'] = cmp.mapping.scroll_docs(-4),

View File

@@ -3,28 +3,57 @@ return {
-- A better annotation generator.
-- Supports multiple languages and annotation conventions.
-- https://github.com/danymat/neogen
{ 'danymat/neogen', version = '*', opts = { enabled = true, snippet_engine = 'luasnip' } },
{
'danymat/neogen',
version = '*',
opts = { enabled = true, snippet_engine = 'luasnip' },
},
-- The Refactoring library based off the Refactoring book by Martin Fowler
-- https://github.com/ThePrimeagen/refactoring.nvim
{ 'ThePrimeagen/refactoring.nvim', dependencies = { 'nvim-lua/plenary.nvim', 'nvim-treesitter/nvim-treesitter' }, opts = {} },
{
'ThePrimeagen/refactoring.nvim',
version = '*',
dependencies = { 'nvim-lua/plenary.nvim', 'nvim-treesitter/nvim-treesitter' },
opts = {},
},
-- All the npm/yarn/pnpm commands I don't want to type
-- https://github.com/vuki656/package-info.nvim
{ 'vuki656/package-info.nvim', dependencies = { 'MunifTanjim/nui.nvim' } },
{
'vuki656/package-info.nvim',
version = '*',
dependencies = { 'MunifTanjim/nui.nvim' },
opts = {},
},
-- Add/change/delete surrounding delimiter pairs with ease. Written with ❤️ in Lua.
-- https://github.com/kylechui/nvim-surround
{ 'kylechui/nvim-surround', version = '*', event = 'VeryLazy' },
{
'kylechui/nvim-surround',
version = '*',
event = 'VeryLazy',
opts = {},
},
-- Highlight, list and search todo comments in your projects
-- https://github.com/folke/todo-comments.nvim
{ 'folke/todo-comments.nvim', dependencies = { 'nvim-lua/plenary.nvim' }, opts = {} },
{
'folke/todo-comments.nvim',
version = '*',
dependencies = { 'nvim-lua/plenary.nvim' },
opts = {},
},
-- Commenting
-- "gc" to comment visual regions/lines
-- https://github.com/numToStr/Comment.nvim
{ 'numToStr/Comment.nvim', event = { 'BufRead', 'BufNewFile' }, opts = {} },
{
'numToStr/Comment.nvim',
version = '*',
event = { 'BufRead', 'BufNewFile' },
opts = {},
},
-- Detect tabstop and shiftwidth automatically
-- https://github.com/tpope/vim-sleuth

View File

@@ -1,62 +1,107 @@
-- Quickstart configs for Nvim LSP
-- Quick start configs for Nvim LSP
-- https://github.com/neovim/nvim-lspconfig
return {
{
'neovim/nvim-lspconfig',
lazy = false,
dependencies = {
-- Garbage collector that stops inactive LSP clients to free RAM
-- https://github.com/Zeioth/garbage-day.nvim
{
'zeioth/garbage-day.nvim',
dependencies = 'neovim/nvim-lspconfig',
event = 'VeryLazy',
opts = {},
},
-- improve neovim lsp experience
-- https://github.com/nvimdev/lspsaga.nvim
{
'nvimdev/lspsaga.nvim',
dependencies = {
'nvim-treesitter/nvim-treesitter', -- optional
'nvim-tree/nvim-web-devicons', -- optional
},
opts = {
code_action = {
show_server_name = true,
},
diagnostic = {
keys = {
quit = { 'q', '<ESC>' },
},
},
},
},
-- ── Mason and LSPConfig integration ─────────────────────────────────
-- Automatically install LSPs to stdpath for neovim
-- Portable package manager for Neovim that runs everywhere Neovim runs.
-- Easily install and manage LSP servers, DAP servers, linters,
-- and formatters.
-- Easily install and manage LSP servers, DAP servers, linters, and formatters.
-- https://github.com/williamboman/mason.nvim
{ 'williamboman/mason.nvim' },
{ 'williamboman/mason-lspconfig.nvim' },
{ 'WhoIsSethDaniel/mason-tool-installer.nvim' },
-- ── Linting ─────────────────────────────────────────────────────────
-- An asynchronous linter plugin for Neovim complementary to the
-- built-in Language Server Protocol support.
-- https://github.com/mfussenegger/nvim-lint
{
'mfussenegger/nvim-lint',
event = { 'BufReadPre', 'BufNewFile' },
'williamboman/mason.nvim',
cmd = 'Mason',
run = ':MasonUpdate',
},
-- Extension to mason.nvim that makes it easier to use lspconfig with mason.nvim.
-- https://github.com/williamboman/mason-lspconfig.nvim
{ 'williamboman/mason-lspconfig.nvim' },
-- ── Formatting ──────────────────────────────────────────────────────
-- Lightweight yet powerful formatter plugin for Neovim
-- https://github.com/stevearc/conform.nvim
{
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
config = function()
-- Select first conform formatter that is available
---@param bufnr integer
---@param ... string
---@return string
local function first(bufnr, ...)
local conform = require 'conform'
for i = 1, select('#', ...) do
local formatter = select(i, ...)
if conform.get_formatter_info(formatter, bufnr).available then
return formatter
end
end
return select(1, ...)
end
require('conform').setup {
-- Enable or disable logging
notify_on_error = true,
-- Set the default formatter for all filetypes
default_formatter = 'injected',
-- Set the default formatter for all filetypes
default_formatter_opts = {
lsp_format = 'fallback',
-- Set the default formatter for all filetypes
-- formatter = 'injected',
-- Set the default formatter for all filetypes
-- formatter_opts = {},
},
formatters_by_ft = {
markdown = function(bufnr)
return { first(bufnr, 'prettierd', 'prettier'), 'injected' }
end,
javascript = function(bufnr)
return { first(bufnr, 'prettier', 'eslint'), 'injected' }
end,
lua = { 'stylua' },
-- Conform will run multiple formatters sequentially
-- python = { 'isort', 'black', lsp_format = 'fallback' },
-- You can customize some of the format options for the filetype (:help conform.format)
-- rust = { 'rustfmt', lsp_format = 'fallback' },
},
format_on_save = function(bufnr)
-- Disable autoformat on certain filetypes
local ignore_filetypes = {
'c',
'cpp',
'sql',
'java',
}
if vim.tbl_contains(ignore_filetypes, vim.bo[bufnr].filetype) then
return
end
-- Disable with a global or buffer-local variable
if
vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat
then
return
end
-- Disable autoformat for files in a certain path
local bufname = vim.api.nvim_buf_get_name(bufnr)
if bufname:match '/node_modules/' then return end
if bufname:match '/vendor/' then return end
if bufname:match '/dist/' then return end
if bufname:match '/build/' then return end
return { timeout_ms = 500, lsp_format = 'fallback' }
end,
}
end,
init = function()
-- If you want the formatexpr, here is the place to set it
vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
end,
},
-- Extension to mason.nvim that makes it
-- easier to use nvim-lint with mason.nvim
-- https://github.com/rshkarin/mason-nvim-lint
{ 'rshkarin/mason-nvim-lint' },
-- ── Misc ────────────────────────────────────────────────────────────
-- vscode-like pictograms for neovim lsp completion items
@@ -82,54 +127,39 @@ return {
---@output nil
local on_attach = function(_, bufnr)
-- Create a command `:Format` local to the LSP buffer
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
if vim.lsp.buf.format then
vim.lsp.buf.format()
elseif vim.lsp.buf.formatting then
vim.lsp.buf.formatting()
else
require('conform').format { async = true, lsp_fallback = true }
vim.api.nvim_create_user_command('Format', function(args)
local range = nil
if args.count ~= -1 then
local end_line = vim.api.nvim_buf_get_lines(
bufnr,
args.line2 - 1,
args.line2,
true
)[1]
range = {
start = { args.line1, 0 },
['end'] = { args.line2, end_line:len() },
}
end
end, { desc = 'Format current buffer with LSP' })
require('conform').format {
async = true,
lsp_format = 'fallback',
range = range,
}
end, { range = true, desc = 'Format current buffer with LSP' })
end
-- ── Setup mason so it can manage external tooling ───────────────────
require('mason').setup()
-- ── Enable the following language servers ───────────────────────────
-- :help lspconfig-all for all pre-configured LSPs
local servers = {
ast_grep = {},
actionlint = {}, -- GitHub Actions
ansiblels = {}, -- Ansible
bashls = {}, -- Bash
-- csharp_ls = {}, -- C#, requires dotnet executable
css_variables = {}, -- CSS
cssls = {}, -- CSS
docker_compose_language_service = {}, -- Docker compose
dockerls = {}, -- Docker
eslint = {}, -- ESLint
gitlab_ci_ls = {}, -- GitLab CI
gopls = {}, -- Go
html = {}, -- HTML
intelephense = {}, -- PHP
pest_ls = {}, -- Pest (PHP)
phpactor = {}, -- PHP
psalm = {}, -- PHP
pyright = {}, -- Python
semgrep = {}, -- Security
shellcheck = {}, -- Shell scripts
shfmt = {}, -- Shell scripts formatting
stylelint_lsp = {}, -- Stylelint for S/CSS
stylua = {}, -- Used to format Lua code
tailwindcss = {}, -- Tailwind CSS
terraformls = {}, -- Terraform
tflint = {}, -- Terraform
ts_ls = {}, -- TypeScript/JS
typos_lsp = {}, -- Better writing
ts_ls = {}, -- TypeScript
volar = {}, -- Vue
yamlls = {}, -- YAML
lua_ls = {
settings = {
@@ -184,105 +214,218 @@ return {
-- Mason servers should be it's own variable for mason-nvim-lint
-- See: https://mason-registry.dev/registry/list
local mason_servers = {
'actionlint',
'ansible-language-server',
'ansible-lint',
'bash-language-server',
'blade-formatter',
'clang-format',
'codespell',
'commitlint',
'diagnostic-languageserver',
'docker-compose-language-service',
'dockerfile-language-server',
'editorconfig-checker',
'fixjson',
'flake8',
'html-lsp',
'jq',
'jsonlint',
'lua-language-server',
'luacheck',
'php-cs-fixer',
'phpcbf',
'phpcs',
'phpmd',
'semgrep',
'prettier',
'shellcheck',
'shfmt',
'stylelint',
'stylua',
'vim-language-server',
'vue-language-server',
'yamllint',
}
local ensure_installed = vim.tbl_keys(servers or {})
vim.list_extend(ensure_installed, mason_servers)
-- ── Automagically install tools ─────────────────────────────────────
require('mason-tool-installer').setup {
-- ── Setup mason so it can manage external tooling ───────────────────
require('mason').setup {
ensure_installed = ensure_installed,
auto_update = true,
}
-- ── Ensure the servers above are installed ──────────────────────────
require('mason-lspconfig').setup {
automatic_installation = true,
ensure_installed = servers,
}
-- nvim-cmp supports additional completion capabilities
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
-- Tell the server the capability of foldingRange,
-- Neovim hasn't added foldingRange to default capabilities, users must add it manually
capabilities.textDocument.foldingRange = {
dynamicRegistration = true,
lineFoldingOnly = true,
}
require('mason-lspconfig').setup_handlers {
capabilities.textDocument.completion.completionItem.snippetSupport = true
capabilities.textDocument.completion.completionItem.resolveSupport = {
properties = {
'documentation',
'detail',
'additionalTextEdits',
},
}
local lspconfig_handlers = {
-- The first entry (without a key) will be the default handler
-- and will be called for each installed server that doesn't have
-- a dedicated handler.
function(server_name) -- default handler (optional)
require('lspconfig')[server_name].setup {}
end,
-- Next, you can provide a dedicated handler for specific servers.
-- For example, a handler override for the `rust_analyzer`:
-- ['rust_analyzer'] = function()
-- require('rust-tools').setup {}
-- end,
}
for _, lsp in ipairs(servers) do
require('lspconfig')[lsp].setup {
on_attach = on_attach,
capabilities = capabilities,
}
end
require('lspconfig').lua_ls.setup {
on_attach = on_attach,
capabilities = capabilities,
settings = {
Lua = servers.lua_ls.settings.Lua,
},
}
vim.api.nvim_create_autocmd('FileType', {
pattern = 'sh',
callback = function()
vim.lsp.start {
name = 'bash-language-server',
cmd = { 'bash-language-server', 'start' },
require('lspconfig')[server_name].setup {
on_attach = on_attach,
capabilities = capabilities,
}
end,
})
-- ── Setup linting ───────────────────────────────────────────────────
require('mason-nvim-lint').setup {
ensure_installed = mason_servers or {},
quiet_mode = true,
}
local lint = require 'lint'
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
group = lint_augroup,
callback = function()
lint.try_lint()
-- Next, you can provide targeted overrides for specific servers.
['lua_ls'] = function()
require('lspconfig')['lua_ls'].setup { settings = servers.lua_ls }
end,
})
['jsonls'] = function()
require('lspconfig')['jsonls'].setup { settings = servers.jsonls }
end,
}
require('mason-lspconfig').setup {
ensure_installed = vim.tbl_keys(servers or {}),
automatic_installation = true,
handlers = lspconfig_handlers,
}
end,
},
-- Garbage collector that stops inactive LSP clients to free RAM
-- https://github.com/Zeioth/garbage-day.nvim
{
'zeioth/garbage-day.nvim',
dependencies = 'neovim/nvim-lspconfig',
event = 'VeryLazy',
opts = {},
},
-- improve neovim lsp experience
-- https://github.com/nvimdev/lspsaga.nvim
-- https://nvimdev.github.io/lspsaga/
{
'nvimdev/lspsaga.nvim',
event = 'LspAttach',
dependencies = {
'nvim-treesitter/nvim-treesitter', -- optional
'nvim-tree/nvim-web-devicons', -- optional
},
opts = {
code_action = {
show_server_name = true,
},
diagnostic = {
keys = {
quit = { 'q', '<ESC>' },
},
},
},
},
-- Not UFO in the sky, but an ultra fold in Neovim.
-- https://github.com/kevinhwang91/nvim-ufo/
{
'kevinhwang91/nvim-ufo',
version = '*',
dependencies = {
{ 'neovim/nvim-lspconfig' },
{ 'kevinhwang91/promise-async' },
{ 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' },
{
-- Status column plugin that provides a configurable
-- 'statuscolumn' and click handlers.
-- https://github.com/luukvbaal/statuscol.nvim
'luukvbaal/statuscol.nvim',
config = function()
local builtin = require 'statuscol.builtin'
require('statuscol').setup {
relculright = true,
segments = {
{
text = { builtin.foldfunc },
click = 'v:lua.ScFa',
},
{
sign = {
namespace = { 'diagnostic/signs' },
maxwidth = 2,
-- auto = true,
},
click = 'v:lua.ScSa',
},
{
text = { builtin.lnumfunc, ' ' },
click = 'v:lua.ScLa',
},
},
}
end,
},
},
opts = {
open_fold_hl_timeout = 150,
close_fold_kinds_for_ft = { 'imports', 'comment' },
preview = {
win_config = {
border = { '', '', '', '', '', '', '', '' },
winhighlight = 'Normal:Folded',
winblend = 0,
},
mappings = {
scrollU = '<C-u>',
scrollD = '<C-d>',
jumpTop = '[',
jumpBot = ']',
},
},
provider_selector = function(_, _, _) -- bufnr, filetype, buftype
return { 'treesitter', 'indent' }
end,
-- fold_virt_text_handler
--
-- This handler is called when the fold text is too long to fit in the window.
-- It is expected to truncate the text and return a new list of virtual text.
--
---@param virtText table The current virtual text list.
---@param lnum number The line number of the first line in the fold.
---@param endLnum number The line number of the last line in the fold.
---@param width number The width of the window.
---@param truncate function Truncate function
---@return table
fold_virt_text_handler = function(
virtText,
lnum,
endLnum,
width,
truncate
)
local newVirtText = {}
local suffix = (' 󰁂 %d '):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, { chunkText, hlGroup })
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth)
end
break
end
curWidth = curWidth + chunkWidth
end
table.insert(newVirtText, { suffix, 'MoreMsg' })
return newVirtText
end,
},
},
}

View File

@@ -6,33 +6,67 @@ return {
'kyazdani42/nvim-web-devicons',
'folke/noice.nvim',
},
opts = {
options = {
icons_enabled = true,
component_separators = '|',
section_separators = '',
},
-- Sections
-- +-------------------------------------------------+
-- | A | B | C X | Y | Z |
-- +-------------------------------------------------+
sections = {
lualine_b = {
{
'buffers',
},
},
config = function()
local function diff_source()
local gitsigns = vim.b.gitsigns_status_dict
if gitsigns then
return {
added = gitsigns.added,
modified = gitsigns.changed,
removed = gitsigns.removed,
}
end
end
lualine_x = {
{
require('noice').api.statusline.mode.get,
cond = require('noice').api.statusline.mode.has,
require('lualine').setup {
options = {
icons_enabled = true,
component_separators = '|',
section_separators = '',
},
-- Sections
-- +-------------------------------------------------+
-- | A | B | C X | Y | Z |
-- +-------------------------------------------------+
sections = {
lualine_a = {
'mode',
},
{
require('noice').api.status.command.get,
cond = require('noice').api.status.command.has,
lualine_b = {
{ 'b:gitsigns_head', icon = '' },
{ 'diff', source = diff_source },
'diagnostics',
},
lualine_c = {
'buffers',
-- 'filename',
},
lualine_x = {
-- 'fileformat',
'filetype',
},
lualine_y = {
-- 'progress'
},
lualine_z = {
{
require('noice').api.statusline.mode.get,
cond = require('noice').api.statusline.mode.has,
},
{
require('noice').api.status.command.get,
cond = require('noice').api.status.command.has,
},
},
},
},
},
inactive_sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { 'filename' },
lualine_x = { 'location' },
lualine_y = {},
lualine_z = {},
},
}
end,
}

View File

@@ -2,13 +2,6 @@
-- for messages, cmdline and the popupmenu.
-- https://github.com/folke/noice.nvim
vim.g.noice_ignored_filetypes = {
'fugitiveblame',
'fugitive',
'gitcommit',
'noice',
}
return {
'folke/noice.nvim',
lazy = false,

View File

@@ -41,12 +41,18 @@ return {
:find()
end
vim.keymap.set('n', '<leader>hw', function()
toggle_telescope(harpoon:list())
end, { desc = 'Open harpoon window with telescope' })
vim.keymap.set('n', '<leader>ht', function()
harpoon.ui:toggle_quick_menu(harpoon:list())
end, { desc = 'Open Harpoon Quick menu' })
vim.keymap.set(
'n',
'<leader>hw',
function() toggle_telescope(harpoon:list()) end,
{ desc = 'Open harpoon window with telescope' }
)
vim.keymap.set(
'n',
'<leader>ht',
function() harpoon.ui:toggle_quick_menu(harpoon:list()) end,
{ desc = 'Open Harpoon Quick menu' }
)
end,
},
-- A Telescope picker to quickly access configurations
@@ -86,6 +92,12 @@ return {
},
},
},
extensions = {
lazy_plugins = {
-- Must be a valid path to the file containing the lazy spec and setup() call.
lazy_config = vim.fn.stdpath 'config' .. '/init.lua',
},
},
}
-- Load extensions

View File

@@ -2,6 +2,7 @@
-- https://github.com/nvim-treesitter/nvim-treesitter
return {
'nvim-treesitter/nvim-treesitter',
version = false, -- last release is way too old and doesn't work on Windows
build = function()
pcall(require('nvim-treesitter.install').update { with_sync = true })
end,

View File

@@ -1,77 +0,0 @@
-- Not UFO in the sky, but an ultra fold in Neovim.
-- https://github.com/kevinhwang91/nvim-ufo/
return {
{
'kevinhwang91/nvim-ufo',
version = '*',
dependencies = {
{ 'kevinhwang91/promise-async' },
{ 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' },
{
-- Status column plugin that provides a configurable
-- 'statuscolumn' and click handlers.
-- https://github.com/luukvbaal/statuscol.nvim
'luukvbaal/statuscol.nvim',
opts = {},
},
},
opts = {
open_fold_hl_timeout = 150,
close_fold_kinds_for_ft = { 'imports', 'comment' },
preview = {
win_config = {
border = { '', '', '', '', '', '', '', '' },
winhighlight = 'Normal:Folded',
winblend = 0,
},
mappings = {
scrollU = '<C-u>',
scrollD = '<C-d>',
jumpTop = '[',
jumpBot = ']',
},
},
provider_selector = function(_, _, _) -- bufnr, filetype, buftype
return { 'treesitter', 'indent' }
end,
-- fold_virt_text_handler
--
-- This handler is called when the fold text is too long to fit in the window.
-- It is expected to truncate the text and return a new list of virtual text.
--
---@param virtText table The current virtual text list.
---@param lnum number The line number of the first line in the fold.
---@param endLnum number The line number of the last line in the fold.
---@param width number The width of the window.
---@param truncate function Truncate function
---@return table
fold_virt_text_handler = function(virtText, lnum, endLnum, width, truncate)
local newVirtText = {}
local suffix = (' 󰁂 %d '):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, { chunkText, hlGroup })
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth)
end
break
end
curWidth = curWidth + chunkWidth
end
table.insert(newVirtText, { suffix, 'MoreMsg' })
return newVirtText
end,
},
},
}

View File

@@ -4,9 +4,7 @@ return {
{
'folke/tokyonight.nvim',
priority = 1000, -- Make sure to load this before all the other start plugins.
init = function()
vim.cmd.colorscheme(vim.g.colors_theme)
end,
init = function() vim.cmd.colorscheme(vim.g.colors_theme) end,
opts = {
transparent = true,
},
@@ -29,6 +27,64 @@ return {
},
},
-- vim dashboard
-- https://github.com/nvimdev/dashboard-nvim
{
'nvimdev/dashboard-nvim',
event = 'VimEnter',
config = function()
require('dashboard').setup {
theme = 'doom',
config = {
disable_move = true,
week_header = {
enable = true,
},
shortcut = {},
center = {
{
icon = '',
icon_hl = '@variable',
desc = 'Files',
group = 'Label',
action = 'Telescope find_files',
key = 'f',
},
{
icon = '',
desc = 'Marks',
group = 'DiagnosticHint',
action = 'Telescope harpoon marks',
key = 'a',
},
{
icon = '',
desc = 'TODO',
group = 'DiagnosticOptions',
action = 'TodoTelescope',
key = 't',
},
{
icon = '',
desc = 'Search',
group = 'Number',
action = 'Telescope live_grep',
key = 's',
},
{
icon = '󰊳 ',
desc = 'Lazy Update',
group = '@property',
action = 'Lazy update',
key = 'u',
},
},
},
}
end,
dependencies = { { 'nvim-tree/nvim-web-devicons' } },
},
-- Remove all background colors to make nvim transparent
-- https://github.com/xiyaowong/nvim-transparent
{ 'xiyaowong/nvim-transparent', opts = {} },
@@ -40,12 +96,27 @@ return {
-- Indent guides for Neovim
-- https://github.com/lukas-reineke/indent-blankline.nvim
{ 'lukas-reineke/indent-blankline.nvim', main = 'ibl', opts = {} },
{
'lukas-reineke/indent-blankline.nvim',
main = 'ibl',
config = function()
require('ibl').setup {
indent = {
char = '',
},
exclude = {
filetypes = { 'terminal', 'dashboard' },
buftypes = { 'dashboard' },
},
}
end,
},
-- Git integration for buffers
-- https://github.com/lewis6991/gitsigns.nvim
{
'lewis6991/gitsigns.nvim',
version = false,
lazy = false,
opts = {
signs = {
@@ -67,22 +138,14 @@ return {
-- Navigation
map('n', 'gn', function()
if vim.wo.diff then
return ']c'
end
vim.schedule(function()
gs.next_hunk()
end)
if vim.wo.diff then return ']c' end
vim.schedule(function() gs.next_hunk() end)
return '<Ignore>'
end, { expr = true })
map('n', 'gp', function()
if vim.wo.diff then
return '[c'
end
vim.schedule(function()
gs.prev_hunk()
end)
if vim.wo.diff then return '[c' end
vim.schedule(function() gs.prev_hunk() end)
return '<Ignore>'
end, { expr = true })
end,
@@ -142,7 +205,6 @@ return {
{
'bennypowers/nvim-regexplainer',
event = 'BufEnter',
lazy = false,
dependencies = {
'nvim-treesitter/nvim-treesitter',
'MunifTanjim/nui.nvim',
@@ -173,7 +235,10 @@ return {
-- https://github.com/MeanderingProgrammer/render-markdown.nvim
{
'MeanderingProgrammer/render-markdown.nvim',
dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' },
dependencies = {
'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons',
},
ft = 'markdown',
opts = {},
},

View File

@@ -27,87 +27,254 @@ return {
return require('which-key.extras').expand.buf()
end,
},
{ '<leader>bk', '<cmd>blast<cr>', desc = 'Buffer: Last', mode = 'n' },
{ '<leader>bj', '<cmd>bfirst<cr>', desc = 'Buffer: First', mode = 'n' },
{ '<leader>bh', '<cmd>bprev<cr>', desc = 'Buffer: Prev', mode = 'n' },
{ '<leader>bl', '<cmd>bnext<cr>', desc = 'Buffer: Next', mode = 'n' },
{ '<leader>bd', '<cmd>Bdelete<cr>', desc = 'Buffer: Delete', mode = 'n' },
{ '<leader>bw', '<cmd>Bwipeout<cr>', desc = 'Buffer: Wipeout', mode = 'n' },
{
{ '<leader>bk', '<cmd>blast<cr>', desc = 'Buffer: Last' },
{ '<leader>bj', '<cmd>bfirst<cr>', desc = 'Buffer: First' },
{ '<leader>bh', '<cmd>bprev<cr>', desc = 'Buffer: Prev' },
{ '<leader>bl', '<cmd>bnext<cr>', desc = 'Buffer: Next' },
{ '<leader>bd', '<cmd>Bdelete<cr>', desc = 'Buffer: Delete' },
{ '<leader>bw', '<cmd>Bwipeout<cr>', desc = 'Buffer: Wipeout' },
},
-- ── Code ────────────────────────────────────────────────────────────
{ '<leader>c', group = '[c] Code' },
{ '<leader>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', desc = 'LSP: Code Action' },
{ '<leader>cg', '<cmd>lua require("neogen").generate()<CR>', desc = 'Generate annotations' },
{
{
'<leader>ca',
'<cmd>lua vim.lsp.buf.code_action()<CR>',
desc = 'LSP: Code Action',
},
{
'<leader>cg',
'<cmd>lua require("neogen").generate()<CR>',
desc = 'Generate annotations',
},
},
-- ── Code: CommentBox ────────────────────────────────────────────────
{ '<leader>cb', group = 'CommentBox' },
{ '<leader>cbb', '<Cmd>CBccbox<CR>', desc = 'CommentBox: Box Title' },
{ '<leader>cbd', '<Cmd>CBd<CR>', desc = 'CommentBox: Remove a box' },
{ '<leader>cbl', '<Cmd>CBline<CR>', desc = 'CommentBox: Simple Line' },
{ '<leader>cbm', '<Cmd>CBllbox14<CR>', desc = 'CommentBox: Marked' },
{ '<leader>cbt', '<Cmd>CBllline<CR>', desc = 'CommentBox: Titled Line' },
{
{ '<leader>cb', group = 'CommentBox' },
{ '<leader>cbb', '<Cmd>CBccbox<CR>', desc = 'CommentBox: Box Title' },
{ '<leader>cbd', '<Cmd>CBd<CR>', desc = 'CommentBox: Remove a box' },
{ '<leader>cbl', '<Cmd>CBline<CR>', desc = 'CommentBox: Simple Line' },
{ '<leader>cbm', '<Cmd>CBllbox14<CR>', desc = 'CommentBox: Marked' },
{
'<leader>cbt',
'<Cmd>CBllline<CR>',
desc = 'CommentBox: Titled Line',
},
},
-- ── Code: package.json control ──────────────────────────────────────
-- See: lua/plugins/lazy.lua
{ '<leader>cn', group = 'package.json control' },
{ '<leader>cnd', '<cmd>lua require("package-info").delete()<cr>', desc = 'Delete package' },
{ '<leader>cni', '<cmd>lua require("package-info").install()<cr>', desc = 'Install package' },
{ '<leader>cns', '<cmd>lua require("package-info").show({ force = true })<cr>', desc = 'Show package info' },
{ '<leader>cnu', '<cmd>lua require("package-info").change_version()<cr>', desc = 'Change version' },
{
{
'<leader>cnd',
'<cmd>lua require("package-info").delete()<cr>',
desc = 'Delete package',
},
{
'<leader>cni',
'<cmd>lua require("package-info").install()<cr>',
desc = 'Install package',
},
{
'<leader>cns',
'<cmd>lua require("package-info").show({ force = true })<cr>',
desc = 'Show package info',
},
{
'<leader>cnu',
'<cmd>lua require("package-info").change_version()<cr>',
desc = 'Change version',
},
},
-- ── Code: Refactoring ───────────────────────────────────────────────
{ '<leader>cx', group = '[x] Refactoring' },
{
mode = { 'x' },
-- Extract function supports only visual mode
{ '<leader>cxe', "<cmd>lua require('refactoring').refactor('Extract Function')<cr>", desc = 'Extract Function' },
{ '<leader>cxf', "<cmd>lua require('refactoring').refactor('Extract Function To File')<cr>", desc = 'Extract Function to File' },
{
'<leader>cxe',
"<cmd>lua require('refactoring').refactor('Extract Function')<cr>",
desc = 'Extract Function',
},
{
'<leader>cxf',
"<cmd>lua require('refactoring').refactor('Extract Function To File')<cr>",
desc = 'Extract Function to File',
},
-- Extract variable supports only visual mode
{ '<leader>cxv', "<cmd>lua require('refactoring').refactor('Extract Variable')<cr>", desc = 'Extract Variable' },
{
'<leader>cxv',
"<cmd>lua require('refactoring').refactor('Extract Variable')<cr>",
desc = 'Extract Variable',
},
},
-- Inline func supports only normal
{ '<leader>cxi', "<cmd>lua require('refactoring').refactor('Inline Function')<cr>", desc = 'Inline Function' },
{
'<leader>cxif',
"<cmd>lua require('refactoring').refactor('Inline Function')<cr>",
desc = 'Inline Function',
},
-- Extract block supports only normal mode
{ '<leader>cxb', "<cmd>lua require('refactoring').refactor('Extract Block')<cr>", desc = 'Extract Block' },
{ '<leader>cxbf', "<cmd>lua require('refactoring').refactor('Extract Block To File')<cr>", desc = 'Extract Block to File' },
{
'<leader>cxb',
"<cmd>lua require('refactoring').refactor('Extract Block')<cr>",
desc = 'Extract Block',
},
{
'<leader>cxbf',
"<cmd>lua require('refactoring').refactor('Extract Block To File')<cr>",
desc = 'Extract Block to File',
},
{
mode = { 'n', 'x' },
-- Inline var supports both normal and visual mode
{ '<leader>cxi', "<cmd>lua require('refactoring').refactor('Inline Variable')<cr>", desc = 'Inline Variable' },
{
'<leader>cxiv',
"<cmd>lua require('refactoring').refactor('Inline Variable')<cr>",
desc = 'Inline Variable',
},
},
-- ── Code: LSPSaga ───────────────────────────────────────────────────
-- See: lua/plugins/lsp.lua
{ '<C-a>', '<cmd>Lspsaga term_toggle<cr>', desc = 'LSPSaga: Open Floaterm' },
{ '<leader>ca', '<cmd>Lspsaga code_action<cr>', desc = 'LSPSaga: Code Actions' },
{ '<leader>cci', '<cmd>Lspsaga incoming_calls<cr>', desc = 'LSPSaga: Incoming Calls' },
{ '<leader>cco', '<cmd>Lspsaga outgoing_calls<cr>', desc = 'LSPSaga: Outgoing Calls' },
{ '<leader>cd', '<cmd>Lspsaga show_line_diagnostics<cr>', desc = 'LSPSaga: Show Line Diagnostics' },
-- <leader>cf = Code Format, see: lua/plugins/autoformat.lua
{ '<leader>ci', '<cmd>Lspsaga implement<cr>', desc = 'LSPSaga: Implementations' },
{ '<leader>cl', '<cmd>Lspsaga show_cursor_diagnostics<cr>', desc = 'LSPSaga: Show Cursor Diagnostics' },
{ '<leader>cp', '<cmd>Lspsaga peek_definition<cr>', desc = 'LSPSaga: Peek Definition' },
{
'<C-a>',
'<cmd>Lspsaga term_toggle<cr>',
desc = 'LSPSaga: Open Floaterm',
},
{
'<leader>ca',
'<cmd>Lspsaga code_action<cr>',
desc = 'LSPSaga: Code Actions',
},
{
'<leader>cci',
'<cmd>Lspsaga incoming_calls<cr>',
desc = 'LSPSaga: Incoming Calls',
},
{
'<leader>cco',
'<cmd>Lspsaga outgoing_calls<cr>',
desc = 'LSPSaga: Outgoing Calls',
},
{
'<leader>cd',
'<cmd>Lspsaga show_line_diagnostics<cr>',
desc = 'LSPSaga: Show Line Diagnostics',
},
{
'<leader>cf',
'<cmd>lua require("conform").format({ async = true, lsp_fallback = true })<cr>',
mode = { 'n', 'v' },
desc = 'Format buffer',
},
{
'<leader>ci',
'<cmd>Lspsaga implement<cr>',
desc = 'LSPSaga: Implementations',
},
{
'<leader>cl',
'<cmd>Lspsaga show_cursor_diagnostics<cr>',
desc = 'LSPSaga: Show Cursor Diagnostics',
},
{
'<leader>cp',
'<cmd>Lspsaga peek_definition<cr>',
desc = 'LSPSaga: Peek Definition',
},
{ '<leader>cr', '<cmd>Lspsaga rename<cr>', desc = 'LSPSaga: Rename' },
{ '<leader>cR', '<cmd>Lspsaga rename ++project<cr>', desc = 'LSPSaga: Rename Project wide' },
{ '<leader>cs', '<cmd>Lspsaga signature_help<cr>', desc = 'LSPSaga: Signature Documentation' },
{ '<leader>ct', '<cmd>Lspsaga peek_type_definition<cr>', desc = 'LSPSaga: Peek Type Definition' },
{ '<leader>cu', '<cmd>Lspsaga preview_definition<cr>', desc = 'LSPSaga: Preview Definition' },
{ '<leader>cv', '<cmd>Lspsaga diagnostic_jump_prev<cr>', desc = 'LSPSaga: Diagnostic Jump Prev' },
{ '<leader>cw', '<cmd>Lspsaga diagnostic_jump_next<cr>', desc = 'LSPSaga: Diagnostic Jump Next' },
{
'<leader>cR',
'<cmd>Lspsaga rename ++project<cr>',
desc = 'LSPSaga: Rename Project wide',
},
{
'<leader>cs',
'<cmd>Lspsaga signature_help<cr>',
desc = 'LSPSaga: Signature Documentation',
},
{
'<leader>ct',
'<cmd>Lspsaga peek_type_definition<cr>',
desc = 'LSPSaga: Peek Type Definition',
},
{
'<leader>cu',
'<cmd>Lspsaga preview_definition<cr>',
desc = 'LSPSaga: Preview Definition',
},
{
'<leader>cv',
'<cmd>Lspsaga diagnostic_jump_prev<cr>',
desc = 'LSPSaga: Diagnostic Jump Prev',
},
{
'<leader>cw',
'<cmd>Lspsaga diagnostic_jump_next<cr>',
desc = 'LSPSaga: Diagnostic Jump Next',
},
-- ── DAP ─────────────────────────────────────────────────────────────
{ '<leader>d', group = '[d] DAP' },
{ '<leader>db', '<cmd>DapToggleBreakpoint', desc = 'DAP: Toggle Breakpoint' },
{ '<leader>dc', '<cmd>DapContinue', desc = 'DAP: Continue' },
{ '<leader>do', '<cmd>lua vim.diagnostic.open_float()<CR>', desc = 'Diagnostic: Open float' },
{ '<leader>dq', '<cmd>lua vim.diagnostic.setloclist()<CR>', desc = 'Diagnostic: Set loc list' },
{ '<leader>dr', "<cmd>lua require('dapui').open({reset = true})<CR>", desc = 'DAP: Reset' },
{ '<leader>ds', '<cmd>lua require("telescope.builtin").lsp_document_symbols()<CR>', desc = 'LSP: Document Symbols' },
{ '<leader>dt', '<cmd>DapUiToggle', desc = 'DAP: Toggle UI' },
{
{
'<leader>db',
'<cmd>DapToggleBreakpoint',
desc = 'DAP: Toggle Breakpoint',
},
{ '<leader>dc', '<cmd>DapContinue', desc = 'DAP: Continue' },
{
'<leader>do',
'<cmd>lua vim.diagnostic.open_float()<CR>',
desc = 'Diagnostic: Open float',
},
{
'<leader>dq',
'<cmd>lua vim.diagnostic.setloclist()<CR>',
desc = 'Diagnostic: Set loc list',
},
{
'<leader>dr',
"<cmd>lua require('dapui').open({reset = true})<CR>",
desc = 'DAP: Reset',
},
{
'<leader>ds',
'<cmd>lua require("telescope.builtin").lsp_document_symbols()<CR>',
desc = 'LSP: Document Symbols',
},
{ '<leader>dt', '<cmd>DapUiToggle', desc = 'DAP: Toggle UI' },
},
-- ── Harpoon ─────────────────────────────────────────────────────────
-- See: lua/plugins/telescope.lua
{ '<leader>h', group = '[h] Harpoon' },
{ '<leader>ha', '<cmd>lua require("harpoon"):list():add()<cr>', desc = 'harpoon file' },
{ '<leader>hn', '<cmd>lua require("harpoon"):list():next()<cr>', desc = 'harpoon to next file' },
{ '<leader>hp', '<cmd>lua require("harpoon"):list():prev()<cr>', desc = 'harpoon to previous file' },
{ '<leader>ht', "<cmd>lua require('harpoon.ui').toggle_quick_menu()<CR>", desc = 'DAP: Harpoon UI' },
{
{
'<leader>ha',
'<cmd>lua require("harpoon"):list():add()<cr>',
desc = 'harpoon file',
},
{
'<leader>hn',
'<cmd>lua require("harpoon"):list():next()<cr>',
desc = 'harpoon to next file',
},
{
'<leader>hp',
'<cmd>lua require("harpoon"):list():prev()<cr>',
desc = 'harpoon to previous file',
},
{
'<leader>ht',
"<cmd>lua require('harpoon.ui').toggle_quick_menu()<CR>",
desc = 'DAP: Harpoon UI',
},
},
-- ── LSP ─────────────────────────────────────────────────────────────
{ '<leader>l', group = '[l] LSP' },
@@ -115,63 +282,164 @@ return {
-- ── Quit ────────────────────────────────────────────────────────────
{ '<leader>q', group = '[q] Quit' },
{ '<leader>qf', '<cmd>q<CR>', desc = 'Quicker close split' },
{ '<leader>qq', '<cmd>wq!<CR>', desc = 'Quit with force saving' },
{ '<leader>qw', '<cmd>wq<CR>', desc = 'Write and quit' },
{
{ '<leader>qf', '<cmd>q<CR>', desc = 'Quicker close split' },
{ '<leader>qq', '<cmd>wq!<CR>', desc = 'Quit with force saving' },
{ '<leader>qw', '<cmd>wq<CR>', desc = 'Write and quit' },
},
-- ── Search ──────────────────────────────────────────────────────────
{ '<leader>s', group = '[s] Search' },
-- See: lua/plugins/telescope.lua
{ '<leader><space>', "<cmd>lua require('telescope.builtin').buffers()<cr>", desc = 'Find existing buffers' },
{ '<leader><tab>', "<cmd>lua require('telescope.builtin').commands()<CR>", desc = 'Telescope: Commands' },
{ '<leader>sd', "<cmd>lua require('telescope.builtin').diagnostics()<cr>", desc = 'Search Diagnostics' },
{ '<leader>sg', "<cmd>lua require('telescope.builtin').live_grep()<cr>", desc = 'Search by Grep' },
{ '<leader>sm', '<cmd>Telescope harpoon marks<CR>', desc = 'Harpoon Marks' },
{ '<leader>sn', "<cmd>lua require('telescope').extensions.notify.notify()<CR>", desc = 'Notify' },
{ '<leader>so', "<cmd>lua require('telescope.builtin').oldfiles()<cr>", desc = 'Find recently Opened files' },
{ '<leader>sp', "<cmd>lua require('telescope').extensions.lazy_plugins.lazy_plugins()<cr>", desc = 'Find neovim/lazy configs' },
{ '<leader>st', '<cmd>TodoTelescope<CR>', desc = 'Telescope: Todo' },
{ '<leader>sw', "<cmd>lua require('telescope.builtin').grep_string()<cr>", desc = 'Search current Word' },
{
'<leader><space>',
"<cmd>lua require('telescope.builtin').buffers()<cr>",
desc = 'Find existing buffers',
},
{
'<leader><tab>',
"<cmd>lua require('telescope.builtin').commands()<CR>",
desc = 'Telescope: Commands',
},
{
'<leader>sd',
"<cmd>lua require('telescope.builtin').diagnostics()<cr>",
desc = 'Search Diagnostics',
},
{
'<leader>sg',
"<cmd>lua require('telescope.builtin').live_grep()<cr>",
desc = 'Search by Grep',
},
{
'<leader>sm',
'<cmd>Telescope harpoon marks<CR>',
desc = 'Harpoon Marks',
},
{
'<leader>sn',
"<cmd>lua require('telescope').extensions.notify.notify()<CR>",
desc = 'Show Notifications',
},
{
'<leader>so',
"<cmd>lua require('telescope.builtin').oldfiles()<cr>",
desc = 'Find recently Opened files',
},
{
'<leader>sp',
"<cmd>lua require('telescope').extensions.lazy_plugins.lazy_plugins()<cr>",
desc = 'Find neovim/lazy configs',
},
{ '<leader>st', '<cmd>TodoTelescope<CR>', desc = 'Telescope: Show Todo' },
{
'<leader>sw',
"<cmd>lua require('telescope.builtin').grep_string()<cr>",
desc = 'Search current Word',
},
-- ── Toggle ──────────────────────────────────────────────────────────
{ '<leader>t', group = '[t] Toggle' },
{ '<leader>tc', '<cmd>CloakToggle<cr>', desc = 'Toggle Cloak' },
{ '<leader>tn', '<cmd>Noice dismiss<CR>', desc = 'Noice dismiss' },
{ '<leader>ts', '<cmd>noh<CR>', desc = 'Toggle Search Highlighting' },
{ '<leader>tt', '<cmd>TransparentToggle<CR>', desc = 'Toggle Transparency' },
{ '<leader>tw', '<cmd>Twilight<cr>', desc = 'Toggle Twilight' },
{
{ '<leader>tc', '<cmd>CloakToggle<cr>', desc = 'Toggle Cloak' },
{ '<leader>tn', '<cmd>Noice dismiss<CR>', desc = 'Noice dismiss' },
{ '<leader>ts', '<cmd>noh<CR>', desc = 'Toggle Search Highlighting' },
{
'<leader>tt',
'<cmd>TransparentToggle<CR>',
desc = 'Toggle Transparency',
},
{ '<leader>tw', '<cmd>Twilight<cr>', desc = 'Toggle Twilight' },
},
-- ── Workspace ───────────────────────────────────────────────────────
{ '<leader>w', group = '[w] Workspace' },
{ '<leader>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', desc = 'LSP: Workspace Add Folder' },
{ '<leader>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', desc = 'LSP: Workspace List Folders' },
{ '<leader>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', desc = 'LSP: Workspace Remove Folder' },
{ '<leader>ws', '<cmd>lua require("telescope.builtin").lsp_dynamic_workspace_symbols()<CR>', desc = 'LSP: Workspace Symbols' },
{
{
'<leader>wa',
'<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>',
desc = 'LSP: Workspace Add Folder',
},
{
'<leader>wl',
'<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>',
desc = 'LSP: Workspace List Folders',
},
{
'<leader>wr',
'<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>',
desc = 'LSP: Workspace Remove Folder',
},
{
'<leader>ws',
'<cmd>lua require("telescope.builtin").lsp_dynamic_workspace_symbols()<CR>',
desc = 'LSP: Workspace Symbols',
},
},
-- ── Trouble ─────────────────────────────────────────────────────────
{ '<leader>x', group = '[x] Trouble' },
{ '<leader>xx', '<cmd>Trouble<cr>', desc = 'Toggle Trouble' },
{ '<leader>xw', '<cmd>Trouble workspace_diagnostics<cr>', desc = 'Toggle Workspace Diagnostics' },
{ '<leader>xd', '<cmd>Trouble document_diagnostics<cr>', desc = 'Toggle Document Diagnostics' },
{ '<leader>xl', '<cmd>Trouble loclist<cr>', desc = 'Toggle Loclist' },
{ '<leader>xq', '<cmd>Trouble quickfix<cr>', desc = 'Toggle Quickfix' },
{
{
'<leader>xx',
'<cmd>Trouble diagnostics<cr>',
desc = 'Toggle Trouble Diagnostics',
},
{
'<leader>xw',
'<cmd>Trouble workspace_diagnostics<cr>',
desc = 'Toggle Workspace Diagnostics',
},
{
'<leader>xd',
'<cmd>Trouble document_diagnostics<cr>',
desc = 'Toggle Document Diagnostics',
},
{ '<leader>xl', '<cmd>Trouble loclist<cr>', desc = 'Toggle Loclist' },
{ '<leader>xq', '<cmd>Trouble quickfix<cr>', desc = 'Toggle Quickfix' },
},
-- ── Help & Neoconf ──────────────────────────────────────────────────
{ '<leader>?', group = '[?] Help & neoconf' },
{ '<leader>?c', '<cmd>Neoconf<CR>', desc = 'Neoconf: Open' },
{ '<leader>?g', '<cmd>Neoconf global<CR>', desc = 'Neoconf: Global' },
{ '<leader>?l', '<cmd>Neoconf local<CR>', desc = 'Neoconf: Local' },
{ '<leader>?m', '<cmd>Neoconf lsp<CR>', desc = 'Neoconf: Show merged LSP config' },
{ '<leader>?s', '<cmd>Neoconf show<CR>', desc = 'Neoconf: Show merged config' },
{ '<leader>?w', '<cmd>lua require("which-key").show({global = false})<cr>', desc = 'Buffer Local Keymaps (which-key)' },
-- ── Help ────────────────────────────────────────────────────────────
{ '<leader>?', group = '[?] Help & Cheat sheets' },
{
{
'<leader>?w',
'<cmd>lua require("which-key").show({global = false})<cr>',
desc = 'Buffer Local Keymaps (which-key)',
},
},
-- ── Misc ────────────────────────────────────────────────────────────
{ '<leader>1', '<cmd>lua require("harpoon"):list():select(1)<cr>', desc = 'harpoon to file 1' },
{ '<leader>2', '<cmd>lua require("harpoon"):list():select(2)<cr>', desc = 'harpoon to file 2' },
{ '<leader>3', '<cmd>lua require("harpoon"):list():select(3)<cr>', desc = 'harpoon to file 3' },
{ '<leader>4', '<cmd>lua require("harpoon"):list():select(4)<cr>', desc = 'harpoon to file 4' },
{ '<leader>5', '<cmd>lua require("harpoon"):list():select(5)<cr>', desc = 'harpoon to file 5' },
{ '<leader>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', desc = 'LSP: Type Definition' },
{
'<leader>1',
'<cmd>lua require("harpoon"):list():select(1)<cr>',
desc = 'harpoon to file 1',
},
{
'<leader>2',
'<cmd>lua require("harpoon"):list():select(2)<cr>',
desc = 'harpoon to file 2',
},
{
'<leader>3',
'<cmd>lua require("harpoon"):list():select(3)<cr>',
desc = 'harpoon to file 3',
},
{
'<leader>4',
'<cmd>lua require("harpoon"):list():select(4)<cr>',
desc = 'harpoon to file 4',
},
{
'<leader>5',
'<cmd>lua require("harpoon"):list():select(5)<cr>',
desc = 'harpoon to file 5',
},
{
'<leader>D',
'<cmd>lua vim.lsp.buf.type_definition()<CR>',
desc = 'LSP: Type Definition',
},
{ '<leader>e', '<cmd>Neotree reveal<CR>', desc = 'NeoTree reveal' },
-- ╭─────────────────────────────────────────────────────────╮
@@ -180,16 +448,48 @@ return {
{ 'y', group = 'Yank & Surround' },
{ 'gp', group = 'Goto Preview' },
{ 'gpd', '<cmd>lua require("goto-preview").goto_preview_definition()<CR>' },
{ 'gpi', '<cmd>lua require("goto-preview").goto_preview_implementation()<CR>' },
{ 'gpP', '<cmd>lua require("goto-preview").close_all_windows()<CR>' },
{
{
'gpd',
'<cmd>lua require("goto-preview").goto_preview_definition()<CR>',
desc = 'Goto: Preview Definition',
},
{
'gpi',
'<cmd>lua require("goto-preview").goto_preview_implementation()<CR>',
desc = 'Goto: Preview Implementation',
},
{
'gpP',
'<cmd>lua require("goto-preview").close_all_windows()<CR>',
desc = 'Goto: Close All Preview Windows',
},
},
-- ── tmux navigation ─────────────────────────────────────────────────
{ '<c-h>', '<cmd><C-U>TmuxNavigateLeft<cr>', desc = 'tmux: Navigate Left' },
{ '<c-j>', '<cmd><C-U>TmuxNavigateDown<cr>', desc = 'tmux: Navigate Down' },
{ '<c-k>', '<cmd><C-U>TmuxNavigateUp<cr>', desc = 'tmux: Navigate Up' },
{ '<c-l>', '<cmd><C-U>TmuxNavigateRight<cr>', desc = 'tmux: Navigate Right' },
{ '<c-\\>', '<cmd><C-U>TmuxNavigatePrevious<cr>', desc = 'tmux: Navigate Previous' },
{
{
'<c-h>',
'<cmd><C-U>TmuxNavigateLeft<cr>',
desc = 'tmux: Navigate Left',
},
{
'<c-j>',
'<cmd><C-U>TmuxNavigateDown<cr>',
desc = 'tmux: Navigate Down',
},
{ '<c-k>', '<cmd><C-U>TmuxNavigateUp<cr>', desc = 'tmux: Navigate Up' },
{
'<c-l>',
'<cmd><C-U>TmuxNavigateRight<cr>',
desc = 'tmux: Navigate Right',
},
{
'<c-\\>',
'<cmd><C-U>TmuxNavigatePrevious<cr>',
desc = 'tmux: Navigate Previous',
},
},
-- ── Old habits ──────────────────────────────────────────────────────
{ '<C-s>', '<cmd>w<CR>', desc = 'Save file' },
@@ -204,23 +504,75 @@ return {
},
-- ── LSP ─────────────────────────────────────────────────────────────
{ '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', desc = 'LSP: Signature Documentation' },
{ 'K', '<cmd>Lspsaga hover_doc<cr>', desc = 'LSPSaga: Hover Documentation' },
{ 'dn', '<cmd>lua vim.diagnostic.goto_next()<CR>', desc = 'Diagnostic: Goto Next' },
{ 'dp', '<cmd>lua vim.diagnostic.goto_prev()<CR>', desc = 'Diagnostic: Goto Prev' },
{ 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', desc = 'LSP: Goto Declaration' },
{ 'gI', '<cmd>lua vim.lsp.buf.implementation()<CR>', desc = 'LSP: Goto Implementation' },
{ 'gR', '<cmd>Trouble lsp_references<cr>', desc = 'Toggle LSP References' },
{ 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', desc = 'LSP: Goto Definition' },
{ 'gr', '<cmd>lua require("telescope.builtin").lsp_references()<CR>', desc = 'LSP: Goto References' },
{
'<C-k>',
'<cmd>lua vim.lsp.buf.signature_help()<CR>',
desc = 'LSP: Signature Documentation',
},
{
'K',
'<cmd>Lspsaga hover_doc<cr>',
desc = 'LSPSaga: Hover Documentation',
},
{ 'd', group = 'Diagnostics' },
{
{
'dn',
'<cmd>lua vim.diagnostic.goto_next()<CR>',
desc = 'Diagnostic: Goto Next',
},
{
'dp',
'<cmd>lua vim.diagnostic.goto_prev()<CR>',
desc = 'Diagnostic: Goto Prev',
},
},
{
{ 'g', group = 'Goto' },
{
'gD',
'<cmd>lua vim.lsp.buf.declaration()<CR>',
desc = 'LSP: Goto Declaration',
},
{
'gI',
'<cmd>lua vim.lsp.buf.implementation()<CR>',
desc = 'LSP: Goto Implementation',
},
{
'gR',
'<cmd>Trouble lsp_references<cr>',
desc = 'Toggle LSP References',
},
{
'gd',
'<cmd>lua vim.lsp.buf.definition()<CR>',
desc = 'LSP: Goto Definition',
},
{
'gr',
'<cmd>lua require("telescope.builtin").lsp_references()<CR>',
desc = 'LSP: Goto References',
},
},
-- ── Misc keybinds ───────────────────────────────────────────────────
-- Sublime-like shortcut 'go to file' ctrl+p.
{ '<C-p>', '<cmd>Telescope find_files<CR>', desc = 'Search for files starting at current directory.' },
{
'<C-p>',
'<cmd>Telescope find_files<CR>',
desc = 'Search for files starting at current directory.',
},
{ 'QQ', '<cmd>q!<CR>', desc = 'Quit without saving' },
{ 'WW', '<cmd>w!<CR>', desc = 'Force write to file' },
{ 'ss', '<cmd>noh<CR>', desc = 'Clear Search Highlighting' },
{ 'jj', '<Esc>', desc = 'Esc without touching esc in insert mode', mode = 'i' },
{
'jj',
'<Esc>',
desc = 'Esc without touching esc in insert mode',
mode = 'i',
},
-- ── Splits ──────────────────────────────────────────────────────────
-- Use CTRL+<hjkl> to switch between windows in normal mode
@@ -240,12 +592,13 @@ return {
{ '<down>', '<cmd>echo "Use j to move!!"<CR>' },
-- ── Terminal ────────────────────────────────────────────────────────
-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier
-- for people to discover. Otherwise, you normally need to press <C-\><C-n>, which
-- is not what someone will guess without a bit more experience.
-- Exit terminal mode in the builtin terminal with a shortcut that is
-- a bit easier for people to discover. Otherwise, you normally need
-- to press <C-\><C-n>, which is not what someone will guess without
-- a bit more experience.
--
-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping
-- or just use <C-\><C-n> to exit terminal mode.
-- NOTE: This won't work in all terminal emulators/tmux/etc.
-- Try your own mapping or just use <C-\><C-n> to exit terminal mode.
{ '<Esc><Esc>', '<C-\\><C-n>', desc = 'Exit terminal mode', mode = 't' },
-- ── Search ──────────────────────────────────────────────────────────

View File

View File

@@ -1,120 +0,0 @@
#'ve
i/!
i've/!
I've
I
good
#rd
#rd/!
#rd
#rd
#rd/!
#rd
wrd/!
neovim
github
folke
nvim
keybinds
https
CommentBox
lua
dap
lsp
wincmd
CTRL
hjkl
resizing
noh
UiEnter
signcolumn
popup
whitespace
listchars
completeopt
Autoformat
stevearc
isort
formatters
formatter
hrsh7th
cmp
repos
editorconfig
rmagatti
goto
UI
api
configs
bufhidden
ThePrimeagen
preservim
tpope
todo
lukas
reineke
blankline
tabstop
shiftwidth
wakatime
numToStr
zbirenbaum
onsails
lspkind
pictograms
vscode
SergioRibera
dotenv
config
schemaStore
TypeError
dev
Automagically
runtime
discoverable
lspconfig
pre
LSPs
Stylelint
CSS
PHP
GitLab
ESLint
Ansible
Terraform
TypeScript
JS
Vue
YAML
LSPSaga
luasnip
saadparwaiz1
LuaSnip
L3MON4D3
jumplist
textobjects
scm
textobj
treesitter
statusline
lualine
ivuorinen's
lazylazy
cmdline
popupmenu
noice
statuscolumn
TreeSitter
ivuorinen
github
github
Tampere
Logrotate
sysvinit
Noice
fzf
linters
LSPConfig
deps
Noice
stdpath

Binary file not shown.