working
This commit is contained in:
parent
5bdde24dfb
commit
dd1d1bb6e9
49 changed files with 2444 additions and 1322 deletions
193
lua/core/keymaps.lua
Normal file
193
lua/core/keymaps.lua
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
-- Keymaps for better default experience
|
||||
|
||||
-- Set leader key
|
||||
vim.g.mapleader = ' '
|
||||
vim.g.maplocalleader = ' '
|
||||
|
||||
-- For conciseness
|
||||
local opts = { noremap = true, silent = true }
|
||||
|
||||
-- Disable the spacebar key's default behavior in Normal and Visual modes
|
||||
vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true })
|
||||
|
||||
-- Allow moving the cursor through wrapped lines with j, k
|
||||
vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
|
||||
vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
|
||||
|
||||
-- clear highlights
|
||||
vim.keymap.set('n', '<Esc>', ':noh<CR>', opts)
|
||||
|
||||
-- save file
|
||||
vim.keymap.set('n', '<C-s>', '<cmd> w <CR>', opts)
|
||||
|
||||
-- save file without auto-formatting
|
||||
vim.keymap.set('n', '<leader>sn', '<cmd>noautocmd w <CR>', opts)
|
||||
|
||||
-- quit file
|
||||
vim.keymap.set('n', '<C-q>', '<cmd> q <CR>', opts)
|
||||
|
||||
-- delete single character without copying into register
|
||||
vim.keymap.set('n', 'x', '"_x', opts)
|
||||
|
||||
-- Vertical scroll and center
|
||||
vim.keymap.set('n', '<C-d>', '<C-d>zz', opts)
|
||||
vim.keymap.set('n', '<C-u>', '<C-u>zz', opts)
|
||||
|
||||
-- Find and center
|
||||
vim.keymap.set('n', 'n', 'nzzzv')
|
||||
vim.keymap.set('n', 'N', 'Nzzzv')
|
||||
|
||||
-- Resize with arrows
|
||||
vim.keymap.set('n', '<Up>', ':resize -2<CR>', opts)
|
||||
vim.keymap.set('n', '<Down>', ':resize +2<CR>', opts)
|
||||
vim.keymap.set('n', '<Left>', ':vertical resize -2<CR>', opts)
|
||||
vim.keymap.set('n', '<Right>', ':vertical resize +2<CR>', opts)
|
||||
|
||||
-- Buffers
|
||||
vim.keymap.set('n', '<S-l>', ':bnext<CR>', opts)
|
||||
vim.keymap.set('n', '<S-h>', ':bprevious<CR>', opts)
|
||||
vim.keymap.set('n', '<leader>x', ':Bdelete!<CR>', opts) -- close buffer
|
||||
vim.keymap.set('n', '<leader>b', '<cmd> enew <CR>', opts) -- new buffer
|
||||
|
||||
-- Increment/decrement numbers
|
||||
vim.keymap.set('n', '<leader>+', '<C-a>', opts) -- increment
|
||||
vim.keymap.set('n', '<leader>-', '<C-x>', opts) -- decrement
|
||||
|
||||
-- Window management
|
||||
vim.keymap.set('n', '<leader>v', '<C-w>v', opts) -- split window vertically
|
||||
vim.keymap.set('n', '<leader>h', '<C-w>s', opts) -- split window horizontally
|
||||
vim.keymap.set('n', '<leader>se', '<C-w>=', opts) -- make split windows equal width & height
|
||||
vim.keymap.set('n', '<leader>xs', ':close<CR>', opts) -- close current split window
|
||||
|
||||
-- Navigate between splits
|
||||
vim.keymap.set('n', '<C-k>', ':wincmd k<CR>', opts)
|
||||
vim.keymap.set('n', '<C-j>', ':wincmd j<CR>', opts)
|
||||
vim.keymap.set('n', '<C-h>', ':wincmd h<CR>', opts)
|
||||
vim.keymap.set('n', '<C-l>', ':wincmd l<CR>', opts)
|
||||
|
||||
-- Tabs
|
||||
vim.keymap.set('n', '<leader>to', ':tabnew<CR>', opts) -- open new tab
|
||||
vim.keymap.set('n', '<leader>tx', ':tabclose<CR>', opts) -- close current tab
|
||||
vim.keymap.set('n', '<leader>tn', ':tabn<CR>', opts) -- go to next tab
|
||||
vim.keymap.set('n', '<leader>tp', ':tabp<CR>', opts) -- go to previous tab
|
||||
|
||||
-- Toggle line wrapping
|
||||
vim.keymap.set('n', '<leader>lw', '<cmd>set wrap!<CR>', opts)
|
||||
|
||||
-- Press jk fast to exit insert mode
|
||||
vim.keymap.set('i', 'jk', '<ESC>', opts)
|
||||
vim.keymap.set('i', 'kj', '<ESC>', opts)
|
||||
|
||||
-- Stay in indent mode
|
||||
vim.keymap.set('v', '<', '<gv', opts)
|
||||
vim.keymap.set('v', '>', '>gv', opts)
|
||||
|
||||
-- Move text up and down
|
||||
vim.keymap.set('v', '<A-j>', ':m .+1<CR>==', opts)
|
||||
vim.keymap.set('v', '<A-k>', ':m .-2<CR>==', opts)
|
||||
|
||||
-- Keep last yanked when pasting
|
||||
vim.keymap.set('v', 'p', '"_dP', opts)
|
||||
|
||||
-- Replace word under cursor
|
||||
vim.keymap.set('n', '<leader>j', '*``cgn', opts)
|
||||
|
||||
-- Explicitly yank to system clipboard (highlighted and entire row)
|
||||
vim.keymap.set({ 'n', 'v' }, '<leader>y', [["+y]])
|
||||
vim.keymap.set('n', '<leader>Y', [["+Y]])
|
||||
|
||||
-- Toggle diagnostics
|
||||
local diagnostics_active = true
|
||||
|
||||
vim.keymap.set('n', '<leader>do', function()
|
||||
diagnostics_active = not diagnostics_active
|
||||
|
||||
if diagnostics_active then
|
||||
vim.diagnostic.enable(0)
|
||||
else
|
||||
vim.diagnostic.disable(0)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Diagnostic keymaps
|
||||
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' })
|
||||
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' })
|
||||
vim.keymap.set('n', '<leader>d', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' })
|
||||
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' })
|
||||
|
||||
-- Save and load session
|
||||
vim.keymap.set('n', '<leader>ss', ':mksession! .session.vim<CR>', { noremap = true, silent = false })
|
||||
vim.keymap.set('n', '<leader>sl', ':source .session.vim<CR>', { noremap = true, silent = false })
|
||||
|
||||
-- exit insrrt mode with jk
|
||||
vim.keymap.set('i', 'jk', '<ESC>', { noremap = true, silent = true, desc = '<ESC>' })
|
||||
-- -- option + a to select all text in a file
|
||||
vim.keymap.set('n', '<M-a>', 'ggVG', { noremap = true, silent = true, desc = 'Select all' })
|
||||
--
|
||||
-- Map the function to a key combination
|
||||
vim.keymap.set('n', '<leader>te', 'oif err != nil {<CR>}<Esc>Oreturn err<Esc>')
|
||||
--
|
||||
-- -- Remap <Leader>x to close the current buffer
|
||||
vim.api.nvim_set_keymap('n', '<Leader>x', ':bd<CR>', { noremap = true, silent = true })
|
||||
|
||||
-- vim.api.nvim_del_keymap('n', '<Leader>l')
|
||||
|
||||
-- Function to restart LSP
|
||||
vim.api.nvim_set_keymap('n', '<leader>L', ':LspRestart<CR>', { noremap = true, silent = true })
|
||||
|
||||
-- -- Remap <Leader>l to restart LSP
|
||||
vim.api.nvim_set_keymap('n', '<Leader>l', '<cmd>lua restart_lsp()<CR>', { noremap = true, silent = true })
|
||||
|
||||
-- Remap leader+f to leader+F
|
||||
vim.api.nvim_set_keymap('n', '<leader><leader>', '<leader>fF', { noremap = true, silent = true })
|
||||
vim.api.nvim_set_keymap('n', '<leader>ff', '<leader>fF', { noremap = true, silent = true })
|
||||
vim.api.nvim_set_keymap('n', '<leader>ft', '<leader>fT', { noremap = true, silent = true })
|
||||
|
||||
vim.keymap.set('n', '<Tab>', '20j', { noremap = true, silent = true })
|
||||
vim.keymap.set('n', '<S-Tab>', '20k', { noremap = true, silent = true })
|
||||
|
||||
-- diagnostic
|
||||
local diagnostic_goto = function(next, severity)
|
||||
local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev
|
||||
severity = severity and vim.diagnostic.severity[severity] or nil
|
||||
return function()
|
||||
go { severity = severity }
|
||||
end
|
||||
end
|
||||
vim.keymap.set('n', '<leader>cd', vim.diagnostic.open_float, { desc = 'Line Diagnostics' })
|
||||
vim.keymap.set('n', ']d', diagnostic_goto(true), { desc = 'Next Diagnostic' })
|
||||
vim.keymap.set('n', '[d', diagnostic_goto(false), { desc = 'Prev Diagnostic' })
|
||||
vim.keymap.set('n', ']e', diagnostic_goto(true, 'ERROR'), { desc = 'Next Error' })
|
||||
vim.keymap.set('n', '[e', diagnostic_goto(false, 'ERROR'), { desc = 'Prev Error' })
|
||||
vim.keymap.set('n', ']w', diagnostic_goto(true, 'WARN'), { desc = 'Next Warning' })
|
||||
vim.keymap.set('n', '[w', diagnostic_goto(false, 'WARN'), { desc = 'Prev Warning' })
|
||||
|
||||
vim.api.nvim_set_hl(0, '@lsp.type.unused', { link = 'Comment' })
|
||||
|
||||
-- jumping lines
|
||||
-- vim.keymap.del("n", "<S-[>")
|
||||
-- vim.keymap.del("n", "<S-]>")
|
||||
vim.keymap.set("n", "<S-[>", "{", { noremap = true, silent = true }) -- Jump up to previous empty line
|
||||
vim.keymap.set("n", "<S-]>", "}", { noremap = true, silent = true }) -- Jump down to next empty line
|
||||
|
||||
|
||||
|
||||
vim.keymap.set('n', '<leader>st', function()
|
||||
require('telescope.builtin').live_grep({ default_text = "// TODO:" })
|
||||
end, { desc = "Search for TODO comments" })
|
||||
|
||||
vim.keymap.set('n', '<leader>sx', function()
|
||||
require('telescope.builtin').live_grep({ default_text = "// FUTURE:" })
|
||||
end, { desc = "Search for FUTURE comments" })
|
||||
|
||||
vim.keymap.set('n', '<leader>si', function()
|
||||
require('telescope.builtin').live_grep({ default_text = "// IMPORTANT:" })
|
||||
end, { desc = "Search for IMPORTANT comments" })
|
||||
|
||||
-- Define highlight groups for comment tags
|
||||
vim.api.nvim_set_hl(0, "FutureHighlight", { bg = "#3b4252", fg = "#81a1c1", bold = true }) -- Light blue
|
||||
vim.api.nvim_set_hl(0, "FixmeHighlight", { bg = "#3b4252", fg = "#bf616a", bold = true }) -- Red
|
||||
vim.api.nvim_set_hl(0, "NoteHighlight", { bg = "#3b4252", fg = "#ebcb8b", bold = true }) -- Yellow
|
||||
vim.api.nvim_set_hl(0, "QuestionHighlight", { bg = "#3b4252", fg = "#b48ead", bold = true }) -- Purple
|
||||
vim.api.nvim_set_hl(0, "ImportantHighlight", { bg = "#3b4252", fg = "#a3be8c", bold = true }) -- Green
|
||||
|
||||
63
lua/core/options.lua
Normal file
63
lua/core/options.lua
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
vim.o.hlsearch = false -- Set highlight on search
|
||||
vim.wo.number = true -- Make line numbers default
|
||||
vim.o.mouse = 'a' -- Enable mouse mode
|
||||
vim.o.clipboard = 'unnamedplus' -- Sync clipboard between OS and Neovim.
|
||||
vim.o.breakindent = true -- Enable break indent
|
||||
vim.o.undofile = true -- Save undo history
|
||||
vim.o.ignorecase = true -- Case-insensitive searching UNLESS \C or capital in search
|
||||
vim.o.smartcase = true -- smart case
|
||||
vim.wo.signcolumn = 'yes' -- Keep signcolumn on by default
|
||||
vim.o.updatetime = 250 -- Decrease update time
|
||||
vim.o.timeoutlen = 300 -- time to wait for a mapped sequence to complete (in milliseconds)
|
||||
vim.o.backup = false -- creates a backup file
|
||||
vim.o.writebackup = false -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited
|
||||
vim.o.completeopt = 'menuone,noselect' -- Set completeopt to have a better completion experience
|
||||
vim.opt.termguicolors = true -- set termguicolors to enable highlight groups
|
||||
vim.o.whichwrap = 'bs<>[]hl' -- which "horizontal" keys are allowed to travel to prev/next line
|
||||
vim.o.wrap = false -- display lines as one long line
|
||||
vim.o.linebreak = true -- companion to wrap don't split words
|
||||
vim.o.scrolloff = 0 -- minimal number of screen lines to keep above and below the cursor
|
||||
vim.o.sidescrolloff = 8 -- minimal number of screen columns either side of cursor if wrap is `false`
|
||||
vim.o.relativenumber = true -- set relative numbered lines
|
||||
vim.o.numberwidth = 4 -- set number column width to 2 {default 4}
|
||||
vim.o.shiftwidth = 4 -- the number of spaces inserted for each indentation
|
||||
vim.o.tabstop = 2 -- insert n spaces for a tab
|
||||
vim.o.softtabstop = 4 -- Number of spaces that a tab counts for while performing editing operations
|
||||
vim.o.expandtab = true -- convert tabs to spaces
|
||||
vim.o.cursorline = true -- highlight the current line
|
||||
vim.o.splitbelow = true -- force all horizontal splits to go below current window
|
||||
vim.o.splitright = true -- force all vertical splits to go to the right of current window
|
||||
vim.o.swapfile = false -- creates a swapfile
|
||||
vim.o.smartindent = true -- make indenting smarter again
|
||||
vim.o.showmode = false -- we don't need to see things like -- INSERT -- anymore
|
||||
vim.o.showtabline = 2 -- always show tabs
|
||||
vim.o.backspace = 'indent,eol,start' -- allow backspace on
|
||||
vim.o.pumheight = 10 -- pop up menu height
|
||||
vim.o.conceallevel = 0 -- so that `` is visible in markdown files
|
||||
vim.o.fileencoding = 'utf-8' -- the encoding written to a file
|
||||
vim.o.cmdheight = 1 -- more space in the neovim command line for displaying messages
|
||||
vim.o.autoindent = true -- copy indent from current line when starting new one
|
||||
vim.opt.shortmess:append 'c' -- don't give |ins-completion-menu| messages
|
||||
vim.opt.iskeyword:append '-' -- hyphenated words recognized by searches
|
||||
vim.opt.formatoptions:remove { 'c', 'r', 'o' } -- don't insert the current comment leader automatically for auto-wrapping comments using 'textwidth', hitting <Enter> in insert mode, or hitting 'o' or 'O' in normal mode.
|
||||
vim.opt.runtimepath:remove '/usr/share/vim/vimfiles' -- separate vim plugins from neovim in case vim still in use
|
||||
|
||||
|
||||
-- -- Ensure fold method is set (syntax-based folding is great for Nim)
|
||||
-- vim.o.foldmethod = "syntax"
|
||||
-- vim.o.foldenable = true -- Enable folding at startup
|
||||
-- vim.o.foldlevel = 99 -- Open all folds by default
|
||||
|
||||
|
||||
|
||||
-- Use Treesitter for better folding (Recommended)
|
||||
vim.opt.foldmethod = "expr"
|
||||
vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
|
||||
|
||||
-- Set fold level
|
||||
vim.opt.foldenable = true
|
||||
vim.opt.foldlevel = 99 -- Keep folds open by default
|
||||
|
||||
|
||||
|
||||
|
||||
45
lua/core/snippets.lua
Normal file
45
lua/core/snippets.lua
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
-- Custom code snippets for different purposes
|
||||
|
||||
-- Prevent LSP from overwriting treesitter color settings
|
||||
-- https://github.com/NvChad/NvChad/issues/1907
|
||||
vim.highlight.priorities.semantic_tokens = 95 -- Or any number lower than 100, treesitter's priority level
|
||||
|
||||
-- Appearance of diagnostics
|
||||
vim.diagnostic.config {
|
||||
virtual_text = {
|
||||
prefix = '●',
|
||||
-- Add a custom format function to show error codes
|
||||
format = function(diagnostic)
|
||||
local code = diagnostic.code and string.format('[%s]', diagnostic.code) or ''
|
||||
return string.format('%s %s', code, diagnostic.message)
|
||||
end,
|
||||
},
|
||||
underline = false,
|
||||
update_in_insert = true,
|
||||
float = {
|
||||
source = 'always', -- Or "if_many"
|
||||
},
|
||||
-- Make diagnostic background transparent
|
||||
on_ready = function()
|
||||
vim.cmd 'highlight DiagnosticVirtualText guibg=NONE'
|
||||
end,
|
||||
}
|
||||
|
||||
-- Highlight on yank
|
||||
local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true })
|
||||
vim.api.nvim_create_autocmd('TextYankPost', {
|
||||
callback = function()
|
||||
vim.highlight.on_yank()
|
||||
end,
|
||||
group = highlight_group,
|
||||
pattern = '*',
|
||||
})
|
||||
|
||||
-- Set kitty terminal padding to 0 when in nvim
|
||||
vim.cmd [[
|
||||
augroup kitty_mp
|
||||
autocmd!
|
||||
au VimLeave * :silent !kitty @ set-spacing padding=default margin=default
|
||||
au VimEnter * :silent !kitty @ set-spacing padding=0 margin=0 3 0 3
|
||||
augroup END
|
||||
]]
|
||||
59
lua/core/ui.lua
Normal file
59
lua/core/ui.lua
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
return {
|
||||
{
|
||||
'folke/noice.nvim',
|
||||
opts = function(_, opts)
|
||||
-- 🔥 Ensure `opts.presets` is initialized before modifying
|
||||
opts.presets = opts.presets or {}
|
||||
opts.presets.lsp_doc_border = true
|
||||
|
||||
-- 🔥 Ensure `opts.routes` is a table before inserting
|
||||
opts.routes = opts.routes or {}
|
||||
table.insert(opts.routes, {
|
||||
filter = {
|
||||
event = 'notify',
|
||||
find = 'No information available',
|
||||
},
|
||||
opts = { skip = true },
|
||||
})
|
||||
end,
|
||||
},
|
||||
{
|
||||
'akinsho/bufferline.nvim',
|
||||
event = 'VeryLazy',
|
||||
opts = {
|
||||
options = {
|
||||
show_buffer_close_icons = false,
|
||||
show_close_icon = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
'nvimdev/dashboard-nvim',
|
||||
event = 'VimEnter',
|
||||
opts = function(_, opts)
|
||||
local logo = [[
|
||||
|
||||
████████ ████████
|
||||
██ ██ ██
|
||||
▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒ ████
|
||||
▒▒▒▒ ▒▒▒▒▒▒
|
||||
████████▒▒▒▒▒▒ ▒▒▒▒██▒▒██████
|
||||
████ ▒▒▒▒██▒▒▒▒ ▒▒▒▒████▒▒▒▒ ████
|
||||
████ ▒▒▒▒ ████▒▒ ▒▒▒▒████ ▒▒ ████
|
||||
██ ▒▒ ██▒▒ ▒▒▒▒ ██ ▒▒ ██
|
||||
██ ▒▒▒▒▒▒▒▒▒▒▒▒██▒▒ ██ ▒▒ ██
|
||||
██ ██ ██ ██ ██
|
||||
████ ████ ██ ████ ████
|
||||
████ ████ ████ ████
|
||||
██████████ ██████████
|
||||
|
||||
]]
|
||||
|
||||
logo = string.rep('\n', 8) .. logo .. '\n\n'
|
||||
|
||||
-- 🔥 Ensure `opts.config` is a table before modifying
|
||||
opts.config = opts.config or {}
|
||||
opts.config.header = vim.split(logo, '\n')
|
||||
end,
|
||||
},
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue