" ============================================================================ " Vim Configuration - The Ultimate vimrc " Inspired by the best practices from the Vim community " ============================================================================ " ============================================================================ " => General Settings " ============================================================================ " Disable compatibility with vi which can cause unexpected issues set nocompatible " Enable type file detection. Vim will be able to try to detect the type of file in use filetype on " Enable plugins and load plugin for the detected file type filetype plugin on " Load an indent file for the detected file type filetype indent on " Turn syntax highlighting on syntax on " Add numbers to each line on the left-hand side set number " Show relative line numbers set relativenumber " Highlight cursor line underneath the cursor horizontally set cursorline " Set shift width to 4 spaces set shiftwidth=4 " Set tab width to 4 columns set tabstop=4 " Use space characters instead of tabs set expandtab " Do not save backup files set nobackup " Do not let cursor scroll below or above N number of lines when scrolling set scrolloff=10 " Do not wrap lines. Allow long lines to extend as far as the line goes set nowrap " While searching though a file incrementally highlight matching characters as you type set incsearch " Ignore capital letters during search set ignorecase " Override the ignorecase option if searching for capital letters set smartcase " Show partial command you type in the last line of the screen set showcmd " Show the mode you are on the last line set showmode " Show matching words during a search set showmatch " Use highlighting when doing a search set hlsearch " Set the commands to save in history default number is 20 set history=1000 " Enable auto completion menu after pressing TAB set wildmenu " Make wildmenu behave like similar to Bash completion set wildmode=list:longest " There are certain files that we would never want to edit with Vim " Wildmenu will ignore files with these extensions set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx " Enable mouse support set mouse=a " Set encoding set encoding=utf-8 " Better command-line completion set wildmenu " Show cursor position set ruler " Display line numbers set number " Enable folding set foldmethod=indent set foldlevel=99 " Split window settings set splitbelow set splitright " Better backspace behavior set backspace=indent,eol,start " Auto read when file is changed from outside set autoread " Turn on the Wild menu for command completion set wildmenu " Ignore compiled files set wildignore=*.o,*~,*.pyc if has("win16") || has("win32") set wildignore+=.git\*,.hg\*,.svn\* else set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store endif " Always show current position set ruler " Height of the command bar set cmdheight=1 " A buffer becomes hidden when it is abandoned set hid " Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l " Ignore case when searching set ignorecase " When searching try to be smart about cases set smartcase " Highlight search results set hlsearch " Makes search act like search in modern browsers set incsearch " Don't redraw while executing macros (good performance config) set lazyredraw " For regular expressions turn magic on set magic " Show matching brackets when text indicator is over them set showmatch " How many tenths of a second to blink when matching brackets set mat=2 " No annoying sound on errors set noerrorbells set novisualbell set t_vb= set tm=500 " Enable 256 colors palette in Gnome Terminal if $COLORTERM == 'gnome-terminal' set t_Co=256 endif " Set extra options when running in GUI mode if has("gui_running") set guioptions-=T set guioptions-=e set t_Co=256 set guitablabel=%M\ %t endif " Use Unix as the standard file type set ffs=unix,dos,mac " Turn backup off, since most stuff is in SVN, git etc. anyway set nobackup set nowb set noswapfile " ============================================================================ " => Vim-Plug Plugin Manager " ============================================================================ " Auto-install vim-plug let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim' if empty(glob(data_dir . '/autoload/plug.vim')) silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' autocmd VimEnter * PlugInstall --sync | source $MYVIMRC endif " Plugin list call plug#begin('~/.vim/plugged') " ===== File Navigation & Search ===== Plug 'preservim/nerdtree' " File explorer Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' " Fuzzy finder Plug 'ctrlpvim/ctrlp.vim' " Fuzzy file finder " ===== Git Integration ===== Plug 'tpope/vim-fugitive' " Git wrapper Plug 'airblade/vim-gitgutter' " Show git diff in gutter " ===== Status Line & UI ===== Plug 'vim-airline/vim-airline' " Status bar Plug 'vim-airline/vim-airline-themes' " Airline themes " ===== Code Editing & Completion ===== Plug 'tpope/vim-surround' " Surround text objects Plug 'tpope/vim-commentary' " Comment stuff out Plug 'tpope/vim-repeat' " Repeat plugin maps Plug 'jiangmiao/auto-pairs' " Auto close brackets Plug 'dense-analysis/ale' " Async linting engine " ===== Language Support ===== Plug 'sheerun/vim-polyglot' " Language pack Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } " Go support " ===== Color Schemes ===== Plug 'morhetz/gruvbox' " Gruvbox theme Plug 'dracula/vim', { 'as': 'dracula' } " Dracula theme Plug 'altercation/vim-colors-solarized' " Solarized theme Plug 'joshdick/onedark.vim' " One Dark theme " ===== Productivity ===== Plug 'mbbill/undotree' " Undo history visualizer Plug 'preservim/tagbar' " Tag browser Plug 'easymotion/vim-easymotion' " Easy motion " ===== Code Intelligence ===== if has('vim9') || has('nvim') Plug 'neoclide/coc.nvim', {'branch': 'release'} " LSP & Completion endif call plug#end() " ============================================================================ " => Colors and Fonts " ============================================================================ " Enable true colors support if has('termguicolors') set termguicolors endif " Set colorscheme try colorscheme gruvbox set background=dark catch colorscheme desert endtry " Set font for GUI if has("gui_running") if has("gui_gtk2") || has("gui_gtk3") set guifont=Hack\ 12,Source\ Code\ Pro\ 12,Monospace\ 12 elseif has("gui_win32") set guifont=Consolas:h11:cANSI endif endif " ============================================================================ " => Text, Tab and Indent Related " ============================================================================ " Use spaces instead of tabs set expandtab " Be smart when using tabs set smarttab " 1 tab == 4 spaces set shiftwidth=4 set tabstop=4 " Linebreak on 500 characters set lbr set tw=500 set ai "Auto indent set si "Smart indent set wrap "Wrap lines " ============================================================================ " => Key Mappings " ============================================================================ " Set leader key to comma let mapleader = "," " Fast saving nmap w :w! " Fast quitting nmap q :q " Fast save and quit nmap x :x " Disable highlight when is pressed map :noh " Smart way to move between windows map j map k map h map l " Close the current buffer map bd :Bclose:tabclosegT " Close all the buffers map ba :bufdo bd " Next buffer map l :bnext " Previous buffer map h :bprevious " Useful mappings for managing tabs map tn :tabnew map to :tabonly map tc :tabclose map tm :tabmove map t :tabnext " Let 'tl' toggle between this and the last accessed tab let g:lasttab = 1 nmap tl :exe "tabn ".g:lasttab au TabLeave * let g:lasttab = tabpagenr() " Opens a new tab with the current buffer's path map te :tabedit =expand("%:p:h")/ " Switch CWD to the directory of the open buffer map cd :cd %:p:h:pwd " Remap VIM 0 to first non-blank character map 0 ^ " Move a line of text using ALT+[jk] or Command+[jk] on mac nmap mz:m+`z nmap mz:m-2`z vmap :m'>+`mzgv`yo`z vmap :m'<-2`>my`ss :setlocal spell! " Shortcuts using map sn ]s map sp [s map sa zg map s? z= " Remove trailing whitespace nnoremap w :let _s=@/:%s/\s\+$//e:let @/=_s " Toggle paste mode set pastetoggle= " Toggle line numbers nnoremap :set invnumber " Toggle relative line numbers nnoremap :set invrelativenumber " Enable folding with the spacebar nnoremap za " ============================================================================ " => Plugin Settings " ============================================================================ " --- NERDTree --- map :NERDTreeToggle map n :NERDTreeFind " Close vim if the only window left open is a NERDTree autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif " Show hidden files let NERDTreeShowHidden=1 " Ignore files in NERDTree let NERDTreeIgnore=['\.pyc$', '\~$', '\.swp$', '\.git$', '\.DS_Store'] " --- FZF --- map :Files map b :Buffers map rg :Rg map t :Tags " --- CtrlP --- let g:ctrlp_working_path_mode = 'ra' let g:ctrlp_show_hidden = 1 let g:ctrlp_custom_ignore = { \ 'dir': '\v[\/]\.(git|hg|svn)$', \ 'file': '\v\.(exe|so|dll|pyc)$', \ } " --- Airline --- let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#left_sep = ' ' let g:airline#extensions#tabline#left_alt_sep = '|' let g:airline#extensions#tabline#formatter = 'unique_tail' let g:airline_powerline_fonts = 1 let g:airline_theme='gruvbox' " --- GitGutter --- let g:gitgutter_sign_added = '+' let g:gitgutter_sign_modified = '~' let g:gitgutter_sign_removed = '-' let g:gitgutter_sign_removed_first_line = '^' let g:gitgutter_sign_modified_removed = '~' " --- ALE (Asynchronous Lint Engine) --- let g:ale_linters = { \ 'python': ['flake8', 'pylint'], \ 'javascript': ['eslint'], \ 'go': ['gopls', 'golint'], \} let g:ale_fixers = { \ '*': ['remove_trailing_lines', 'trim_whitespace'], \ 'python': ['black', 'isort'], \ 'javascript': ['prettier', 'eslint'], \ 'go': ['gofmt', 'goimports'], \} let g:ale_fix_on_save = 1 let g:ale_sign_error = '✗' let g:ale_sign_warning = '⚠' " Navigate between errors nmap aj :ALENext nmap ak :ALEPrevious " --- Tagbar --- nmap :TagbarToggle " --- UndoTree --- nnoremap :UndotreeToggle " --- EasyMotion --- let g:EasyMotion_do_mapping = 0 " Disable default mappings " Jump to anywhere you want with minimal keystrokes nmap s (easymotion-overwin-f2) " Turn on case-insensitive feature let g:EasyMotion_smartcase = 1 " JK motions: Line motions map j (easymotion-j) map k (easymotion-k) " --- CoC (Conquer of Completion) --- if exists('g:plugs["coc.nvim"]') " Use tab for trigger completion with characters ahead and navigate inoremap \ coc#pum#visible() ? coc#pum#next(1) : \ CheckBackspace() ? "\" : \ coc#refresh() inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" " Make to accept selected completion item inoremap coc#pum#visible() ? coc#pum#confirm() \: "\u\\=coc#on_enter()\" function! CheckBackspace() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction " Use to trigger completion inoremap coc#refresh() " Use `[g` and `]g` to navigate diagnostics nmap [g (coc-diagnostic-prev) nmap ]g (coc-diagnostic-next) " GoTo code navigation nmap gd (coc-definition) nmap gy (coc-type-definition) nmap gi (coc-implementation) nmap gr (coc-references) " Use K to show documentation in preview window nnoremap K :call ShowDocumentation() function! ShowDocumentation() if CocAction('hasProvider', 'hover') call CocActionAsync('doHover') else call feedkeys('K', 'in') endif endfunction " Highlight the symbol and its references when holding the cursor autocmd CursorHold * silent call CocActionAsync('highlight') " Symbol renaming nmap rn (coc-rename) " Formatting selected code xmap f (coc-format-selected) nmap f (coc-format-selected) endif " ============================================================================ " => Helper Functions " ============================================================================ " Returns true if paste mode is enabled function! HasPaste() if &paste return 'PASTE MODE ' endif return '' endfunction " Don't close window, when deleting a buffer command! Bclose call BufcloseCloseIt() function! BufcloseCloseIt() let l:currentBufNum = bufnr("%") let l:alternateBufNum = bufnr("#") if buflisted(l:alternateBufNum) buffer # else bnext endif if bufnr("%") == l:currentBufNum new endif if buflisted(l:currentBufNum) execute("bdelete! ".l:currentBufNum) endif endfunction " Delete trailing white space on save fun! CleanExtraSpaces() let save_cursor = getpos(".") let old_query = getreg('/') silent! %s/\s\+$//e call setpos('.', save_cursor) call setreg('/', old_query) endfun if has("autocmd") autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces() endif " ============================================================================ " => Auto Commands " ============================================================================ " Return to last edit position when opening files autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif " Set specific file types autocmd BufNewFile,BufRead *.json setlocal filetype=json autocmd BufNewFile,BufRead *.md setlocal filetype=markdown autocmd BufNewFile,BufRead *.jsx setlocal filetype=javascript.jsx autocmd BufNewFile,BufRead *.tsx setlocal filetype=typescript.tsx " Python specific settings autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4 colorcolumn=88 " JavaScript specific settings autocmd FileType javascript,typescript setlocal expandtab shiftwidth=2 tabstop=2 " Go specific settings autocmd FileType go setlocal noexpandtab shiftwidth=4 tabstop=4 " ============================================================================ " => Status Line " ============================================================================ " Always show the status line set laststatus=2 " Format the status line (if not using airline) " set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l\ \ Column:\ %c " ============================================================================ " => Misc " ============================================================================ " Quickly open a buffer for scribble map q :e ~/buffer " Quickly open a markdown buffer for scribble map m :e ~/buffer.md " Toggle between number and relativenumber function! ToggleNumber() if(&relativenumber == 1) set norelativenumber set number else set relativenumber endif endfunc " Toggle paste mode map pp :setlocal paste! " ============================================================================ " => Performance Optimization " ============================================================================ " Optimize for large files set synmaxcol=200 set ttyfast " Reduce updatetime for better user experience set updatetime=300 " Don't pass messages to |ins-completion-menu| set shortmess+=c " Always show the signcolumn if has("patch-8.1.1564") set signcolumn=number else set signcolumn=yes endif " ============================================================================ " End of Configuration " ============================================================================