" 0. preamble
" ===========

autocmd! bufwritepost .vimrc source %
call pathogen#infect()
call pathogen#helptags()
filetype off
filetype plugin on
syntax on
let mapleader = ","


" 1. autocommands
" ===============

autocmd BufWinEnter *.py silent set foldenable
autocmd BufWinEnter *.py silent set foldlevel=1
autocmd BufWinEnter *.py silent set foldmethod=indent
autocmd BufWinEnter *.py silent set foldminlines=0
autocmd BufWinEnter *.py silent set foldnestmax=2
autocmd BufWinEnter *.py silent set nofoldenable
au BufWritePre * :set binary | set noeol
au BufWritePost * :set nobinary | set eol

" 2. settings (alphabetical)
" ==========================

set autoindent
set backspace=2
set background=light
set autoread
set clipboard=unnamed
set colorcolumn=80
set completeopt=menuone,preview
set encoding=utf-8
set expandtab
set fileencodings=utf-8,latin1
set grepformat=%f:%l:%c:%m
set grepprg=ack\ --nogroup\ --column\ $*
set helpheight=80
set history=700
set ignorecase
set incsearch
set nobackup
set noeol
set nojoinspaces
set noswapfile
set nowrap
set nowritebackup
set pastetoggle=<F2>
set shiftround
set shiftwidth=4
set showcmd
set showmatch
set showmode
set smartcase
set softtabstop=4
set scrolloff=7
set tabstop=4
set tags=$ABJADROOT/tags
set textwidth=79
set notitle
set undolevels=700
set wildignore+=*.pyc
set wildignore+=*/coverage/*
set wildignore+=*_build/*
set wildmode=list:longest


" 3. mappings (alphabetical)
" ==========================

" alternate file
map <leader>e :edit#<cr>

" classfile navigation
noremap <leader>nn ?###$<cr>
noremap <leader>mm /###$<cr>
noremap <leader>#C /CLASS<cr>
noremap <leader>#I /INITIALIZER<cr>
noremap <leader>#S /SPECIAL<cr>
noremap <leader>#OM /PRIVATE METHODS<cr>
noremap <leader>#OP /PRIVATE PROPERTIES<cr>
noremap <leader>#PM /PUBLIC METHODS<cr>
noremap <leader>#PP /PUBLIC PROPERTIES<cr>

" debugging
map <leader>b Oimport ipdb; ipdb.set_trace() # BREAKPOINT<C-c>

" comments
noremap <F4> <Esc>:'a,'bs/#//<cr>
noremap <F6> <Esc>:'a,'bs/^/#/<cr>
vnoremap <F4> :s/#//<cr>
vnoremap <F6> :s/^/#/<cr>

" cursor vertical center
:nnoremap <leader>zz :let &scrolloff=999-&scrolloff<cr>

" folding
noremap <leader>zm zMzr

" hjkl navigation only
" but note that arrow keys always work in paste mode
map   <Up>     <NOP>
map   <Down>   <NOP>
map   <Left>   <NOP>
map   <Right>  <NOP>

" indentation 
vnoremap < <gv
vnoremap > >gv
map <leader>a ggVG

" linesort 
vnoremap <leader>s :sort<cr>
noremap <leader>ab :'a,'bsort<cr>

" remove trailing whitespace
:nnoremap <silent> <F5> :let _s=@/<Bar>:%s/\s\+$//e<Bar>:let @/=_s<Bar>:nohl<CR>

" settings reload & view
map <leader>v :source ~/.vimrc<cr>
map <leader>vv :edit ~/.vimrc<cr>

" window navigation 
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

" write & quit
noremap <leader>w :write<cr>
noremap <leader>q :quit<cr>
noremap <leader>wq :wq<cr>


" 4. plugins (alphabetical)
" =========================

" ctrlp (https://github.com/kien/ctrlp.vim)
let g:ctrlp_by_filename = 1
let g:ctrlp_clear_cache_on_exit = 1
let g:ctrlp_custom_ignore = '__init__.py'
let g:ctrlp_lazy_update = 2
let g:ctrlp_match_window_bottom = 0
let g:ctrlp_match_window_reversed = 0
let g:ctrlp_max_height = 30
map <leader>jj :CtrlP $ABJADTRUNK/abjad<cr>
map <leader>jjt :CtrlP $ABJADTRUNK/abjad/tools<cr>
map <leader>jt :CtrlP $ABJADTRUNK<cr>
map <leader>jx :CtrlP $ABJADEXPERIMENTAL<cr>
map <leader>mx :CtrlP $ABJADEXPERIMENTAL/tools/musicexpressiontools<cr>
map <leader>nj :CtrlP $ABJADEXPERIMENTAL/tools/newabjadbooktools<cr>
map <leader>sm :CtrlP $ABJADTRUNK/scoremanager<cr>

" jedi-vim (https://github.com/davidhalter/jedi-vim)
let g:jedi#popup_on_dot = 0
let g:jedi#popup_select_first = 0
let g:jedi#related_names_command = "<leader>z"

" vim-powerline (https://github.com/Lokaltog/vim-powerline)
set laststatus=2
let g:Powerline_symbols = 'compatible'
let g:Powerline_stl_path_style = 'filename'
call Pl#Theme#RemoveSegment('scrollpercent')
call Pl#Theme#RemoveSegment('fileformat')
call Pl#Theme#RemoveSegment('fileencoding')
call Pl#Theme#RemoveSegment('filetype')

" vim-pythontextobj (https://github.com/natw/vim-pythontextobj.git)
" provides these text objects: ac, ic, af, if
" no configuration required

" vim-surround (https://github.com/tpope/vim-surround.git)
" provides matchfix transform commands
" no configuration required

" vim-unimpaired (https://github.com/tpope/vim-unimpaired.git)
" provides bracket aliases for :previous, :next, :bprevious, :bnext, etc.
" no configuration required


" 5. other
" ========

" show tab number (adapted from http://stackoverflow.com/q/5927952)
if exists("+showtabline")
    function! MyTabLine()
        let s = ''
        let t = tabpagenr()
        let i = 1
        while i <= tabpagenr('$')
            let buflist = tabpagebuflist(i)
            let winnr = tabpagewinnr(i)
            let s .= '%' . i . 'T'
            let s .= (i == t ? '%1*' : '%2*')
            let wn = tabpagewinnr(i,'$')
            let s .= (i == t ? '%#TabNumSel#        ' : '%#TabNum#        ')
            let s .= i
            if tabpagewinnr(i,'$') > 1
                let s .= '.'
                let s .= (i == t ? '%#TabWinNumSel#' : '%#TabWinNum#')
                let s .= (tabpagewinnr(i,'$') > 1 ? wn : '')
            end
            let s .= '%*'
            let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#')
            let s .= (i == t ? '%m' : '')
            let i = i + 1
        endwhile
        let s .= '%T%#TabLineFill#%='
        return s
    endfunction
    set tabline=%!MyTabLine()
    highlight TabLineSel term=bold cterm=bold ctermfg=16 ctermbg=229
    highlight TabWinNumSel term=bold cterm=bold ctermfg=90 ctermbg=229
    highlight TabNumSel term=bold cterm=bold ctermfg=16 ctermbg=229
    highlight TabLine term=bold cterm=bold ctermfg=16 ctermbg=145
    highlight TabWinNum term=bold cterm=bold ctermfg=90 ctermbg=145
    highlight TabNum term=bold cterm=bold ctermfg=16 ctermbg=145
    highlight TabLineFill term=bold cterm=bold ctermbg=Black
endif

" show number of lines in fold
function! MinimalFoldText()
    let foldlinecount = 1 + v:foldend - v:foldstart
    if foldlinecount == 1   
        let foldlinecountstring = " " . foldlinecount . " line folded "
    else
        let foldlinecountstring = " " . foldlinecount . " lines folded "
    endif
    return "+" . v:folddashes . foldlinecountstring
endfunction
set foldtext=MinimalFoldText()
highlight Folded term=standout ctermfg=Grey ctermbg=White guifg=DarkGrey guibg=LightGrey

" use Qargs to populate the arglist with the contents of the quickfix list
" taken from http://vimcasts.org/episodes/project-wide-find-and-replace/
command! -nargs=0 -bar Qargs execute 'args' QuickfixFilenames()
function! QuickfixFilenames()
  " Building a hash ensures we get each buffer only once
  let buffer_numbers = {}
  for quickfix_item in getqflist()
    let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])
  endfor
  return join(map(values(buffer_numbers), 'fnameescape(v:val)'))
endfunction