-- opts vim.g.mapleader = " " vim.g.maplocalleader = " " vim.opt.number = true vim.opt.relativenumber = true vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.expandtab = true vim.opt.smartindent = true vim.opt.wrap = true vim.opt.ignorecase = true vim.opt.smartcase = true vim.opt.cursorline = true vim.opt.scrolloff = 8 vim.opt.termguicolors = true vim.opt.signcolumn = "yes" vim.opt.updatetime = 250 vim.opt.clipboard = "unnamedplus" vim.cmd.colorscheme "catppuccin" vim.opt.directory = vim.fn.stdpath('data') .. '/swap//' vim.opt.completeopt = { "menuone", "noinsert", "noselect" } vim.opt.exrc = true vim.g.direnv_silent_load = 1 vim.keymap.set("n", "b", "silent make | copen", {desc = "Run Build Task"}) vim.keymap.set('n', 'e', vim.diagnostic.open_float, { desc = 'Show diagnostic float' }) vim.keymap.set('i', '', '', { desc = 'Trigger native autocomplete' }) vim.keymap.set('n', 'x', 'source %', { desc = 'Source current file' }) vim.keymap.set('n', 'pv', 'Oil', { desc = 'file explorer' }) local zen_active = false vim.keymap.set('n', 'z', function() zen_active = not zen_active if zen_active then prev_status = vim.opt.laststatus:get() prev_tab = vim.opt.showtabline:get() vim.opt.laststatus = 0 vim.opt.showtabline = 0 vim.opt.ruler = false vim.opt.number = false vim.opt.relativenumber = false else vim.opt.laststatus = prev_status == 0 and 3 or prev_status vim.opt.showtabline = prev_tab == 0 and 2 or prev_tab vim.opt.ruler = true vim.opt.number = true vim.opt.relativenumber = true end end, { desc = 'toggle zen' }) vim.keymap.set('i', '', function() if vim.fn.pumvisible() == 1 then return '' else return '' end end, { expr = true, desc = 'Next completion item or Tab' }) vim.keymap.set('i', '', function() if vim.fn.pumvisible() == 1 then return '' else return '' end end, { expr = true, desc = 'Previous completion item or Shift-Tab' }) vim.keymap.set('i', '', function() if vim.fn.pumvisible() == 1 then return '' else return '' end end, { expr = true, desc = 'Accept completion item or Enter' }) vim.api.nvim_set_hl(0, "Normal", { bg = "none" }) vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" }) vim.pack.add({ 'https://github.com/nvim-mini/mini.nvim', 'https://github.com/neovim/nvim-lspconfig', 'https://github.com/nvim-treesitter/nvim-treesitter', 'https://github.com/folke/lazydev.nvim', 'https://github.com/stevearc/oil.nvim', 'https://github.com/catppuccin/nvim', 'https://github.com/ibhagwan/fzf-lua', 'https://github.com/cbochs/grapple.nvim', 'https://github.com/direnv/direnv.vim' }) vim.api.nvim_create_autocmd('FileType', { pattern = { 'lua', 'python', 'javascript', 'typescript', 'rust', 'go', 'c' }, callback = function() -- Enable syntax highlighting vim.treesitter.start() -- Enable treesitter-based folding vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' vim.wo.foldmethod = 'expr' -- Enable treesitter-based indentation (experimental) vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" vim.opt.foldenable = false -- Keep folds open by default end, }) require("oil").setup() require('grapple').setup({ scope = "git", icons = false, }) local grapple = require("grapple") vim.keymap.set("n", "a", grapple.toggle, { desc = "Grapple toggle tag" }) vim.keymap.set("n", "m", grapple.toggle_tags, { desc = "Grapple open tags menu" }) vim.keymap.set("n", "", function() grapple.select({ index = 1 }) end, { desc = "Grapple jump 1" }) vim.keymap.set("n", "", function() grapple.select({ index = 2 }) end, { desc = "Grapple jump 2" }) vim.keymap.set("n", "", function() grapple.select({ index = 3 }) end, { desc = "Grapple jump 3" }) vim.keymap.set("n", "", function() grapple.select({ index = 4 }) end, { desc = "Grapple jump 4" }) -- mini require('mini.ai').setup() require('mini.pairs').setup() require('mini.surround').setup() require('mini.statusline').setup() require('mini.starter').setup() require('mini.basics').setup() require('mini.comment').setup() require('mini.cmdline').setup() require('mini.diff').setup() require('mini.notify').setup() require('mini.git').setup() require('mini.cursorword').setup() require('mini.hipatterns').setup() require('mini.indentscope').setup() require('mini.tabline').setup() require('mini.trailspace').setup() require('mini.completion').setup({ -- Delay in milliseconds before the menu pops up (lower is faster) delay = { completion = 50, info = 100, signature = 50 }, -- Configure what gets scraped lsp_completion = { -- Use Neovim's native omnifunc for LSP results source_func = 'omnifunc', -- Automatically fall back to buffer words if LSP has no results auto_setup = true, }, }) vim.diagnostic.config({ -- Show the error message at the end of the line (Virtual Text) virtual_text = true, signs = true, underline = true, update_in_insert = false, -- Make the floating window look a bit nicer float = { border = 'rounded', source = true, -- Shows which LSP sent the error }, }) -- fzf local fzf = require('fzf-lua') vim.keymap.set('n', 'pf', fzf.files, { desc = 'Fuzzy find files' }) vim.keymap.set('n', '', fzf.git_files, { desc = 'Fuzzy find git files' }) vim.keymap.set('n', 'ps', fzf.live_grep, { desc = 'Grep text in project' }) vim.keymap.set('n', 'pb', fzf.buffers, { desc = 'Search active buffers' }) -- lsp vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(args) local _ = vim.lsp.get_client_by_id(args.data.client_id) local bufnr = args.buf -- Buffer-local LSP keymaps local opts = { buffer = bufnr } vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, opts) vim.keymap.set('n', 'so', 'FzfLua lsp_document_symbols', { desc = 'Fuzzy find document symbols' }) vim.keymap.set('n', 'sO', 'FzfLua lsp_live_workspace_symbols', { desc = 'Fuzzy find workspace symbols' }) vim.keymap.set('n', 'f', function() vim.lsp.buf.format({ async = true }) end, opts) end, }) require('lazydev').setup({ library = { -- This explicitly adds Neovim's built-in vim.uv (libuv) types { path = "luvit-meta/library", words = { "vim%.uv" } }, }, }) vim.lsp.config('lua_ls', { settings = { Lua = { diagnostics = { globals = { 'vim' }, }, workspace = { library = vim.api.nvim_get_runtime_file("", true), checkThirdParty = false, }, telemetry = { enable = false, }, } } }) vim.lsp.enable('lua_ls') vim.lsp.enable('clangd') vim.lsp.enable('basedpyright')