" // Startup /////////////////////////////////////////////////////////////////// " Windows/Linux differences let s:running_windows = has("win16") || has("win32") || has("win64") set nocompatible 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 " {on} Means to lazy-load when that command is invoked Plug 'https://github.com/ervandew/supertab' 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/bfrg/vim-cpp-modern' Plug 'https://github.com/junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'https://github.com/junegunn/fzf.vim' " Themes Plug 'https://github.com/tomasr/molokai' Plug 'https://github.com/roosta/vim-srcery' Plug 'https://github.com/morhetz/gruvbox' call plug#end() " // General Settings ////////////////////////////////////////////////////////// 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 //////////////////////////////////////////////////////////////// " Fix C-syntax highlighting marking valid curly braces as invalid " let c_no_curly_error=1 syntax on " syntax highlighting set laststatus=2 " always show status bar set ruler " show the cursor position all the time set guioptions= " remove extra gui elements set cpoptions+=$ " $ as end marker for the change operator set showmatch " automatically show matching brackets. works like it does in bbedit. set number " Show line numbers set relativenumber " Show relative line numbers set background=dark " Some themes use this indicator to theme themselves set cursorline " Highlight current line set colorcolumn=80,100 " Set a 80, 100 char column marker " 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 = set autoindent " Always use autoindent set encoding=utf-8 " Consistent character encoding set foldnestmax=1 " Maximum number of nested folds " set foldlevel=99 " Initially all folds open set foldlevelstart=99 " Initially all folds open set foldmethod=indent " Allow folding of set linebreak " When wrapping lines, don't break words set list " Show 'listchar' characters set shiftwidth=4 " Number of space chars for indentation 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 fileformats=unix,dos set listchars=tab:>- 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 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 augroup persistent_settings au! " Formatting options (see :h fo-table) au BufEnter * :set formatoptions=q1j augroup END " Key Mappings & Functions /////////////////////////////////////////////////////// " 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") " Show list of buffers using leader key (default \)b nnoremap b :Buffers nnoremap s :vs nnoremap f :Files nnoremap t :Tags nnoremap l :Lines nnoremap a :Ag " Execute clang format on tab 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 " Increase font size using (Ctrl+Up Arrow) or (Ctrl+Down Arrow) if we are using " gvim Otherwise font size is determined in terminal if has ('gui_running') 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') endif " 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 " 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 :!start cmd /c run else " Set vim terminal to enter normal mode using escape like normal vim behaviour tnoremap set makeprg=./build.sh endif "Go to next error "Go to previous error nnoremap :Make nnoremap :cn nnoremap :cp " Push Quickfix (qf) window to the bottom of the screen. autocmd FileType qf wincmd J " Resize Quickfix (qf) to a maximum of 10 lines depending on the actual contents au FileType qf call AdjustWindowHeight(3, 10) function! AdjustWindowHeight(minheight, maxheight) exe max([min([line("$"), a:maxheight]), a:minheight]) . "wincmd _" endfunction " Fzf let g:fzf_tags_command = 'ctags -R --c++-kinds=+p --fields=+iaS' " Fullscreen noremap :call libcallnr('gvim_fullscreen.dll', 'ToggleFullscreen', 0)