" ============================================================================== " Plugins " ============================================================================== let s:running_windows = has("win16") || has("win32") || has("win64") silent! call plug#begin('~/.vim/plugged') Plug 'https://github.com/ervandew/supertab' Plug 'https://github.com/scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } Plug 'https://github.com/tpope/vim-fugitive' Plug 'https://github.com/bfrg/vim-cpp-modern' Plug 'https://github.com/skywind3000/asyncrun.vim' Plug 'https://github.com/junegunn/fzf' Plug 'https://github.com/junegunn/fzf.vim' Plug 'https://github.com/Tetralux/odin.vim' " Themes Plug 'https://github.com/tomasr/molokai' Plug 'https://github.com/roosta/vim-srcery' Plug 'https://github.com/morhetz/gruvbox' call plug#end() " ============================================================================== " Settings " ============================================================================== set nocompatible set autowrite " Automatically save before commands like :next and :make set autoread " Auto reload changed files set backspace=2 " Backspace like most programs in insert mode set hidden " Allow more than one modified buffer to be left without saving set incsearch " Do incremental searching set ignorecase " Search isn't case sensitive set lazyredraw " Redraw the screen less often set nowrap " No softwrapping by default set splitright " Open new v-splits to the right set showcmd " Display incomplete commands set vb " Turn on screen flash which is quieter than audio bell set wildmenu " Allow vim command-line autocompletion set wildmode=full " Specifies option for wildmenu set expandtab " Turn tabs into spaces set noswapfile " Disable swapfile set cscopetag " Search both cscopes db and tags file" " Ignore files in commandline autocomplete set wildignore+=*.class,*.o set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe,*.obj,*.vcxproj,*.pdb,*.idb " Undo Settings silent! set undofile " Save undo history to file set undolevels=1000 " Maximum number of undos that can be done let &undodir=expand("~/.vim/undodir") " Set location to save undo files " Create the undo history folder if it doesn't exist if !isdirectory(expand(&undodir)) call mkdir(expand(&undodir), "p") endif " ============================================================================== " Appearance " ============================================================================== syntax on " syntax highlighting set autoindent " Always use autoindent set background=dark " Some themes use this indicator to theme themselves set colorcolumn=80,100 " Set a 80, 100 char column marker set cpoptions+=$ " $ as end marker for the change operator set cursorline " Highlight current line set encoding=utf-8 " Consistent character encoding set fileformats=unix,dos " opens a fold at the cursor. " opens all folds at the cursor. " closes a fold at the cursor. " increases the foldlevel by one. " closes all open folds. " decreases the foldlevel by one. " decreases the foldlevel to zero -- all folds will be open. set foldlevelstart=99 " Initially all folds open set foldmethod=indent " Allow folding of set foldnestmax=20 " Maximum number of nested folds set guioptions=menu " remove extra gui elements set laststatus=2 " always show status bar set linebreak " When wrapping lines, don't break words set list " Show 'listchar' characters set number " Show line numbers set relativenumber " Show relative line numbers set ruler " show the cursor position all the time set shiftwidth=4 " Number of space chars for indentation set showmatch " automatically show matching brackets. works like it does in bbedit. set smartindent set smarttab " Make 'tab' insert indents at the beginning of a line set tabstop=4 " Number of space chars for pressing tab set textwidth=80 " Always format to 80 chars set listchars=tab:>- " 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 = " ============================================================================== " Theme " ============================================================================== let g:gruvbox_contrast_dark='hard' let g:gruvbox_italic=0 let g:gruvbox_bold=0 colorscheme gruvbox " NOTE(doyle): Some list chars in gui don't show correctly in terminal so separate logic " old listchars=tab:>-,eol:¬,trail:■,extends:»,precedes:« set listchars+=trail:■,extends:»,precedes:« if s:running_windows set guifont=JetBrains_Mono:h9,Consolas:h9 else set guifont=InputMonoCondensed:h9 endif " Don't show trailing spaces in insert mode augroup trailing au! au InsertEnter * :set listchars-=trail:■ au InsertLeave * :set listchars+=trail:■ augroup END " 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 " ============================================================================== " Key Bindings " ============================================================================== " Enable mouse support if has('mouse') set mouse=a endif " 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 " ============================================================================== " FZF " ============================================================================== nnoremap f :FzfFiles nnoremap t :FzfTags nnoremap r :FzfRg nnoremap b :FzfBuffers nnoremap l :FzfLines " 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%' } " ============================================================================== " Clang Format " ============================================================================== map :py3file ~/.vim/clang-format.py " ============================================================================== " Compiling / AsyncRun " ============================================================================== " Asyncrun open quickfix window up to 10 lines let g:asyncrun_open = 10 " 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 if s:running_windows set makeprg=build nnoremap :AsyncRun ./build.bat else " Set vim terminal to enter normal mode using escape like normal vim behaviour tnoremap nnoremap :AsyncRun ./build.sh set makeprg=./build.sh endif " ============================================================================== " Other " ============================================================================== " Reload vimrc when it's edited augroup myvimrc au! au BufWritePost $MYVIMRC so $MYVIMRC augroup end " Return to the same line when a file is reopened augroup line_return au! au BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ execute 'normal! g`"zvzz' | \ endif augroup end