" 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' " TODO: 2022-06-19 Treesitter is too slow on large C++ files " Plug 'https://github.com/nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} Plug 'https://github.com/bfrg/vim-cpp-modern' " FZF Plug 'junegunn/fzf' Plug 'junegunn/fzf.vim' " FZF for LSP Plug 'gfanto/fzf-lsp.nvim' Plug 'nvim-lua/plenary.nvim' " odin for syntax highlighting Plug 'https://github.com/Tetralux/odin.vim' Plug 'https://github.com/sainnhe/gruvbox-material' " Lua cache to speed up load times Plug 'https://github.com/lewis6991/impatient.nvim' " lsp-zero begin " LSP Support Plug 'neovim/nvim-lspconfig' Plug 'williamboman/mason.nvim' Plug 'williamboman/mason-lspconfig.nvim' " Autocompletion Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/cmp-path' Plug 'saadparwaiz1/cmp_luasnip' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'hrsh7th/cmp-nvim-lua' " Snippets Plug 'L3MON4D3/LuaSnip' " Snippet collection (Optional) Plug 'rafamadriz/friendly-snippets' Plug 'VonHeikemen/lsp-zero.nvim' " lsp-zero end call plug#end() " Lua Setup " ============================================================================== lua <-,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, }) -- Check if there were args (i.e. opened file), non-empty buffer, or started in insert mode if vim.fn.argc() == 0 or vim.fn.line2byte("$") ~= -1 and not opt.insertmode then local ascii = { "", " Useful Bindings (Normal Mode)", " --------------------------------------------------", " to open the file tree explorer", " clang format selected lines", " jump to next compilation error", " jump to prev compilation error", " change working directory to current file", " <\\s> split buffer vertically", "", " Abolish (Text Substitution in Normal Mode)", " --------------------------------------------------", " %S/facilit{y,ies}/building{,s}/g Convert facility->building, facilities->buildings", " %S/action/sleep/g Convert action to sleep, (preserve case sensitivity ACTION->SLEEP, action->sleep) ", "", " FZF (Normal Mode)", " --------------------------------------------------", " <\\h> vim command history", " <\\f> find files", " <\\g> search for text (via ripgrep)", " <\\tt> search for tag (global)", " <\\tb> search for tag (buffer)", " <\\cc> search for commit (global)", " <\\cb> search for commit (buffer)", " <\\b> search for buffer", "", " Autocompletion (nvim-cmp in Normal Mode)", " --------------------------------------------------", " Confirms selection.", " Confirms selection.", " Navigate to previous item on the list.", " Navigate to the next item on the list.", " Navigate to previous item on the list.", " Navigate to the next item on the list.", " Scroll up in the item's documentation.", " Scroll down in the item's documentation.", " Toggles the completion.", " Go to the next placeholder in the snippet.", " Go to the previous placeholder in the snippet.", " Enables completion when the cursor is inside a word. If the completion menu is visible it will navigate to the next item in the list.", " When the completion menu is visible navigate to the previous item in the list.", "", " LSP Bindings (Normal Mode)", " --------------------------------------------------", " Displays hover information about the symbol under the cursor in a floating window. See help vim.lsp.buf.hover().", " gd Jumps to the definition of the symbol under the cursor. See help vim.lsp.buf.definition().", " gD Jumps to the declaration of the symbol under the cursor. Some servers don't implement this feature. See help vim.lsp.buf.declaration().", " gi Lists all the implementations for the symbol under the cursor in the quickfix window. See help vim.lsp.buf.implementation().", " go Jumps to the definition of the type of the symbol under the cursor. See help vim.lsp.buf.type_definition().", " gr Lists all the references to the symbol under the cursor in the quickfix window. See help vim.lsp.buf.references().", " Displays signature information about the symbol under the cursor in a floating window. See help vim.lsp.buf.signature_help(). If a mapping already exists for this key this function is not bound.", " Renames all references to the symbol under the cursor. See help vim.lsp.buf.rename().", " Selects a code action available at the current cursor position. See help vim.lsp.buf.code_action().", " gl Show diagnostics in a floating window. See :help vim.diagnostic.open_float().", " [d Move to the previous diagnostic in the current buffer. See :help vim.diagnostic.goto_prev().", " ]d Move to the next diagnostic. See :help vim.diagnostic.goto_next()." } local height = vim.api.nvim_get_option("lines") local width = vim.api.nvim_get_option("columns") local ascii_rows = #ascii local ascii_cols = #ascii[1] local win = vim.api.nvim_get_current_win() local buf = vim.api.nvim_create_buf(true, true) local function reset_start_screen() vim.cmd("enew") local buf = vim.api.nvim_get_current_buf() local win = vim.api.nvim_get_current_win() vim.api.nvim_buf_set_option(buf, "modifiable", true) vim.api.nvim_buf_set_option(buf, "buflisted", true) vim.api.nvim_buf_set_option(buf, "buflisted", true) end vim.api.nvim_buf_set_lines(buf, 0, -1, false, ascii) vim.api.nvim_buf_set_option(buf, "modified", false) vim.api.nvim_buf_set_option(buf, "buflisted", false) vim.api.nvim_buf_set_option(buf, "bufhidden", "wipe") vim.api.nvim_buf_set_option(buf, "buftype", "nofile") vim.api.nvim_buf_set_option(buf, "swapfile", false) vim.api.nvim_set_current_buf(buf) vim.api.nvim_create_autocmd("InsertEnter,WinEnter", { pattern = "", callback = reset_start_screen, }) end -- Adjust the quick fix window that pops-up on build to size the buffer with -- the size of the output and at most 10 lines. function AdjustQuickfixHeight() local num_lines = vim.fn.line('$') local max_height = 10 local height = math.min(num_lines, max_height) vim.cmd(height .. 'wincmd _') end vim.cmd[[ autocmd BufWinEnter quickfix lua AdjustQuickfixHeight() ]] 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 " Resize splits when the window is resized au VimResized * :wincmd = " File patterns to ignore in command line auto complete set wildignore+=*.class,*.o set wildignore+=*\\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! RemedyBGOpenFile() execute("!start remedybg open-file " . expand("%:p") . " " . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate(' - RemedyBG')") endfunction command RemedyBGOpenFile call RemedyBGOpenFile() function! RemedyBGStartDebugging() execute("!start remedybg start-debugging " . expand("%:p") . " " . line(".")) endfunction command RemedyBGStartDebugging call RemedyBGStartDebugging() function! RemedyBGStopDebugging() execute("!start remedybg stop-debugging " . expand("%:p") . " " . line(".")) endfunction command RemedyBGStopDebugging call RemedyBGStopDebugging() function! RemedyBGRunToCursor() execute("!start remedybg open-file " . expand("%:p") . " " . line(".")) execute("!start remedybg run-to-cursor " . expand("%:p") . " " . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate(' - RemedyBG')") endfunction command RemedyBGRunToCursor call RemedyBGRunToCursor() function! RemedyBGAddBreakpointAtFile() execute("!start remedybg open-file " . expand("%:p") . " " . line(".")) execute("!start remedybg add-breakpoint-at-file " . expand("%:p") . " " . line(".")) execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate(' - RemedyBG')") endfunction command RemedyBGAddBreakpointAtFile call RemedyBGAddBreakpointAtFile() " FZF " ============================================================================== " Empty value to disable preview window altogether let g:fzf_preview_window = [] " Prefix all commands with Fzf for discoverability let g:fzf_command_prefix = 'Fzf' " - down / up / left / right let g:fzf_layout = { 'down': '40%' } command! -nargs=* -bang FzfCustomRG call RipgrepFzf(, 0) " Augment the "FzfCustomFiles" command command! -bang -nargs=? -complete=dir FzfCustomFiles \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, 0) " General Key Bindings " ============================================================================== " FZF Bindings nnoremap h FzfHistory nnoremap f FzfCustomFiles nnoremap g FzfRg nnoremap t :FzfWorkspaceSymbols nnoremap cc FzfCommits nnoremap cb FzfBCommits nnoremap b FzfBuffers nnoremap RemedyBGOpenFile nnoremap RemedyBGStartDebugging nnoremap RemedyBGStopDebugging nnoremap RemedyBGAddBreakpointAtFile nnoremap RemedyBGRunToCursor " 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 " Clang Format " ============================================================================== map :py3file ~/clang-format.py " Compiler Error Formats " ============================================================================== " Error message formats thanks to " https://forums.handmadehero.org/index.php/forum?view=topic&catid=4&id=704#3982 set errorformat+=\\\ %#%f(%l\\\,%c):\ %m " MSVC: MSBuild set errorformat+=\\\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %m " MSVC: cl.exe set errorformat+=\\\ %#%t%nxx:\ %m " MSVC: cl.exe, fatal errors is crudely implemented set errorformat+=\\\ %#LINK\ :\ %m " MSVC: link.exe, can't find link library badly implemented set errorformat+=\\\ %#%s\ :\ error\ %m " MSVC: link.exe, errors is badly implemented set errorformat+=\\\ %#%s\ :\ fatal\ error\ %m " MSVC: link.exe, fatal errors is badly implemented set errorformat+=\\\ %#%f(%l\\\,%c-%*[0-9]):\ %#%t%[A-z]%#\ %m " MSVC: HLSL fxc.exe set errorformat+=%\\%%(CTIME%\\)%\\@=%m " ctime.exe -stats " Vim Dispatch " ============================================================================== let s:running_windows = has("win16") || has("win32") || has("win64") if s:running_windows set makeprg=build nnoremap :Make ./build.bat else " Set vim terminal to enter normal mode using escape like normal vim behaviour tnoremap nnoremap :Make ./build.sh set makeprg=./build.sh endif