--[[
lvim is the global options object
Linters should be
filled in as strings with either
a global executable or a path to
an executable
] ]
-- THESE ARE EXAMPLE CONFIGS FEEL FREE TO CHANGE TO WHATEVER YOU WANT
-- vim.cmd [[set nomodeline]]
-- vim.cmd [[set modelines=0]]
-- general
lvim.log . level = " warning "
lvim.format_on_save = false
lvim.colorscheme = " tokyonight "
vim.lsp . set_log_level ( " debug " )
local tables = { " clangd " }
vim.list_extend ( lvim.lsp . automatic_configuration.skipped_servers , tables , 1 , # tables )
vim.list_extend ( lvim.lsp . override , tables , 1 , # tables )
local clangd_bin = " clangd "
local clangd_flags = {
" --query-driver=/usr/bin/g++-12 " ,
" --background-index " , " --pch-storage=memory " , " -j=4 " , " --log=verbose " ,
-- "--path-mappings=/from=/to",
}
-- Example
local custom_on_attach = function ( client , bufnr )
require ( " lvim.lsp " ) . common_on_attach ( client , bufnr )
local opts = { noremap = true , silent = true }
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " gD " , " <cmd>lua vim.lsp.buf.declaration()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " gd " , " <cmd>lua vim.lsp.buf.definition()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " K " , " <cmd>lua vim.lsp.buf.hover()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " gi " , " <cmd>lua vim.lsp.buf.implementation()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " <C-k> " , " <cmd>lua vim.lsp.buf.signature_help()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " gr " , " <cmd>lua vim.lsp.buf.references()<CR> " , opts )
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " <leader>lh " , " <Cmd>ClangdSwitchSourceHeader<CR> " , opts )
vim.api . nvim_buf_create_user_command ( bufnr , ' FormatRegion ' , function ( _opts )
local format_opts = { async = false }
if _opts.range > 0 then
format_opts.range = {
{ _opts.line1 , 0 } ,
{ _opts.line2 , 0 } ,
}
end
vim.lsp . buf.format ( format_opts )
end , { range = true } )
end
local opts = {
cmd = { clangd_bin , unpack ( clangd_flags ) } ,
on_attach = custom_on_attach ,
}
require ( " lvim.lsp.manager " ) . setup ( " clangd " , opts )
-- keymappings [view all the defaults by pressing <leader>Lk]
lvim.leader = " space "
lvim.keys . normal_mode [ " <C-s> " ] = " :w<cr> "
lvim.builtin . terminal.open_mapping = [[<c-t>]]
lvim.builtin . terminal.direction = " horizontal "
local keymap_opts = { noremap = true , silent = true }
vim.api . nvim_set_keymap ( " v " , " p " , ' "_dP ' , keymap_opts )
-- unmap a default keymapping
-- lvim.keys.normal_mode["<C-Up>"] = false
-- edit a default keymapping
-- lvim.keys.normal_mode["<C-q>"] = ":q<cr>"
-- Change Telescope navigation to use j and k for navigation and n and p for history in both input and normal mode.
-- we use protected-mode (pcall) just in case the plugin wasn't loaded yet.
-- local _, actions = pcall(require, "telescope.actions")
-- lvim.builtin.telescope.defaults.mappings = {
-- -- for input mode
-- i = {
-- ["<C-j>"] = actions.move_selection_next,
-- ["<C-k>"] = actions.move_selection_previous,
-- ["<C-n>"] = actions.cycle_history_next,
-- ["<C-p>"] = actions.cycle_history_prev,
-- },
-- -- for normal mode
-- n = {
-- ["<C-j>"] = actions.move_selection_next,
-- ["<C-k>"] = actions.move_selection_previous,
-- },
-- }
lvim.builtin . which_key.mappings [ " G " ] = {
" <cmd>Glow<cr> " , " Markdown Preview "
}
lvim.builtin . which_key.vmappings [ " f " ] = {
" <cmd>FormatRegion<cr> " , " Format Region " ,
}
-- Telescope
lvim.builtin . which_key.mappings [ " f " ] = {
name = " +Finder " ,
f = { " <cmd>Telescope find_files<cr> " , " Find files " } ,
g = { " <cmd>Telescope live_grep<cr> " , " Live Grep " }
}
lvim.builtin . which_key.mappings [ " t " ] = {
name = " +Trouble " ,
r = { " <cmd>Trouble lsp_references<cr> " , " References " } ,
f = { " <cmd>Trouble lsp_definitions<cr> " , " Definitions " } ,
d = { " <cmd>Trouble document_diagnostics<cr> " , " Diagnostics " } ,
q = { " <cmd>Trouble quickfix<cr> " , " QuickFix " } ,
l = { " <cmd>Trouble loclist<cr> " , " LocationList " } ,
w = { " <cmd>Trouble workspace_diagnostics<cr> " , " Wordspace Diagnostics " } ,
}
lvim.builtin . which_key.mappings [ " w " ] = {
name = " +Window " ,
[ " <left> " ] = { " <C-w>h " , " Jump to Left Buffer " } ,
[ " <down> " ] = { " <C-w>j " , " Jump to Below Buffer " } ,
[ " <up> " ] = { " <C-w>k " , " Jump to Above Buffer " } ,
[ " <right> " ] = { " <C-w>l " , " Jump to Right Buffer " } ,
h = { " :bprevious<CR> " , " Previous buffer tab " } ,
l = { " :bnext<CR> " , " Next buffer tab " } ,
x = { " <cmd>BufferKill<CR> " , " Close Buffer " }
}
-- TODO: User Config for predefined plugins
-- After changing plugin config exit and reopen LunarVim, Run :PackerInstall :PackerCompile
lvim.builtin . alpha.active = true
lvim.builtin . alpha.mode = " dashboard "
lvim.builtin . bufferline.options . close_command = " :BufDel %d "
lvim.builtin . terminal.active = true
lvim.builtin . nvimtree.setup . view.side = " left "
-- lvim.builtin.nvimtree.show_icons.git = 0
-- if you don't want all the parsers change this to a table of the ones you want
lvim.builtin . treesitter.ensure_installed = {
" bash " ,
" c " ,
" cpp "
" lua " ,
" python " ,
" rust " ,
" yaml "
}
lvim.builtin . treesitter.ignore_install = { " haskell " }
lvim.builtin . treesitter.highlight . enabled = true
lvim.builtin . treesitter.rainbow . enable = true
lvim.builtin . treesitter.indent = false
lvim.lsp . diagnostics.virtual_text = false
-- generic LSP settings
-- ---@usage disable automatic installation of servers
-- lvim.lsp.automatic_servers_installation = false
-- ---@usage Select which servers should be configured manually. Requires `:LvimCacheReset` to take effect.
-- See the full default list `:lua print(vim.inspect(lvim.lsp.override))`
-- vim.list_extend(lvim.lsp.override, { "pylsp" })
-- ---@usage setup a server -- see: https://www.lunarvim.org/languages/#overriding-the-default-configuration
-- local opts = {} -- check the lspconfig documentation for a list of all possible options
-- require("lvim.lsp.manager").setup("pylsp", opts)
-- -- you can set a custom on_attach function that will be used for all the language servers
-- -- See <https://github.com/neovim/nvim-lspconfig#keybindings-and-completion>
-- lvim.lsp.on_attach_callback = function(client, bufnr)
-- local function buf_set_option(...)
-- vim.api.nvim_buf_set_option(bufnr, ...)
-- end
-- --Enable completion triggered by <c-x><c-o>
-- buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
-- end
-- -- set a formatter, this will override the language server formatting capabilities (if it exists)
-- local formatters = require "lvim.lsp.null-ls.formatters"
-- formatters.setup {
-- { command = "black", filetypes = { "python" } },
-- { command = "isort", filetypes = { "python" } },
-- {
-- -- each formatter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration
-- command = "prettier",
-- ---@usage arguments to pass to the formatter
-- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}`
-- extra_args = { "--print-with", "100" },
-- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports.
-- filetypes = { "typescript", "typescriptreact" },
-- },
-- }
-- -- set additional linters
-- local linters = require "lvim.lsp.null-ls.linters"
-- linters.setup {
-- { command = "flake8", filetypes = { "python" } },
-- {
-- -- each linter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration
-- command = "shellcheck",
-- ---@usage arguments to pass to the formatter
-- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}`
-- extra_args = { "--severity", "warning" },
-- },
-- {
-- command = "codespell",
-- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports.
-- filetypes = { "javascript", "python" },
-- },
-- }
-- Additional Plugins
lvim.plugins = {
{ " p00f/nvim-ts-rainbow " } ,
{
" folke/trouble.nvim " ,
cmd = " TroubleToggle " ,
} ,
{
" sindrets/diffview.nvim " ,
requires = " nvim-lua/plenary.nvim " ,
} ,
}
-- lvim.plugins = {
-- {"folke/tokyonight.nvim"},
-- {
-- "folke/trouble.nvim",
-- cmd = "TroubleToggle",
-- },
-- }
-- Autocommands (https://neovim.io/doc/user/autocmd.html)
-- lvim.autocommands.custom_groups = {
-- { "BufWinEnter", "*.lua", "setlocal ts=8 sw=8" },
-- }
local options = {
backup = true , -- creates a backup file
clipboard = " unnamedplus " , -- allows neovim to access the system clipboard
cmdheight = 2 , -- more space in the neovim command line for displaying messages
completeopt = { " menuone " , " noselect " } , -- mostly just for cmp
conceallevel = 0 , -- so that `` is visible in markdown files
fileencoding = " utf-8 " , -- the encoding written to a file
hlsearch = true , -- highlight all matches on previous search pattern
ignorecase = true , -- ignore case in search patterns
mouse = " a " , -- allow the mouse to be used in neovim
pumheight = 10 , -- pop up menu height
showmode = false , -- we don't need to see things like -- INSERT -- anymore
showtabline = 2 , -- always show tabs
smartcase = true , -- smart case
smartindent = false , -- make indenting smarter again
splitbelow = true , -- force all horizontal splits to go below current window
splitright = true , -- force all vertical splits to go to the right of current window
swapfile = true , -- creates a swapfile
termguicolors = true , -- set term gui colors (most terminals support this)
timeoutlen = 1000 , -- time to wait for a mapped sequence to complete (in milliseconds)
undofile = true , -- enable persistent undo
updatetime = 300 , -- faster completion (4000ms default)
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
expandtab = false , -- convert tabs to spaces
shiftwidth = 4 , -- the number of spaces inserted for each indentation
tabstop = 4 , -- insert 2 spaces for a tab
cursorline = true , -- highlight the current line
number = true , -- set numbered lines
relativenumber = false , -- set relative numbered lines
numberwidth = 4 , -- set number column width to 2 {default 4}
signcolumn = " yes " , -- always show the sign column, otherwise it would shift the text each time
wrap = false , -- display lines as one long line
scrolloff = 8 , -- is one of my fav
sidescrolloff = 8 ,
guifont = " monospace:h17 " , -- the font used in graphical neovim applications
backupdir = " /home/penguin/.vim/backup// " ,
directory = " /home/penguin/.vim/swap// " ,
}
for k , v in pairs ( options ) do
vim.opt [ k ] = v
end
vim.cmd [ [
augroup RestoreCursorShapeOnExit
autocmd !
autocmd VimSuspend , VimLeave * set guicursor = a : ver50
augroup END ] ]
vim.cmd [ [
augroup Markdown
autocmd !
autocmd FileType markdown setlocal wrap shiftwidth = 2 tabstop = 2
augroup END
] ]
vim.cmd [ [
augroup Lua
autocmd !
autocmd FileType lua setlocal shiftwidth = 2 tabstop = 2
augroup END
] ]
-- vim.opt.cinoptions:append("=0")