" ============================================================================= " General Settings " ============================================================================= " Enable syntax highlighting syntax enable " Use hybrid colorscheme let g:hybrid_custom_term_colors = 1 set background=dark colorscheme hybrid " Set file encoding set encoding=utf-8 " Disable swap files for performance and simplicity set noswapfile " Clipboard sharing set clipboard+=unnamedplus " Enable relative numbers set number " Indentation and basic text manipulation set smartindent " Smart indentation set smartcase " Case-insensitive search unless uppercase is used set incsearch " Show search matches as you type " Split window behavior set splitbelow splitright " Wildcard completion behavior set wildmode=longest:full,full " Tab behavior set tabstop=4 softtabstop=4 set shiftwidth=4 set expandtab " Remove trailing whitespace on save autocmd BufWritePre * %s/\s\+$//e " Disable automatic commenting for easier commenting with plugins autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o " ============================================================================= " Plugin Management (vim-plug) " ============================================================================= call plug#begin('~/.vim/plugged') " Appearance and UI Plug 'nvim-lualine/lualine.nvim' "Plug 'vim-airline/vim-airline' " DEPRECATED: IN NEW VERSION, SWITCHED TO LUALINE "Plug 'vim-airline/vim-airline-themes' "Plug 'ryanoasis/vim-devicons' Plug 'nvim-tree/nvim-web-devicons' " Text manipulation Plug 'tpope/vim-surround' "Plug 'jiangmiao/auto-pairs' " Automatic parentheses and quotes etc. I don t like it tbh Plug 'norcalli/nvim-colorizer.lua' Plug 'preservim/nerdcommenter' " Language support Plug 'sheerun/vim-polyglot' " File explorer Plug 'preservim/nerdtree' " Git integration Plug 'airblade/vim-gitgutter' Plug 'tpope/vim-fugitive' " Discord presence Plug 'andweeb/presence.nvim' " Telescope for fuzzy finding Plug 'nvim-lua/plenary.nvim' Plug 'nvim-telescope/telescope.nvim' " Code completion and AI Plug 'github/copilot.vim' " Mason (LSP, DAP, linter, formatter manager) Plug 'williamboman/mason.nvim' Plug 'williamboman/mason-lspconfig.nvim' " Language server protocol (LSP) Plug 'neovim/nvim-lspconfig' " Autocompletion LSP Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/cmp-path' Plug 'hrsh7th/cmp-cmdline' Plug 'saadparwaiz1/cmp_luasnip' " Snippets Plug 'L3MON4D3/LuaSnip' Plug 'rafamadriz/friendly-snippets' " null-ls (for linters and formatters) "Plug 'jose-elias-alvarez/null-ls.nvim' " DEPRECATED: after neovim 0.10 Plug 'nvimtools/none-ls.nvim' " fork that supports neovim 0.11 " Diagnostics UI (optional UI for LSP diagnostics) Plug 'j-hui/fidget.nvim' " Rust language tools Plug 'rust-lang/rust.vim' " Go language tools Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } " Latex tools Plug 'lervag/vimtex' call plug#end() " ============================================================================= " Language Specific Configurations " ============================================================================= " [Rust.vim] Syntax checker provider let g:syntastic_rust_checkers = ['cargo'] " ZIG Formatter autosave - disable let g:zig_fmt_autosave = 0 " ============================================================================= " Telescope Configurations " ============================================================================= " Find files nnoremap f Telescope find_files " Live grep nnoremap fg Telescope live_grep " Find open buffers nnoremap fb Telescope buffers " Find help tags nnoremap fh Telescope help_tags " ============================================================================= " Vimtex Configurations " ============================================================================= let g:vimtex_view_method = 'zathura' let g:vimtex_compiler_method = 'tectonic' let g:vimtex_view_general_viewer = 'okular' let g:vimtex_view_general_options = '--unique file:@pdf\#src:@line@tex' let maplocalleader = "," " Do not automatically open the quickfix window, if you want to open it, use ,le let g:vimtex_quickfix_mode = 0 augroup vimtex_auto_compile autocmd! autocmd BufWritePost *.tex call vimtex#compiler#compile() augroup END " ============================================================================= " Discord Presence " ============================================================================= let g:presence_neovim_image_text="The One True Text Editor" let g:presence_main_image="file" " ============================================================================= " Airline Configurations " ============================================================================= " DEPRECATED: I used to use airline, but I switched to lualine for better performance and more customization options. I keep these settings here in case I want to switch back or if I want to use some of the themes or extensions that airline offers. "let g:airline_powerline_fonts = 1 "let g:airline#extensions#tabline#enabled = 1 "let g:airline_theme='deus' " for vimtex "let g:airline#extensions#vimtex#enabled = 1 " Enable filetype plugins and indentation filetype plugin indent on " ============================================================================= " UI Settings " ============================================================================= " Disable --INSERT-- mode display set noshowmode " Enable true color support for nvim-colorizer set termguicolors " Setup nvim-colorizer lua require'colorizer'.setup() " Lualine transparent background highlight StatusLine guibg=NONE ctermbg=NONE highlight StatusLineNC guibg=NONE ctermbg=NONE highlight TabLineFill guibg=NONE ctermbg=NONE " ============================================================================= " Cursor highlight line " ============================================================================= hi CursorLine cterm=NONE ctermbg=256 hi CursorColumn cterm=NONE ctermbg=257 nnoremap b :set cursorline! " ============================================================================= " Fidget Configuration " ============================================================================= highlight FidgetTask guibg=NONE ctermbg=NONE " ============================================================================= " Remaps " ============================================================================= nnoremap :%s//g " Toggle NerdTree nnoremap \ :NERDTreeToggle nnoremap :NERDTreeFocus " NERDTree setup let NERDTreeShowHidden=1 let NERDTreeIgnore=['\.pyc$', '\~$', '\.swp$'] " Exit Vim if NERDTree is the only window left. autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif " Spell check toggle map S :setlocal spell! spelllang=en_us " Quick save and exit map zz :wq map zx :q! map zs :w " ============================================================================= " Copilot Setup " ============================================================================= " Disable copilot for text, markdown and latex files autocmd FileType text let g:copilot_enabled = 0 autocmd FileType markdown let g:copilot_enabled = 0 autocmd FileType tex let g:copilot_enabled = 0 " ============================================================================= " NeoVide Setup " ============================================================================= if exists("g:neovide") set guifont=Inconsolata:h8 let g:neovide_opacity = 1 let g:neovide_normal_opacity = 0.70 let g:neovide_cursor_vfx_mode = "pixiedust" endif " ============================================================================= " LSP Setup " ============================================================================= lua << EOF local custom_onedark = require('lualine.themes.onedark') for _, mode in pairs(custom_onedark) do if mode.c then mode.c.bg = 'NONE' end end require('lualine').setup { options = { theme = custom_onedark, icons_enabled = true, component_separators = { left = '', right = ''}, section_separators = { left = '', right = ''}, globalstatus = true, }, tabline = { lualine_a = {'buffers'}, lualine_b = {}, lualine_c = {}, lualine_x = {}, lualine_y = {}, lualine_z = {'tabs'} }, sections = { lualine_c = { 'filename', function() if vim.bo.filetype == 'tex' and vim.fn.exists('*vimtex#statusline') == 1 then return vim.fn['vimtex#statusline']() end return '' end } } } -- Keymap utility functions local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(0, ...) end -- Global settings for LSP client. vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "rounded", }) -- Keymap settings (defined in the on_attach function) local lsp_keymaps = function(bufnr) buf_set_keymap("n", "gd", "lua vim.lsp.buf.definition()", { desc = "Go to definition" }) buf_set_keymap("n", "gD", "lua vim.lsp.buf.declaration()", { desc = "Go to declaration" }) buf_set_keymap("n", "K", "lua vim.lsp.buf.hover()", { desc = "Hover information" }) buf_set_keymap("n", "lr", "lua vim.lsp.buf.rename()", { desc = "Rename symbol" }) buf_set_keymap("n", "lf", "lua vim.lsp.buf.format()", { desc = "Format document" }) buf_set_keymap("n", "la", "lua vim.lsp.buf.code_action()", { desc = "Code action" }) buf_set_keymap("n", "l ", "lua vim.diagnostic.open_float()", { desc = "Diagnostics" }) buf_set_keymap("n", "gr", "lua vim.lsp.buf.references()", { desc = "Show references" }) buf_set_keymap("n", "[d", "lua vim.diagnostic.goto_prev()", { desc = "Previous diagnostic" }) buf_set_keymap("n", "]d", "lua vim.diagnostic.goto_next()", { desc = "Next diagnostic" }) end -- On attach callback to apply keymaps and custom settings local on_attach = function(client, bufnr) -- Add LSP keymaps. lsp_keymaps(bufnr) end -- Mason configurations require("mason").setup {} require("mason-lspconfig").setup { -- List of servers to automatically install if they're not already installed ensure_installed = { "pyright", "gopls", "rust_analyzer", "clangd", "zls", "jdtls", "texlab", "rnix", "bashls", "jsonls", "cssls", "svelte", "asm_lsp", "csharp_ls", "neocmake", "ast_grep", "dockerls", "glslls", "graphql", "html", "htmx", "denols", "harper_ls", "glsl_analyzer", "opencl_ls", "prismals", "sqlls", "tinymist", "vimls", "vuels", }, -- Whether servers that are set up (via lspconfig) should be automatically installed automatic_installation = true, } -- LSP server configurations local servers = { pyright = { settings = { python = { analysis = { autoSearchPaths = true, diagnosticMode = "openFilesOnly", typeCheckingMode = "basic", useLibraryCodeForTypes = true, }, }, }, }, gopls = { settings = { gopls = { gofumpt = true, }, }, }, rust_analyzer = { settings = { ["rust-analyzer"] = { checkOnSave = { command = "clippy", }, cargo = { allFeatures = true, } }, }, }, clangd = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, zls = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, dartls = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, jdtls = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, texlab = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, rnix = { on_attach = function(client, bufnr) lsp_keymaps(bufnr) client.server_capabilities.semanticTokensProvider = nil end }, } local capabilities = require('cmp_nvim_lsp').default_capabilities() for server, config in pairs(servers) do config = vim.tbl_deep_extend("force", { on_attach = on_attach, capabilities = capabilities, }, config or {}) -- Verify if we're on Neovim 0.11+ (which has native vim.lsp.config) if vim.lsp.config then vim.lsp.config(server, config) vim.lsp.enable(server) else -- Fallback for Neovim 0.10 require("lspconfig")[server].setup(config) end end -- null-ls (for formatters/linters not provided by LSP) local null_ls = require("null-ls") null_ls.setup({ -- on_attach = on_attach, -- Remove on_attach from here sources = { -- Get formatters and linters from Mason null_ls.builtins.formatting.stylua, null_ls.builtins.formatting.black.with({ extra_args = { "--fast" }, -- Only use black if a .git or pyproject.toml is present condition = function(utils) return utils.root_has_file({".git", "pyproject.toml"}) end, }), null_ls.builtins.formatting.isort, -- null_ls.builtins.diagnostics.flake8, null_ls.builtins.formatting.gofmt, null_ls.builtins.formatting.goimports, -- null_ls.builtins.formatting.rustfmt, }, }) -- cmp setup local cmp = require 'cmp' require("luasnip.loaders.from_vscode").lazy_load() cmp.setup({ snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, }), }) -- Diagnostics UI (fidget.nvim) require("fidget").setup({ notification = { window = { winblend = 0, } } }) local ls = require("luasnip") local s = ls.snippet local t = ls.text_node local i = ls.insert_node local fmt = require("luasnip.extras.fmt").fmt ls.add_snippets("tex", { -- 1. Mediu matematic inline rapid -- Scrii "mk" -> devine "$ cursor $" s("mk", { t("$"), i(1), t("$"), i(0) }), -- 2. Fracții -- Scrii "ff" -> devine "\frac{ cursor }{ }" s("ff", { t("\\frac{"), i(1), t("}{"), i(2), t("}"), i(0) }), -- 3. Ecuație numerotată -- Scrii "eq" -> mediu equation s("eq", { t({"\\begin{equation}", "\t"}), i(1), t({"", "\\end{equation}"}), i(0) }), -- 4. Ecuație nenumerotată (align*) -- Scrii "al" -> mediu align* s("al", { t({"\\begin{align*}", "\t"}), i(1), t({"", "\\end{align*}"}), i(0) }), -- 5. Bold text -- Scrii "bf" -> \textbf{} s("bf", { t("\\textbf{"), i(1), t("}"), i(0) }), }) EOF