vim/.vimrc
" ██
" ░░
" ██ ██ ██ ██████████ ██████ █████
" ░██ ░██░██░░██░░██░░██░░██░░█ ██░░░██
" ░░██ ░██ ░██ ░██ ░██ ░██ ░██ ░ ░██ ░░
" ░░████ ░██ ░██ ░██ ░██ ░██ ░██ ██
" ░░██ ░██ ███ ░██ ░██░███ ░░█████
" ░░ ░░ ░░░ ░░ ░░ ░░░ ░░░░░
"
" ▓▓▓▓▓▓▓▓▓▓
" ░▓ author ▓ xero <x@xero.nu>
" ░▓ code ▓ http://code.xero.nu/dotfiles
" ░▓ mirror ▓ http://git.io/.files
" ░▓▓▓▓▓▓▓▓▓▓
" ░░░░░░░░░░
"
" use vim settings, rather than vi settings
" must be first, because it changes other options as a side effect
set nocompatible
" security
set modelines=0
" hide buffers, not close them
set hidden
" maintain undo history between sessions
set undofile
set undodir=~/.vim/undo
set noswapfile
" lazy file name tab completion
set wildmode=longest,list,full
set wildmenu
set wildignorecase
" ignore files vim doesnt use
set wildignore+=.git,.hg,.svn
set wildignore+=*.aux,*.out,*.toc
set wildignore+=*.o,*.obj,*.exe,*.dll,*.manifest,*.rbc,*.class
set wildignore+=*.ai,*.bmp,*.gif,*.ico,*.jpg,*.jpeg,*.png,*.psd,*.webp
set wildignore+=*.avi,*.divx,*.mp4,*.webm,*.mov,*.m2ts,*.mkv,*.vob,*.mpg,*.mpeg
set wildignore+=*.mp3,*.oga,*.ogg,*.wav,*.flac
set wildignore+=*.eot,*.otf,*.ttf,*.woff
set wildignore+=*.doc,*.pdf,*.cbr,*.cbz
set wildignore+=*.zip,*.tar.gz,*.tar.bz2,*.rar,*.tar.xz,*.kgb
set wildignore+=*.swp,.lock,.DS_Store,._*
" case insensitive search
set ignorecase
set smartcase
set infercase
" the /g flag on :s substitutions by default
set gdefault
" make backspace behave in a sane manner
set backspace=indent,eol,start
" searching
set hlsearch
set incsearch
" use indents of 4 spaces
set shiftwidth=2
" tabs are spaces, not tabs
set expandtab
" an indentation every four columns
set tabstop=2
" let backspace delete indent
set softtabstop=2
" enable auto indentation
set autoindent
" remove trailing whitespaces and ^M chars
autocmd FileType c,cpp,java,php,js,python,twig,xml,yml autocmd BufWritePre <buffer> :call setline(1,map(getline(1,"$"),'substitute(v:val,"\s\+$","","")'))
" let mapleader=","
vnoremap <silent> <leader>y :w !xsel -i -b<CR>
nnoremap <silent> <leader>y V:w !xsel -i -b<CR>
nnoremap <silent> <leader>p :silent :r !xsel -o -b<CR>
" ┏━╸┏━┓┏┳┓┏┳┓┏━┓┏┓╻╺┳┓┏━┓
" ┃ ┃ ┃┃┃┃┃┃┃┣━┫┃┗┫ ┃┃┗━┓
" ┗━╸┗━┛╹ ╹╹ ╹╹ ╹╹ ╹╺┻┛┗━┛
" json pretty print
command J :%!python -mjson.tool
" remove trailing white space
command Nows :%s/\s\+$//
" remove blank lines
command Nobl :g/^\s*$/d
" toggle spellcheck
command Spell :setlocal spell! spell?
" make current buffer executable
command Chmodx :!chmod a+x %
" ╻┏┓╻╺┳╸┏━╸┏━┓┏━╸┏━┓┏━╸┏━╸
" ┃┃┗┫ ┃ ┣╸ ┣┳┛┣╸ ┣━┫┃ ┣╸
" ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹ ╹┗━╸┗━╸
" show matching brackets/parenthesis
set showmatch
" disable startup message
set shortmess+=I
" syntax highlighting
syntax on
set synmaxcol=512
filetype off
" stop unnecessary rendering
set lazyredraw
" show line numbers
set number
" no line wrapping
set nowrap
" no folding
set nofoldenable
set foldlevel=99
set foldminlines=99
set foldlevelstart=99
" highlight cursor
set cursorline
"set cursorcolumn
" so invisibles
set list
set listchars=
set listchars+=tab:𐄙\
set listchars+=trail:·
set listchars+=extends:»
set listchars+=precedes:«
set listchars+=nbsp:⣿
" ┏━┓╻ ╻ ╻┏━╸╻┏┓╻ ┏━┓╺┳╸╻ ╻┏━╸┏━╸
" ┣━┛┃ ┃ ┃┃╺┓┃┃┗┫ ┗━┓ ┃ ┃ ┃┣╸ ┣╸
" ╹ ┗━╸┗━┛┗━┛╹╹ ╹ ┗━┛ ╹ ┗━┛╹ ╹
" i struggle with the decision to use plugins or a more vanilla vim, don't judge me.
" to install from the shell run:
" git clone https://github.com/gmarik/Vundle.vim.git ~/dotfiles/vim/.vim/bundle/Vundle.vim && vim +BundleInstall +qall && pacman -S the_silver_searcher
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'ajh17/VimCompletesMe'
Plugin 'shawncplus/phpcomplete.vim'
Plugin 'pangloss/vim-javascript'
Plugin 'elzr/vim-json'
Plugin 'scrooloose/syntastic'
Plugin 'airblade/vim-gitgutter'
Plugin 'tpope/vim-fugitive'
Plugin 'gregsexton/gitv'
Plugin 'mbbill/undotree'
Plugin 'rking/ag.vim'
Plugin 'isa/vim-matchit'
Plugin 'chrisbra/unicode.vim'
Plugin 'lilydjwg/colorizer'
Plugin 'itchyny/lightline.vim'
Plugin 'xero/sourcerer.vim'
call vundle#end()
filetype plugin indent on
" vimcompletesme https://git.io/XLcB1A
" use omni-complete
let b:vcm_tab_complete = 'omni'
set omnifunc=syntaxcomplete#Complete
" select the completion with enter
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
" close preview on completion complete
autocmd CompleteDone * pclose
" or disable previews completely
" set completeopt-=preview
" syntatic http://git.io/syntastic.vim
" linters: (from aur) nodejs-jshint, nodejs-jsonlint, csslint, checkbashisms
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" color overrides
highlight SyntasticErrorSign ctermfg=red ctermbg=237
highlight SyntasticWarningSign ctermfg=yellow ctermbg=237
highlight SyntasticStyleErrorSign ctermfg=red ctermbg=237
highlight SyntasticStyleWarningSign ctermfg=yellow ctermbg=237
" disable folding
let g:vim_json_syntax_conceal = 0
" git-gutter http://git.io/vimgitgutter
" speed optimizations
let g:gitgutter_realtime = 1
let g:gitgutter_eager = 1
let g:gitgutter_max_signs = 1500
let g:gitgutter_diff_args = '-w'
" custom symbols
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 = ':'
" color overrrides
highlight clear SignColumn
highlight GitGutterAdd ctermfg=green ctermbg=237
highlight GitGutterChange ctermfg=yellow ctermbg=237
highlight GitGutterDelete ctermfg=red ctermbg=237
highlight GitGutterChangeDelete ctermfg=red ctermbg=237
" ag, the silver searcher http://git.io/AEu3dQ + http://git.io/d9N0MA
let g:agprg="ag -i --vimgrep"
let g:ag_highlight=1
" map \ to the ag command for quick searching
nnoremap \ :Ag<SPACE>
" wizard colors http://git.io/vim.sourcerer
colorscheme blaquemagick
" ┏━┓╺┳╸┏━┓╺┳╸╻ ╻┏━┓╻ ╻┏┓╻┏━╸
" ┗━┓ ┃ ┣━┫ ┃ ┃ ┃┗━┓┃ ┃┃┗┫┣╸
" ┗━┛ ╹ ╹ ╹ ╹ ┗━┛┗━┛┗━╸╹╹ ╹┗━╸
" lightline http://git.io/lightline
" █▓▒░ wizard status line
set laststatus=2
let g:lightline = {
\ 'colorscheme': 'sourcerer',
\ 'active': {
\ 'left': [ [ 'filename' ],
\ [ 'readonly', 'fugitive' ] ],
\ 'right': [ [ 'percent', 'lineinfo' ],
\ [ 'fileencoding', 'filetype' ],
\ [ 'fileformat', 'syntastic' ] ]
\ },
\ 'component_function': {
\ 'modified': 'WizMod',
\ 'readonly': 'WizRO',
\ 'fugitive': 'WizGit',
\ 'filename': 'WizName',
\ 'filetype': 'WizType',
\ 'fileformat' : 'WizFormat',
\ 'fileencoding': 'WizEncoding',
\ 'mode': 'WizMode',
\ },
\ 'component_expand': {
\ 'syntastic': 'SyntasticStatuslineFlag',
\ },
\ 'component_type': {
\ 'syntastic': 'error',
\ },
\ 'separator': { 'left': '▓▒░', 'right': '░▒▓' },
\ 'subseparator': { 'left': '▒', 'right': '░' }
\ }
function! WizMod()
return &ft =~ 'help\|vimfiler' ? '' : &modified ? '»' : &modifiable ? '' : ''
endfunction
function! WizRO()
return &ft !~? 'help\|vimfiler' && &readonly ? 'x' : ''
endfunction
function! WizGit()
if &ft !~? 'help\|vimfiler' && exists("*fugitive#head")
return fugitive#head()
endif
return ''
endfunction
function! WizName()
return ('' != WizMod() ? WizMod() . ' ' : '') .
\ ('' != expand('%:t') ? expand('%:t') : '[none]')
endfunction
function! WizType()
return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype : '') : ''
endfunction
function! WizFormat()
return ''
endfunction
function! WizEncoding()
return winwidth(0) > 70 ? (strlen(&fenc) ? &enc : &enc) : ''
endfunction
augroup AutoSyntastic
autocmd!
autocmd BufWritePost *.c,*.cpp,*.go,*.js,*.php,*.css,*.scss,*.sh,*.rb call s:syntastic()
augroup END
function! s:syntastic()
SyntasticCheck
call lightline#update()
endfunction