set nocompatible " This fixes the problem where arrow keys do not function properly on some systems. let mapleader=' ' " Use space for leader key " General visual look of Vim set number set ruler set noerrorbells set laststatus=2 set noshowmode " Don't show mode in bottom status line let &fillchars ..= ',eob: ' " Hide tildes at EOF set splitbelow splitright set cursorline " Highlight the active cursor line set termguicolors colorscheme gruvbox " Clipboard set clipboard=unnamedplus " Text searching options set incsearch set ignorecase set smartcase set showmatch " Syntax and formatting syntax on set encoding=utf-8 set hidden " Tabs and indenting set smartindent set tabstop=4 set shiftwidth=4 set softtabstop=4 set expandtab set noshiftround set scrolloff=3 " Command line completion options set showcmd set wildmenu filetype plugin on set omnifunc=syntaxcomplete#Complete set completeopt=menuone,noselect " Don't autoselect the completion " Setup undo history if !isdirectory($HOME."/.vim") call mkdir($HOME."/.vim", "", 0770) endif if !isdirectory($HOME."/.vim/undo-dir") call mkdir($HOME."/.vim/undo-dir", "", 0700) endif set undodir=~/.vim/undo-dir set undofile " Colors set background=dark hi Normal guibg=NONE ctermbg=NONE " Set background transparent " Setup terminal with gruvbox dark let g:terminal_ansi_colors = [ \ '#282828', '#cc241d', \ '#98971a', '#d79921', \ '#458588', '#b16286', \ '#689d6a', '#a89984', \ '#928374', '#fb4934', \ '#b8bb26', '#fabd2f', \ '#83a598', '#d3869b', \ '#8ec07c', '#ebdbb2', \] " Setup netrw let g:netrw_banner = 0 let g:netrw_liststyle = 3 let g:netrw_browse_split = 3 let g:netrw_altv = 1 let g:netrw_winsize = 25 " Setup custom statusline function! GitBranch() return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'") endfunction function! StatuslineGit() let l:branchname = GitBranch() return strlen(l:branchname) > 0?' '.l:branchname.' ':'' endfunction function! StatuslineMode() let l:mode=mode() if l:mode==#"n" return "Normal" elseif l:mode==#"v" return "Visual" elseif l:mode==#"V" return "Visual line" elseif l:mode==#"\" return "Visual block" elseif l:mode==#"i" return "Insert" elseif l:mode==#"R" return "Replace" elseif l:mode==#"s" return "Select" elseif l:mode==#"t" return "Terminal" elseif l:mode==#"c" return "Enter command" elseif l:mode==#"!" return "Shell" endif endfunction let g:mode_colors = { \ 'n': 'StatusLineSection', \ 'v': 'StatusLineSectionV', \ "\": 'StatusLineSectionV', \ 'i': 'StatusLineSectionI', \ 'c': 'StatusLineSectionC', \ 'r': 'StatusLineSectionR', \ 's': 'StatusLine', \ 't': 'StatusLineNC' \ } fun! StatusLineRenderer() let hl = '%#' . get(g:mode_colors, tolower(mode()), g:mode_colors.n) . '#' return hl \ . ' %{StatuslineMode()} ' \ . '%#DiffAdd#' \ . '%{StatuslineGit()}' \ . '%#DiffAdd#' \ . ' %F ' \ . (&readonly ? ' r ' : '') \ . (&modified ? ' + ' : '') \ . '%#CursorColumn#%=' \ . ' %Y ' \ . '%#DiffAdd#' \ . ' %{&fileencoding?&fileencoding:&encoding}' \ . ' [%{&fileformat}]' \ . ' %p%%' \ . ' %l:%c ' endfun fun! StatusLineHighlights() hi StatusLine ctermbg=8 guibg=#313131 ctermfg=15 guifg=#cccccc hi StatusLineNC ctermbg=0 guibg=#313131 ctermfg=8 guifg=#999999 hi StatusLineSection ctermbg=11 guibg=#928374 ctermfg=0 guifg=#000000 hi StatusLineSectionC ctermbg=8 guibg=#b8bb26 ctermfg=0 guifg=#333333 hi StatusLineSectionI ctermbg=10 guibg=#83a598 ctermfg=0 guifg=#000000 hi StatusLineSectionV ctermbg=12 guibg=#fabd2f ctermfg=0 guifg=#000000 hi StatusLineSectionR ctermbg=12 guibg=#fb4934 ctermfg=0 guifg=#000000 endfun call StatusLineHighlights() " only set default statusline once on initial startup. " ignored on subsequent 'so $MYVIMRC' calls to prevent " active buffer statusline from being 'blurred'. if has('vim_starting') let &statusline = ' %F%= %l:%c ' endif augroup vimrc au! " show focussed buffer statusline au FocusGained,VimEnter,WinEnter,BufWinEnter * \ setlocal statusline=%!StatusLineRenderer() " show blurred buffer statusline au FocusLost,VimLeave,WinLeave,BufWinLeave * \ setlocal statusline& " restore statusline highlights on colorscheme update au Colorscheme * call StatusLineHighlights() augroup END " Setup BufferLine with Tabs set showtabline=2 function! SpawnBufferLine() let s = '' " Get the list of buffers. Use bufexists() to include hidden buffers let bufferNums = filter(range(1, bufnr('$')), 'buflisted(v:val)') " Making a buffer list on the left side for i in bufferNums " Highlight with yellow if it's the current buffer let s .= (i == bufnr()) ? ('%#TabLineSel#') : ('%#TabLine#') let s .= i . ' ' " Append the buffer number if bufname(i) == '' let s .= '[No Name]' " Give a name to a new buffer endif if getbufvar(i, "&modifiable") let s .= fnamemodify(bufname(i), ':t') " Append the file name " let s .= pathshorten(bufname(i)) " Use this if you want a trimmed path " If the buffer is modified, add + and separator. Else, add separator let s .= (getbufvar(i, "&modified")) ? (' [+] | ') : (' | ') else let s .= fnamemodify(bufname(i), ':t') . ' [RO] | ' " Add read only flag endif endfor let s .= '%#TabLineFill#%T' " Reset highlight let s .= '%=' " Spacer " Making a tab list on the right side for i in range(1, tabpagenr('$')) " Loop through the number of tabs " Highlight with yellow if it's the current tab let s .= (i == tabpagenr()) ? ('%#TabLineSel#') : ('%#TabLine#') let s .= '%' . i . 'T ' " set the tab page number let s .= i . '' " set page number string endfor let s .= '%#TabLineFill#%T' " Reset highlight return s endfunction set tabline=%!SpawnBufferLine() " Assign the tabline " Add UpdateVimPackages command using the internal package system of vim function! UpdatePackages() " Gather all top-level package directories from both start and opt let l:packages = globpath('~/.vim/pack/*/start/*', '', 0, 1) + globpath('~/.vim/pack/*/opt/*', '', 0, 1) " Open a new tab for output tabnew | setlocal buftype=nofile | setlocal bufhidden=delete | setlocal noswapfile setlocal nonumber " Disable line numbers setlocal norelativenumber " Disable relative line numbers call setline(1, ['Updating Vim Packages...'] + repeat([''], 9)) let l:output = [] for package in l:packages let l:cmd = 'cd ' . package . ' && git pull' let l:result = system(l:cmd) " Remove trailing newlines from the command output let l:result = substitute(l:result, '\n\+$', '', '') " Extract text between slashes from package directory let l:package_name = matchstr(package, '/\zs[^/]\+/$') let l:package_name = substitute(l:package_name, '/\zs$\S\+$\ze/', '\1', '') " Remove the last slash if it exists let l:package_name = substitute(l:package_name, '/\s*$', '', '') " Append the full command output to the list call add(l:output, package_name . ': ' . l:result) endfor " Show the collected output starting from line 3 call setline(3, l:output) endfunction command! UpdateVimPackages call UpdatePackages() " To add plugins see examples below " git clone https://github.com/BourgeoisBear/clrzr ~/.vim/pack/plugins/start/clrzr " " git clone https://github.com/morhetz/gruvbox ~/.vim/pack/colorschemes/opt/gruvbox