" Basics
set t_Co=256        " Use 256 colors
set encoding=utf8   " Use utf-8 encoding
set nocompatible    " Get out of vi-compatible mode
set background=dark " I am using a dark background
" set background=light " I am using a dark background
syntax on           " Syntax highlighting on

command! W  write
command! Q  qall
command! MakeTags  !ctags -R .

call plug#begin('~/.vim/plugged')

Plug 'NLKNguyen/papercolor-theme'
Plug 'SirVer/ultisnips', { 'tag': '3.2' }
Plug 'cespare/vim-toml', { 'for': 'toml' }
Plug 'dense-analysis/ale', { 'tag': 'v2.7.0' }
Plug 'editorconfig/editorconfig-vim', { 'tag': 'v1.1.1' }
Plug 'fatih/vim-go', { 'tag': 'v1.22' }
Plug 'hashivim/vim-hashicorp-tools'
Plug 'lifepillar/pgsql.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'preservim/nerdtree', { 'on':  'NERDTreeToggle', 'tag': '6.9.8' }
Plug 'prettier/vim-prettier', {
    \ 'branch': 'release/1.x',
    \ 'do': 'npm install',
    \ 'for': [
    \   'css',
    \   'graphql',
    \   'html',
    \   'javascript',
    \   'json',
    \   'less',
    \   'markdown',
    \   'package',
    \   'pg',
    \   'php',
    \   'pug',
    \   'python',
    \   'ruby',
    \   'scss',
    \   'sh',
    \   'swift',
    \   'toml',
    \   'typescript',
    \   'vue',
    \   'xml',
    \   'yaml'
    \ ]
\ }
Plug 'rust-lang/rust.vim', { 'for': 'rust' }
Plug 'sheerun/vim-wombat-scheme'
Plug 'tpope/vim-surround'
Plug 'vim-scripts/CSApprox'

call plug#end()

let g:sql_type_default = 'pgsql'

"let g:go_metalinter_autosave=1
"let g:go_metalinter_autosave_enabled=['golint', 'govet', 'typecheck']

" General
"colorscheme solarized
colorscheme wombat
"colorscheme PaperColor
" setlocal spell spelllang=en_us
set fileformats=unix,dos,mac    " support all three, in this order
set nostartofline               " leave my cursor where it was
set history=10000
set autoread        " Set to auto read when a file is changed from the outside
set autochdir       " Change current directory to be directory of current file
set colorcolumn=81
"set foldmethod=syntax

" fuzzy finding
"set path+=**

" Have tab complete work more like bash
set wildmenu
set wildmode=list:longest

set backspace=start,eol,indent
set whichwrap+=<,>,[,]

set magic       "Set magic on, for regular expressions

" Turn on omni completion. Must have `filetype plugin on` to use.
" To use, in insert mode press ctrl+x ctrl+o
set ofu=syntaxcomplete#Complete

" Mappings
let mapleader=","
let g:mapleader=","
map <leader>rl :source $MYVIMRC<CR>
map <leader>nt :NERDTreeToggle<CR>
map <leader>ss :setlocal spell!<CR>
map <leader>ct :TlistToggle<CR>     " taglist shortcut
map <leader>ts :%s/\s\s*$//g<CR>    " trim trailing whitespace
nnoremap <leader>rc :split $MYVIMRC<cr>
nnoremap <leader>d :GoDef
nnoremap <leader>t :GoDefType
nnoremap <leader>p :set paste<cr>
nnoremap <leader>np :set nopaste<cr>
nnoremap <leader>nn :set nonumber norelativenumber<cr>
nnoremap <leader>rn :set number relativenumber<cr>

if bufwinnr(1)
    map <leader>+ <C-W><
    map <leader>- <C-W>>
endif

" Nerdtree settings
let NERDTreeDirArrows=1
let NERDTreeIgnore = ['\.pyc$', '\.swp$']

let g:ale_linters = {
\   'javascript': ['eslint'],
\   'go': ['golint', 'gopls'],
\}

let g:rustfmt_autosave = 1

" Close all open buffers on entering a window if the only
" buffer that's left is the NERDTree buffer
function! s:CloseIfOnlyNerdTreeLeft()
    if exists("t:NERDTreeBufName")
        if bufwinnr(t:NERDTreeBufName) != -1
            if winnr("$") == 1
                q
            endif
        endif
    endif
endfunction

" Vim Tabs
map <leader>tt :tabnew<cr>
map <leader>te :tabedit
map <leader>tc :tabclose<cr>
map <leader>to :tabonly<cr>
map <leader>tn :tabNext<cr>
map <leader>tp :tabprevious<cr>
map <leader>tf :tabfirst<cr>
map <leader>tl :tablast<cr>
map <leader>tm :tabmove

" Tabs
set expandtab       " expandtab converts tabs to spaces. For tabs, set noexpandtab
set shiftwidth=4    " unify
set softtabstop=4   " Pressing backspace works like tabs
set tabstop=4       " real tabs should be 4, but they will show with set list on

" Indent
set autoindent      "Auto indent
set smartindent     "Smart indent
set copyindent      " above all -- follow the conventions laid before us
set preserveindent  " above all -- follow the conventions laid before us
set shiftround      " when at 3 spaces, and I hit '>', go to 4, not 5
filetype plugin on   " load filetype plug-ins and indent settings
filetype indent on   " load filetype plug-ins and indent settings

" UI
set showcmd         " show the command being typed
set ruler           " Always show current positions along the bottom
set number relativenumber  " Use relative line numbers
set numberwidth=4   " If we have over 9999 lines
set hidden          " you can change buffer without saving
"set mouse=a         " use mouse everywhere

" No sound on errors
set noerrorbells    " don't make noise
set novisualbell    " don't blink
set t_vb=
set tm=500

" Visual Cues
set showmatch       " show matching brackets
set matchtime=2     " how many tenths of a second to blink matching brackets for
set hlsearch        " highlight searched for phrases
set incsearch       " BUT do highlight as you type you search phrase
set scrolloff=5     " Keep 5 lines (top/bottom) for scope
set sidescrolloff=5 " Keep 5 lines at the size
set list        " we do what to show tabs, to ensure we get them out of my files
set listchars=tab:\ \ ,trail:… " show tabs and trailing whitespace

" ~\file[+] [type] [line,column] [number of lines]
set statusline=%F%m%r%h%w\ [%Y]\ [%03l,%03v]\ [%L]
"set statusline+=%#warningmsg#
"set statusline+=%{SyntasticStatuslineFlag()}
"set statusline+=%*

set laststatus=2 " always show the status line

" Text Formatting/Layout
set nowrap      " do not wrap line
set ignorecase  " case insensitive by default
set smartcase   " if there are caps, go case-sensitive
set completeopt=menu,longest,preview " improve the way autocomplete works

autocmd WinEnter * call s:CloseIfOnlyNerdTreeLeft()

augroup jade
    au! BufRead,BufNewFile *.jade set syntax=jade
augroup END

augroup javascript
    au! BufRead,BufNewFile *.js.flow set filetype=javascript
augroup END

augroup ruby
    au! BufRead,BufNewFile *.cap set syntax=ruby
augroup END

augroup styl
    au! BufRead,BufNewFile *.styl set syntax=stylus
augroup END

augroup conkyrc
    au! BufRead,BufNewFile *.conkyrc set syntax=conkyrc
augroup END

augroup vcl
    au! BufRead,BufNewFile *.vcl set filetype=vcl
augroup END

augroup mustache
    au! BufRead,BufNewFile *.mustache set filetype=mustache
    au! BufRead,BufNewFile *.mu set filetype=mustache
    au! BufRead,BufNewFile *.hjs set filetype=mustache
augroup END

augroup coffee
    au! BufRead,BufNewFile *.coffee set filetype=coffee
augroup END

augroup markdown
    au! BufRead,BufNewFile *.md set filetype=markdown
augroup END

augroup COMMIT_EDITMSG
    au! BufRead,BufNewFile COMMIT_EDITMSG set filetype=gitcommit
augroup END

augroup typescript
    au! BufRead,BufNewFile *.ts set filetype=typescript
augroup END