+" automatically install vim-plug if not present
+if empty(glob('~/.vim/autoload/plug.vim'))
+ silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
+ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+ autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
+endif
+
+" use vim-plug to manage plugins
+call plug#begin('~/.vim/plugged')
+
+" color scheme
+Plug 'morhetz/gruvbox'
+
+" file explorer
+Plug 'preservim/nerdtree'
+
+" syntax checking
+Plug 'dense-analysis/ale'
+
+" pairing dual lexemes
+Plug 'LunarWatcher/auto-pairs'
+Plug 'tpope/vim-surround'
+
+" git wrapper
+Plug 'tpope/vim-fugitive'
+call plug#end()
+
+" basic settings
+set number
+set colorcolumn=80 " ruler at 80 characters
+set encoding=utf-8
+set t_Co=256 " 256-colour support (st)
+set background=dark
+colorscheme gruvbox
+
+" status bar
+set laststatus=2
+set showcmd
+set ruler
+
+" autoindentation and mouse
+set autoindent
+set magic
+set mouse=a
+
+" NERDTree settings
+" assume leader is \
+nnoremap <leader>n :NERDTreeToggle<CR> " toggle with n
+nnoremap <leader>f :NERDTreeFind<CR> " show current file f
+nnoremap <leader>c :NERDTreeClose<CR> " close c
+
+" syntax
+syntax on
+filetype plugin indent on
+
+" ALE configurations for c and java linting and auto-format
+let g:ale_linters = { 'c': ['gcc'], 'java': ['javac'] }
+let g:ale_fixers = { 'c': ['clang-format'], 'java': [] }
+let g:ale_c_clangformat_options = '--style={ColumnLimit: 80}'