" ============================================================================== " Plugins " ============================================================================== let s:running_windows = has("win16") || has("win32") || has("win64") if s:running_windows let g:myvimdir ="~/vimfiles" silent! call plug#begin('~/vimfiles/plugged') else let g:myvimdir ="~/.vim" silent! call plug#begin('~/.vim/plugged') endif 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/Yggdroot/LeaderF' " 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(g:myvimdir."/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 set foldlevelstart=99 " Initially all folds open set foldmethod=indent " Allow folding of set foldnestmax=1 " Maximum number of nested folds set guioptions= " 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 if has("gui_running") " 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=Consolas:h11 else set guifont=InputMonoCondensed:h10 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') else set t_Co=256 " 256 colors let &t_AB="\e[48;5;%dm" " vodoo magic for CONEMU let &t_AF="\e[38;5;%dm" " vodoo magic for CONEMU set listchars+=trail:$,extends:>,precedes:< " Fix Cmder backspace bug inoremap nnoremap endif " 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 " Fullscreen if s:running_windows noremap :call libcallnr('gvim_fullscreen.dll', 'ToggleFullscreen', 0) endif " ============================================================================== " Leaderf " ============================================================================== " Config let g:Lf_MruFileExclude = ['*.so', '*.tmp', '*.bak', '*.exe', '*.dll'] " Bindings nnoremap b :=printf("Leaderf buffer %s", "") nnoremap f :=printf("Leaderf file %s", "") nnoremap l :=printf("Leaderf line %s", "") nnoremap m :=printf("Leaderf mru %s", "") nnoremap p :=printf("Leaderf function %s", "") nnoremap t :=printf("Leaderf tag %s", "") nnoremap h :=printf("Leaderf self %s", "") noremap :=printf("Leaderf bufTag %s", "") noremap :=printf("Leaderf! rg -e %s ", expand("")) " ============================================================================== " Clang Format " ============================================================================== if s:running_windows map :pyf $home\.vim\clang-format.py imap :pyf $home\.vim\clang-format.pyi else map :py3f ~/.vim/clang-format.py imap :py3f ~/.vim/clang-format.pyi endif " ============================================================================== " 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