From 50f32b32ed918bb0a8915e00a55dcf68ad9e3c52 Mon Sep 17 00:00:00 2001 From: hellerve Date: Sun, 5 Apr 2015 17:41:14 +0200 Subject: [PATCH] Major rework on vim and zsh --- Makefile | 4 +- ghci | 1 + pythonrc | 1 + vimrc | 747 ++++++++++++++++++++++++++++++++++++++++++------------- zshrc | 3 + 5 files changed, 578 insertions(+), 178 deletions(-) diff --git a/Makefile b/Makefile index ea940be..512e034 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ bash: cp bash_profile ~/.bash_profile ghc: + cp -r cabal ~/.cabal cp ghci ~/.ghci git: @@ -21,7 +22,8 @@ valgrind: cp valgrindrc ~/.valgrindrc vim: - cp vimrc ~/.vimrc + cp vimrc ~/.vimrc.local + cp -r vim ~/.vim zsh: cp zshrc ~/.zshrc diff --git a/ghci b/ghci index a03b075..57083d7 100644 --- a/ghci +++ b/ghci @@ -7,3 +7,4 @@ let ghciEscapeShellArg arg = "'" ++ concatMap (\c -> if c == '\'' then "'\"'\"'" :def! h return . (":! hoogle --color --count=20 " ++) . ghciEscapeShellArg :def! doc return . (":! hoogle --info " ++) . ghciEscapeShellArg +:def! hlint const . return $":! hlint \"src\"" diff --git a/pythonrc b/pythonrc index 8399bc7..4c8d12b 100644 --- a/pythonrc +++ b/pythonrc @@ -14,4 +14,5 @@ def write_history(readline=readline, histfile=histfile): except IOError: pass atexit.register(write_history) + del readline, histfile, atexit, write_history, sys, os diff --git a/vimrc b/vimrc index 20c7953..c79021f 100644 --- a/vimrc +++ b/vimrc @@ -1,227 +1,620 @@ -set clipboard=unnamed -set enc=utf-8 -set fileencoding=utf-8 -set fileencodings=ucs-bom,utf8,prc -set guifont=Monaco:h11 -set guifontwide=NSimsun:h12 +" General {{{ + +" use indentation for folds +set foldmethod=indent +set foldnestmax=5 +set foldlevelstart=99 +set foldcolumn=0 + + +" Sets how many lines of history VIM has to remember set history=700 -filetype plugin on -filetype indent on + +" Set to auto read when a file is changed from the outside set autoread + +" With a map leader it's possible to do extra key combinations +" like w saves the current file let mapleader = "," let g:mapleader = "," -nmap w :w! + +" Leader key timeout +set tm=2000 + +" Allow the normal use of "," by pressing it twice +noremap ,, , + +" Use par for prettier line formatting +set formatprg="PARINIT='rTbgqR B=.,?_A_a Q=_s>|' par\ -w72" + +" Use stylish haskell instead of par for haskell buffers +autocmd FileType haskell let &formatprg="stylish-haskell" + +" Find custom built ghc-mod, codex etc +let $PATH = $PATH . ':' . expand("~/.haskell-vim-now/bin") + +" Kill the damned Ex mode. +nnoremap Q + +" }}} + +" Vundle {{{ + +set nocompatible +filetype off +set rtp+=~/.vim/bundle/vundle/ +call vundle#rc() + +" let Vundle manage Vundle +" required! +Bundle 'gmarik/vundle' + +" Support bundles +Bundle 'jgdavey/tslime.vim' +Bundle 'Shougo/vimproc.vim' +Bundle 'ervandew/supertab' +Bundle 'scrooloose/syntastic' +Bundle 'moll/vim-bbye' +Bundle 'nathanaelkane/vim-indent-guides' +Bundle 'vim-scripts/gitignore' + +" Git +Bundle 'tpope/vim-fugitive' +Bundle 'int3/vim-extradite' + +" Bars, panels, and files +Bundle 'scrooloose/nerdtree' +Bundle 'bling/vim-airline' +Bundle 'kien/ctrlp.vim' +Bundle 'majutsushi/tagbar' + +" Text manipulation +Bundle 'vim-scripts/Align' +Bundle 'vim-scripts/Gundo' +Bundle 'tpope/vim-commentary' +Bundle 'godlygeek/tabular' +Bundle 'michaeljsmith/vim-indent-object' + +" Allow pane movement to jump out of vim into tmux +Bundle 'christoomey/vim-tmux-navigator' + +" Haskell +Bundle 'raichoo/haskell-vim' +Bundle 'enomsg/vim-haskellConcealPlus' +Bundle 'eagletmt/ghcmod-vim' +Bundle 'eagletmt/neco-ghc' +Bundle 'Twinside/vim-hoogle' + +" Custom bundles +if filereadable(expand("~/.vim.local/bundles.vim")) + source ~/.vim.local/bundles.vim +endif + +" }}} + +" VIM user interface {{{ + +" Set 7 lines to the cursor - when moving vertically using j/k set so=7 + +" Turn on the WiLd menu set wildmenu -set wildignore=*.o,*~,*.pyc +" Tab-complete files up to longest unambiguous prefix +set wildmode=list:longest,full + +" Always show current position set ruler -set cmdheight=2 -set hid + +" Show trailing whitespace +set list +" But only interesting whitespace +if &listchars ==# 'eol:$' + set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+ +endif + +" Height of the command bar +set cmdheight=1 + +" Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l + +" Ignore case when searching set ignorecase + +" When searching try to be smart about cases set smartcase + +" Highlight search results set hlsearch + +" Makes search act like search in modern browsers set incsearch + +" Don't redraw while executing macros (good performance config) set lazyredraw + +" For regular expressions turn magic on set magic + +" Show matching brackets when text indicator is over them set showmatch +" How many tenths of a second to blink when matching brackets set mat=2 + +" No annoying sound on errors set noerrorbells -set novisualbell -set t_vb= -set tm=500 -syntax enable -colorscheme desert -set background=dark -if has("gui_running") - set guioptions-=T - set guioptions+=e - set t_Co=256 - set guitablabel=%M\ %t +set vb t_vb= + +if &term =~ '256color' + " disable Background Color Erase (BCE) so that color schemes + " render properly when inside 256-color tmux and GNU screen. + " see also http://snk.tuxfamily.org/log/vim-256color-bce.html + set t_ut= endif + +" Force redraw +map r :redraw! + +" Turn mouse mode on +nnoremap ma :set mouse=a + +" Turn mouse mode off +nnoremap mo :set mouse= + +" Default to mouse mode on +set mouse=a +" }}} + +" Colors and Fonts {{{ + +Bundle 'vim-scripts/wombat256.vim' +try + colorscheme desert +catch +endtry + +" Enable syntax highlighting +syntax enable + +" Adjust signscolumn and syntastic to match wombat +hi! link SignColumn LineNr +hi! link SyntasticErrorSign ErrorMsg +hi! link SyntasticWarningSign WarningMsg + +" Use pleasant but very visible search hilighting +hi Search ctermfg=white ctermbg=173 cterm=none guifg=#ffffff guibg=#e5786d gui=none +hi! link Visual Search + +" Enable filetype plugins +filetype plugin on +filetype indent on + +" Match wombat colors in nerd tree +hi Directory guifg=#8ac6f2 + +" Searing red very visible cursor +hi Cursor guibg=red + +" Use same color behind concealed unicode characters +hi clear Conceal + +" Don't blink normal mode cursor +set guicursor=n-v-c:block-Cursor +set guicursor+=n-v-c:blinkon0 + +" Set extra options when running in GUI mode +if has("gui_running") + set guioptions-=T + set guioptions-=e + set guitablabel=%M\ %t +endif +set t_Co=256 + +" Set utf8 as standard encoding and en_US as the standard language set encoding=utf8 + +" Use Unix as the standard file type set ffs=unix,dos,mac + +" Use large font by default in MacVim +set gfn=Monaco:h19 + +" }}} + +" Files, backups and undo {{{ + +" Turn backup off, since most stuff is in Git anyway... set nobackup set nowb set noswapfile + +" Source the vimrc file after saving it +augroup sourcing + autocmd! + autocmd bufwritepost .vimrc source $MYVIMRC +augroup END + +" Open file prompt with current path +nmap e :e =expand("%:p:h") . '/' + +" Show undo tree +nmap u :GundoToggle + +" Fuzzy find files +nnoremap :CtrlP +let g:ctrlp_max_files=0 +let g:ctrlp_show_hidden=1 +let g:ctrlp_custom_ignore = { 'dir': '\v[\/](.git)$' } + +" }}} + +" Text, tab and indent related {{{ + +" Use spaces instead of tabs set expandtab + +" Be smart when using tabs ;) set smarttab -set shiftwidth=4 -set tabstop=4 + +" 1 tab == 2 spaces +set shiftwidth=2 +set tabstop=2 + +" Linebreak on 500 characters set lbr set tw=500 + set ai "Auto indent set si "Smart indent set wrap "Wrap lines -cnoreabbrev hex %!xxd -vnoremap * :call VisualSelection('f') -vnoremap # :call VisualSelection('b') -map j gj -map k gk -map / -map ? -map :noh -map j -map k -map h -map l -map bd :Bclose -map ba :1,1000 bd! -map tn :tabnew -map to :tabonly -map tc :tabclose -map tm :tabmove -map te :tabedit =expand("%:p:h")/ -map cd :cd %:p:h:pwd -try - set switchbuf=useopen,usetab,newtab - set stal=2 -catch -endtry -autocmd BufReadPost * - \ if line("'\"") > 0 && line("'\"") <= line("$") | - \ exe "normal! g`\"" | - \ endif + +" Pretty unicode haskell symbols +let g:haskell_conceal_wide = 1 +let g:haskell_conceal_enumerations = 1 + +" }}} + +" Visual mode related {{{ + +" Visual mode pressing * or # searches for the current selection +" Super useful! From an idea by Michael Naumann +vnoremap * :call VisualSelection('f', '') +vnoremap # :call VisualSelection('b', '') + +" }}} + +" Moving around, tabs, windows and buffers {{{ + +" Treat long lines as break lines (useful when moving around in them) +nnoremap j gj +nnoremap k gk + +noremap h +noremap k +noremap j +noremap l + +" Disable highlight when is pressed +" but preserve cursor coloring +nmap :noh\|hi Cursor guibg=red +augroup haskell + autocmd! + autocmd FileType haskell map :noh:GhcModTypeClear:SyntasticReset + autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc +augroup END + +" Return to last edit position when opening files (You want this!) +augroup last_edit + autocmd! + autocmd BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal! g`\"" | + \ endif +augroup END +" Remember info about open buffers on close set viminfo^=% + +" Open window splits in various places +nmap sh :leftabove vnew +nmap sl :rightbelow vnew +nmap sk :leftabove new +nmap sj :rightbelow new + +" Manually create key mappings (to avoid rebinding C-\) +let g:tmux_navigator_no_mappings = 1 + +nnoremap :TmuxNavigateLeft +nnoremap :TmuxNavigateDown +nnoremap :TmuxNavigateUp +nnoremap :TmuxNavigateRight + +" don't close buffers when you aren't displaying them +set hidden + +" previous buffer, next buffer +nnoremap bp :bp +nnoremap bn :bn + +" delete buffer without closing pane +noremap bd :Bd + +" fuzzy find buffers +noremap b :CtrlPBuffer + +" }}} + +" Status line {{{ + +" Always show the status line set laststatus=2 -set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l/%L\ \ Column:\ %c -map 0 ^ -nmap mz:m+`z -nmap mz:m-2`z -vmap :m'>+`mzgv`yo`z -vmap :m'<-2`>my` - nmap - vmap - vmap -endif + +" }}} + +" Editing mappings {{{ + +" Delete trailing white space on save func! DeleteTrailingWS() exe "normal mz" %s/\s\+$//ge exe "normal `z" endfunc -autocmd BufWrite *.py :call DeleteTrailingWS() -autocmd BufWrite *.coffee :call DeleteTrailingWS() -vnoremap gv :call VisualSelection('gv') -map g :vimgrep // **/*. -map :vimgrep // % -vnoremap r :call VisualSelection('replace') -map cc :botright cope -map co ggVGy:tabnew:set syntax=qfpgg -map n :cn -map p :cp + +augroup whitespace + autocmd! + autocmd BufWrite *.hs :call DeleteTrailingWS() +augroup END + +" }}} + +" Spell checking {{{ + +" Pressing ,ss will toggle and untoggle spell checking map ss :setlocal spell! -map sn ]s -map sp [s -map sa zg -map s? z= -noremap m mmHmt:%s///ge'tzt'm -map q :e ~/buffer -map pp :setlocal paste! + +" }}} + +" Helper functions {{{ + function! CmdLine(str) - exe "menu Foo.Bar :" . a:str - emenu Foo.Bar - unmenu Foo -endfunction -function! VisualSelection(direction) range - let l:saved_reg = @" - execute "normal! vgvy" + exe "menu Foo.Bar :" . a:str + emenu Foo.Bar + unmenu Foo +endfunction - let l:pattern = escape(@", '\\/.*$^~[]') - let l:pattern = substitute(l:pattern, "\n$", "", "") +function! VisualSelection(direction, extra_filter) range + let l:saved_reg = @" + execute "normal! vgvy" - if a:direction == 'b' - execute "normal ?" . l:pattern . "^M" - elseif a:direction == 'gv' - call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.') - elseif a:direction == 'replace' - call CmdLine("%s" . '/'. l:pattern . '/') - elseif a:direction == 'f' - execute "normal /" . l:pattern . "^M" - endif + let l:pattern = escape(@", '\\/.*$^~[]') + let l:pattern = substitute(l:pattern, "\n$", "", "") - let @/ = l:pattern - let @" = l:saved_reg -endfunction -function! HasPaste() - if &paste - return 'PASTE MODE ' - en - return '' -endfunction -command! Bclose call BufcloseCloseIt() -function! BufcloseCloseIt() - let l:currentBufNum = bufnr("%") - let l:alternateBufNum = bufnr("#") + if a:direction == 'b' + execute "normal ?" . l:pattern . "^M" + elseif a:direction == 'gv' + call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.' . a:extra_filter) + elseif a:direction == 'replace' + call CmdLine("%s" . '/'. l:pattern . '/') + elseif a:direction == 'f' + execute "normal /" . l:pattern . "^M" + endif - if buflisted(l:alternateBufNum) - buffer # - else - bnext - endif - - if bufnr("%") == l:currentBufNum - new - endif - - if buflisted(l:currentBufNum) - execute("bdelete! ".l:currentBufNum) - endif -endfunction -" Commenting blocks of code. -autocmd FileType c,cpp,java,scala,javascript let b:comment_leader = '// ' -autocmd FileType sh,ruby,python let b:comment_leader = '# ' -autocmd FileType conf,fstab let b:comment_leader = '# ' -autocmd FileType tex let b:comment_leader = '% ' -autocmd FileType vim let b:comment_leader = '" ' -noremap cc :s/^/=escape(b:comment_leader,'\/')/:nohlsearch -noremap cu :s/^\V=escape(b:comment_leader,'\/')//e:nohlsearch -vnoremap cc :s/^/=escape(b:comment_leader,'\/')/:nohlsearch -vnoremap cu :s/^\V=escape(b:comment_leader,'\/')//e:nohlsearch - -highlight ColorColumn ctermbg=magenta -call matchadd('ColorColumn', '\%80v', 100) - -nnoremap n n:call HLNext(0.4) -nnoremap N N:call HLNext(0.4) - -highlight WhiteOnRed ctermbg=red ctermfg=white - -function! HLNext(blinktime) - let [bufnum, lnum, col, off] = getpos('.') - let machlen = strlen(matchstr(strpart(getline('.'), col-1),@/)) - let target_pat = '\c\%#'.@/ - let blinks = 3 - for n in range(1, blinks) - let red = matchadd('WhiteOnRed', target_pat, 101) - redraw - exec 'sleep ' . float2nr(a:blinktime / (2*blinks) * 1000) . 'm' - call matchdelete(red) - redraw - exec 'sleep ' . float2nr(a:blinktime / (2*blinks) * 1000) . 'm' - endfor + let @/ = l:pattern + let @" = l:saved_reg endfunction -" VimScript Highlighting is so fucking distracting -augroup VimNoHighlight - autocmd! - autocmd BufEnter .vimrc syntax off -augroup END +" }}} -augroup NoEdits - autocmd! - autocmd SwapExists * let v:swapchoice = 'o' - autocmd SwapExists * echomsg ErrorMsg - autocmd SwapExists * echo 'Duplicate edit session (you are now editing readonly)' - autocmd SwapExists * echohl None -augroup END +" Slime {{{ -inoremap ShowDigraphs +vmap rs SendSelectionToTmux +nmap rs NormalModeSendToTmux +nmap rv SetTmuxVars -function! ShowDigraphs() - digraphs - call getchar() - return "\" +" }}} + +" NERDTree {{{ + +" Close nerdtree after a file is selected +let NERDTreeQuitOnOpen = 1 + +function! IsNERDTreeOpen() + return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction + +function! ToggleFindNerd() + if IsNERDTreeOpen() + exec ':NERDTreeToggle' + else + exec ':NERDTreeFind' + endif +endfunction + +" If nerd tree is closed, find current file, if open, close it +nmap f :call ToggleFindNerd() +nmap F :NERDTreeToggle + +" }}} + +" Alignment {{{ + +" Stop Align plugin from forcing its mappings on us +let g:loaded_AlignMapsPlugin=1 +" Align on equal signs +map a= :Align = +" Align on commas +map a, :Align , +" Align on pipes +map a :Align +" Prompt for align character +map ap :Align + +" Enable some tabular presets for Haskell +let g:haskell_tabular = 1 + +" }}} + +" Tags {{{ + +set tags=tags;/,codex.tags;/ + +let g:tagbar_type_haskell = { + \ 'ctagsbin' : 'hasktags', + \ 'ctagsargs' : '-x -c -o-', + \ 'kinds' : [ + \ 'm:modules:0:1', + \ 'd:data: 0:1', + \ 'd_gadt: data gadt:0:1', + \ 't:type names:0:1', + \ 'nt:new types:0:1', + \ 'c:classes:0:1', + \ 'cons:constructors:1:1', + \ 'c_gadt:constructor gadt:1:1', + \ 'c_a:constructor accessors:1:1', + \ 'ft:function types:1:1', + \ 'fi:function implementations:0:1', + \ 'o:others:0:1' + \ ], + \ 'sro' : '.', + \ 'kind2scope' : { + \ 'm' : 'module', + \ 'c' : 'class', + \ 'd' : 'data', + \ 't' : 'type' + \ }, + \ 'scope2kind' : { + \ 'module' : 'm', + \ 'class' : 'c', + \ 'data' : 'd', + \ 'type' : 't' + \ } +\ } + +" Generate haskell tags with codex and hscope +map tg :!codex update --force:call system("git hscope -X TemplateHaskell"):call LoadHscope() + +map tt :TagbarToggle + +set csprg=~/.haskell-vim-now/bin/hscope +set csto=1 " search codex tags first +set cst +set csverb +nnoremap :cs find c =expand("") +" Automatically make cscope connections +function! LoadHscope() + let db = findfile("hscope.out", ".;") + if (!empty(db)) + let path = strpart(db, 0, match(db, "/hscope.out$")) + set nocscopeverbose " suppress 'duplicate connection' error + exe "cs add " . db . " " . path + set cscopeverbose + endif +endfunction +au BufEnter /*.hs call LoadHscope() + +" }}} + +" Git {{{ + +let g:extradite_width = 60 +" Hide messy Ggrep output and copen automatically +function! NonintrusiveGitGrep(term) + execute "copen" + " Map 't' to open selected item in new tab + execute "nnoremap t T" + execute "silent! Ggrep " . a:term + execute "redraw!" +endfunction + +command! -nargs=1 GGrep call NonintrusiveGitGrep() +nmap gs :Gstatus +nmap gg :copen:GGrep +nmap gl :Extradite! +nmap gd :Gdiff +nmap gb :Gblame + +function! CommittedFiles() + " Clear quickfix list + let qf_list = [] + " Find files committed in HEAD + let git_output = system("git diff-tree --no-commit-id --name-only -r HEAD\n") + for committed_file in split(git_output, "\n") + let qf_item = {'filename': committed_file} + call add(qf_list, qf_item) + endfor + " Fill quickfix list with them + call setqflist(qf_list, '') +endfunction + +" Show list of last-committed files +nnoremap g? :call CommittedFiles():copen + +" }}} + +" Haskell Interrogation {{{ + +set completeopt+=longest + +" Use buffer words as default tab completion +let g:SuperTabDefaultCompletionType = '' + +" But provide (neco-ghc) omnicompletion +if has("gui_running") + imap =SuperTabAlternateCompletion("\c-x>\c-o>") +else " no gui + if has("unix") + inoremap =SuperTabAlternateCompletion("\c-x>\c-o>") + endif +endif + +" Show types in completion suggestions +let g:necoghc_enable_detailed_browse = 1 + +" Type of expression under cursor +nmap ht :GhcModType +" Insert type of expression under cursor +nmap hT :GhcModTypeInsert +" GHC errors and warnings +nmap hc :SyntasticCheck ghc_mod +" Haskell Lint +let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['haskell'] } +nmap hl :SyntasticCheck hlint + +" Hoogle the word under the cursor +nnoremap hh :Hoogle + +" Hoogle and prompt for input +nnoremap hH :Hoogle + +" Hoogle for detailed documentation (e.g. "Functor") +nnoremap hi :HoogleInfo + +" Hoogle for detailed documentation and prompt for input +nnoremap hI :HoogleInfo + +" Hoogle, close the Hoogle window +nnoremap hz :HoogleClose + +" }}} + +" Conversion {{{ + +function! Pointfree() + call setline('.', split(system('pointfree '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n")) +endfunction +vnoremap h. :call Pointfree() + +function! Pointful() + call setline('.', split(system('pointful '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n")) +endfunction +vnoremap h> :call Pointful() + +" }}} + +" Customization {{{ + +if filereadable(expand("~/.vimrc.local")) + source ~/.vimrc.local +endif + +" }}} diff --git a/zshrc b/zshrc index 3cdb325..7eaec77 100644 --- a/zshrc +++ b/zshrc @@ -188,6 +188,7 @@ pinfo(){ save_dotfiles(){ local DOTPATH=~/Documents/Code/Github/.dotfiles/ cp ~/.bash_profile ${DOTPATH}bash_profile + cp -r ~/.cabal ${DOTPATH}cabal cp ~/dev-tmux ${DOTPATH}dev-tmux cp ~/.ghci ${DOTPATH}ghci cp ~/.gitignore ${DOTPATH}gitignore @@ -196,7 +197,9 @@ save_dotfiles(){ cp ~/.pythonrc ${DOTPATH}pythonrc cp ~/.tmux.conf ${DOTPATH}tmux.conf cp ~/.valgrindrc ${DOTPATH}valgrindrc + cp -r ~/.vim ${DOTPATH}vim cp ~/.vimrc ${DOTPATH}vimrc + cp ~/.vimrc.local ${DOTPATH}vimrc.local cp ~/.zshrc ${DOTPATH}zshrc }