" Plugins ////////////////////////////////////////////////////////////////////////////////////////// call plug#begin(stdpath('config') . '/plugged') " nerdtree provides a file tree explorer " vim-dispatch allows running async jobs in vim (i.e. builds in the background) Plug 'https://github.com/scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } Plug 'https://github.com/tpope/vim-dispatch' Plug 'https://github.com/tpope/vim-fugitive' Plug 'https://github.com/tpope/vim-abolish' Plug 'https://github.com/LunarVim/bigfile.nvim' " FZF Plug 'junegunn/fzf' Plug 'ibhagwan/fzf-lua', {'branch': 'main'} Plug 'nvim-tree/nvim-web-devicons' " Other //////////////////////////////////////////////////////////////////////////////////////// " TODO: 2022-06-19 Treesitter is too slow on large C++ files " Plug 'https://github.com/nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} Plug 'junegunn/vim-easy-align' Plug 'https://github.com/bfrg/vim-cpp-modern' Plug 'https://github.com/ggandor/leap.nvim' Plug 'https://github.com/sainnhe/gruvbox-material' Plug 'https://github.com/Tetralux/odin.vim' "Odin Syntax highlighting " NOTE: LLM Plug 'nvim-treesitter/nvim-treesitter' Plug 'nvim-lua/plenary.nvim' Plug 'olimorris/codecompanion.nvim' " lsp-zero begin " LSP Support Plug 'williamboman/mason.nvim' Plug 'williamboman/mason-lspconfig.nvim' Plug 'neovim/nvim-lspconfig' Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'L3MON4D3/LuaSnip' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/cmp-path' " lsp-zero end call plug#end() " Lua Setup //////////////////////////////////////////////////////////////////////////////////////// lua <', '(leap)') vim.keymap.set({'n', 'x', 'o'}, '', '(leap-from-window)') require('bigfile').setup() require('fzf-lua').setup{ winopts = { height=0.95, width=0.95 } } -- Vim Dispatch ////////////////////////////////////////////////////////////////////////////////// if vim.fn.has('win64') or vim.fn.has('win32') or vim.fn.has('win16') then if os.getenv('SHELL') ~= nil then vim.o.shellcmdflag = '-c' vim.o.makeprg = "./build.sh" else vim.o.makeprg = "build.bat" end else -- vim.api.nvim_set_keymap('t', '', '', {noremap = true}) vim.o.makeprg = "./build.sh" end vim.api.nvim_set_keymap('n', '', ':Make', {noremap = true}) -- LSP Setup ///////////////////////////////////////////////////////////////////////////////////// require('mason').setup({}) require('mason-lspconfig').setup({ ensure_installed = { "clangd" }, automatic_enable = true }) local opts = { noremap = true, silent = true } vim.keymap.set("n", "", vim.lsp.buf.rename, opts) vim.keymap.set("n", "", vim.lsp.buf.code_action, opts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, {name = 'buffer'}, {name = 'path'}, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.confirm({select = false}), [''] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), [''] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), }), snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) end, }, --- (Optional) Show source name in completion menu formatting = cmp_format, }) require("codecompanion").setup({ display = { chat = { auto_scroll = false, fold_context = true, show_settings = true, show_header_separator = true, } }, adapters = { opts = { show_defaults = false, }, llamafile = function() return require("codecompanion.adapters").extend("openai_compatible", { env = { url = "http://127.0.0.1:7483", -- optional: default value is ollama url http://127.0.0.1:11434 chat_url = "/v1/chat/completions", -- optional: default value, override if different -- api_key = "OpenAI_API_KEY", -- optional: if your endpoint is authenticated -- models_endpoint = "/v1/models", -- optional: attaches to the end of the URL to form the endpoint to retrieve models }, -- schema = { -- model = { -- default = "deepseek-r1-671b", -- define llm model to be used -- }, -- temperature = { -- order = 2, -- mapping = "parameters", -- type = "number", -- optional = true, -- default = 0.8, -- desc = "What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or top_p but not both.", -- validate = function(n) -- return n >= 0 and n <= 2, "Must be between 0 and 2" -- end, -- }, -- max_completion_tokens = { -- order = 3, -- mapping = "parameters", -- type = "integer", -- optional = true, -- default = nil, -- desc = "An upper bound for the number of tokens that can be generated for a completion.", -- validate = function(n) -- return n > 0, "Must be greater than 0" -- end, -- }, -- stop = { -- order = 4, -- mapping = "parameters", -- type = "string", -- optional = true, -- default = nil, -- desc = "Sets the stop sequences to use. When this pattern is encountered the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.", -- validate = function(s) -- return s:len() > 0, "Cannot be an empty string" -- end, -- }, -- logit_bias = { -- order = 5, -- mapping = "parameters", -- type = "map", -- optional = true, -- default = nil, -- desc = "Modify the likelihood of specified tokens appearing in the completion. Maps tokens (specified by their token ID) to an associated bias value from -100 to 100. Use https://platform.openai.com/tokenizer to find token IDs.", -- subtype_key = { -- type = "integer", -- }, -- subtype = { -- type = "integer", -- validate = function(n) -- return n >= -100 and n <= 100, "Must be between -100 and 100" -- end, -- }, -- }, -- }, }) end, }, strategies = { chat = { adapter = "llamafile" }, inline = { adapter = "llamafile" }, cmd = { adapter = "llamafile" }, } }) require'nvim-treesitter.configs'.setup { auto_install = false, } -- Treesitter //////////////////////////////////////////////////////////////////////////////////// -- TODO: 2022-06-19 Treesitter is too slow on large C++ files -- require('nvim-treesitter.configs').setup { -- ensure_installed = { "c", "cpp" }, -- A list of parser names, or "all" -- sync_install = false, -- Install parsers synchronously (only applied to `ensure_installed`) -- ignore_install = { }, -- List of parsers to ignore installing (for "all") -- highlight = { -- enable = false, -- `false` will disable the whole extension -- -- NOTE: these are the names of the parsers and not the filetype. (for example if you want to -- -- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is -- -- the name of the parser) -- -- list of language that will be disabled -- disable = { }, -- -- Setting this to true will run `:h syntax` and tree-sitter at the same time. -- -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). -- -- Using this option may slow down your editor, and you may see some duplicate highlights. -- -- Instead of true it can also be a list of languages -- additional_vim_regex_highlighting = false, -- }, -- } -- Per-Project Bindings ///////////////////////////////////////////////////////////////////////////// -- Automatically load project file on buffer enter vim.api.nvim_create_autocmd({"BufEnter"}, { callback = function(ev) local project_file = vim.fn.expand('%:p:h') .. '/project_nvim.lua' if vim.fn.filereadable(project_file) == 1 then vim.cmd('luafile ' .. vim.fn.fnameescape(project_file)) end end }) -- Vim Options /////////////////////////////////////////////////////////////////////////////////// vim.opt.autowrite=true -- Automatically save before cmds like :next and :prev vim.opt.colorcolumn={80, 100} -- Set a 80 and 100 char column ruler vim.opt.completeopt={'menu', 'menuone', 'noselect'} vim.opt.cpoptions:append('$') -- $ as end marker for the change operator vim.opt.cursorline=true -- Highlight current line vim.opt.expandtab=true -- Replace tabs with spaces vim.opt.guifont='JetBrains_Mono:h9','Consolas:h9','InputMonoCondensed:h9' vim.opt.hlsearch=false -- Highlight just the first match on search vim.opt.ignorecase=true -- Search is not case sensitive vim.opt.linebreak=true -- On wrapped lines, break on the wrapping word intelligently vim.opt.list=true -- Show the 'listchar' characters on trailing spaces, tabs e.t.c === vim.opt.listchars:append('tab:>-,trail:■,extends:»,precedes:«') vim.opt.number=true -- Show line numbers vim.opt.relativenumber=true -- Show relative line numbers vim.opt.shiftwidth=4 -- Number of spaces for each autoindent step vim.opt.splitright=true -- Open new splits to the right of the current one vim.opt.swapfile=false -- Disable swapfile (stores the things changed in a file) vim.opt.textwidth=80 -- On format, format to 80 char long lines vim.opt.visualbell=true -- Flash the screen on error vim.opt.wrap=false -- Don't wrap lines of text automatically vim.opt.signcolumn = 'no' vim.diagnostic.config({ -- Turn off the diagnostics signs on the line number. In LSP mode, editing -- a C++ buffer constantly toggles the sign column on and off as you change -- modes which is very visually distracting. signs = false, virtual_text = true }) -- Automatically scroll to bottom of quickfix window when opened vim.cmd([[ autocmd FileType qf lua vim.cmd('normal! G') ]]) EOF " Theme //////////////////////////////////////////////////////////////////////////////////////////// let g:gruvbox_material_background='hard' let g:gruvbox_material_foreground='mix' let g:gruvbox_material_disable_italic_comment=1 let g:gruvbox_material_enable_italic=0 let g:gruvbox_material_enable_bold=0 let g:gruvbox_material_diagnostic_virtual_text='colored' let g:gruvbox_material_better_performance=1 colorscheme gruvbox-material " Vim-cpp-modern customisation " Disable function highlighting (affects both C and C++ files) let g:cpp_function_highlight = 1 " Enable highlighting of C++11 attributes let g:cpp_attributes_highlight = 1 " Highlight struct/class member variables (affects both C and C++ files) let g:cpp_member_highlight = 0 " Put all standard C and C++ keywords under Vim's highlight group 'Statement' " (affects both C and C++ files) let g:cpp_simple_highlight = 1 " Options ////////////////////////////////////////////////////////////////////////////////////////// " Show EOL type and last modified timestamp, right after the filename set statusline=%<%F%h%m%r\ [%{&ff}]\ (%{strftime(\"%H:%M\ %d/%m/%Y\",getftime(expand(\"%:p\")))})%=%l,%c%V\ %P " File patterns to ignore in command line auto complete set wildignore+=*.class,*.o,*\\tmp\\*,*.swp,*.zip,*.exe,*.obj,*.vcxproj,*.pdb,*.idb " Setup undo file set undofile let &undodir=stdpath('config') . '/undo' " Setup backup directory let &backupdir=stdpath('config') . '/backup' " Enable mouse support if has('mouse') set mouse=a endif " Functions //////////////////////////////////////////////////////////////////////////////////////// " Increase font size using (Ctrl+Up Arrow) or (Ctrl+Down Arrow) if we are using " gvim Otherwise font size is determined in terminal nnoremap :silent! let &guifont = substitute( \ &guifont, \ ':h\zs\d\+', \ '\=eval(submatch(0)+1)', \ 'g') nnoremap :silent! let &guifont = substitute( \ &guifont, \ ':h\zs\d\+', \ '\=eval(submatch(0)-1)', \ 'g') " Formatting options (see :h fo-table) augroup persistent_settings au! au bufenter * :set formatoptions=q1j augroup end function! RADDbgOpenFile() execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g')) execute("!dev raddbg --ipc goto_line " . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')") endfunction command RADDbgOpenFile call RADDbgOpenFile() function! RADDbgStartDebugging() execute("!dev raddbg --ipc run") endfunction command RADDbgStartDebugging call RADDbgStartDebugging() function! RADDbgStopDebugging() execute("!dev raddbg --ipc kill_all") endfunction command RADDbgStopDebugging call RADDbgStopDebugging() function! RADDbgRunToCursor() execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g')) execute("!dev raddbg --ipc goto_line " . line(".")) execute("!dev raddbg --ipc run_to_cursor " . substitute(expand("%:p"), '\\', '/', 'g') . ":" . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')") endfunction command RADDbgRunToCursor call RADDbgRunToCursor() function! RADDbgAddBreakpointAtFile() execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g')) execute("!dev raddbg --ipc goto_line " . line(".")) execute("!dev raddbg --ipc toggle_breakpoint " . substitute(expand("%:p"), '\\', '/', 'g') . ":" . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')") endfunction command RADDbgAddBreakpointAtFile call RADDbgAddBreakpointAtFile() nnoremap RADDbgOpenFile nnoremap RADDbgStartDebugging nnoremap RADDbgStopDebugging nnoremap RADDbgAddBreakpointAtFile nnoremap RADDbgRunToCursor " General Key Bindings ///////////////////////////////////////////////////////////////////////////// " FZF Bindings nnoremap h FzfLua oldfiles nnoremap f FzfLua files nnoremap r FzfLua live_grep nnoremap R FzfLua grep_cword nnoremap t FzfLua lsp_live_workspace_symbols nnoremap T FzfLua lsp_finder nnoremap b FzfLua buffers nnoremap c CodeCompanionChat toggle nnoremap FzfLua " Map Ctrl+HJKL to navigate buffer window nmap :wincmd h nmap :wincmd j nmap :wincmd k nmap :wincmd l " Move by wrapped lines instead of line numbers nnoremap j gj nnoremap k gk nnoremap gj j nnoremap gk k " Map NERDTree to Ctrl-N map :NERDTreeToggle " Change to current buffer's directory nmap cd :cd =expand("%:p:h") " Buffer Splitting nnoremap s :vs " Go to next error " Go to previous error nnoremap :cn nnoremap :cp " In Neovim terminal, pressing should go back into normal mode. " Without this, this doesn't happen and you stay stuck in insert mode. tnoremap " Easy-Align /////////////////////////////////////////////////////////////////////////////////////// let g:easy_align_delimiters = { \ '>': { 'pattern': '>>\|=>\|>' }, \ '/': { \ 'pattern': '//\+\|/\*\|\*/', \ 'delimiter_align': 'l', \ 'ignore_groups': ['!Comment'] }, \ ']': { \ 'pattern': '[[\]]', \ 'left_margin': 0, \ 'right_margin': 0, \ 'stick_to_left': 0 \ }, \ ')': { \ 'pattern': '[)]', \ 'left_margin': 0, \ 'right_margin': 0, \ 'stick_to_left': 0 \ }, \ '(': { \ 'pattern': '[(]', \ 'left_margin': 0, \ 'right_margin': 0, \ 'stick_to_left': 0 \ }, \ } " Enter live-interactive easy align mode when a visual selection is active xmap a (LiveEasyAlign)