Files
dotfiles/vimrc
T
2019-03-12 13:36:38 +01:00

360 lines
7.3 KiB
VimL

" General {{{
" Sets how many lines of history VIM has to remember
set history=700
" 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 <leader>w saves the current file
let mapleader = ","
let g:mapleader = ","
" 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"
" Kill the damned Ex mode.
nnoremap Q <nop>
" }}}
" Vundle {{{
set nocompatible
filetype off
set rtp+=~/.vim/bundle/vundle
call vundle#rc()
" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'
" Support bundles
Bundle 'scrooloose/syntastic'
" Other programming languages
Bundle 'zepto-lang/zepto-vim'
Bundle 'hellerve/carp-vim'
Bundle 'tikhomirov/vim-glsl'
Plugin 'rust-lang/rust.vim'
Plugin 'isRuslan/vim-es6'
Plugin 'JuliaEditorSupport/julia-vim'
" Extra
Plugin 'editorconfig/editorconfig-vim'
" }}}
" VIM user interface {{{
" Turn on the WiLd menu
set wildmenu
" Tab-complete files up to longest unambiguous prefix
set wildmode=list:longest,full
" Always show current position
set ruler
" 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 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 <silent> <leader>r :redraw!<CR>
" Default to mouse mode on
set mouse=a
" }}}
" Enable syntax highlighting
syntax enable
" Adjust signscolumn and syntastic to match wombat
hi! link SignColumn LineNr
hi! link SyntasticErrorSign ErrorMsg
hi! link SyntasticWarningSign WarningMsg
" Enable filetype plugins
filetype plugin on
filetype indent on
" Use same color behind concealed unicode characters
hi clear Conceal
" Set paste mode and use system clipboard
set paste
set clipboard=unnamed
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 <leader>e :e <C-R>=expand("%:p:h") . '/'<CR>
" Fuzzy find files
nnoremap <silent> <Leader><space> :CtrlP<CR>
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
" 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
" }}}
" Visual mode related {{{
" Visual mode pressing * or # searches for the current selection
" Super useful! From an idea by Michael Naumann
vnoremap <silent> * :call VisualSelection('f', '')<CR>
vnoremap <silent> # :call VisualSelection('b', '')<CR>
" }}}
" 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 <c-h> <c-w>h
noremap <c-k> <c-w>k
noremap <c-j> <c-w>j
noremap <c-l> <c-w>l
" 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^=%
" don't close buffers when you aren't displaying them
set hidden
" }}}
" Status line {{{
let g:mode_map={
\ '__' : '------',
\ 'c' : 'COMMAND',
\ 'i' : 'INSERT',
\ 'ic' : 'INSERT COMPL',
\ 'ix' : 'INSERT COMPL',
\ 'n' : 'NORMAL',
\ 'ni' : '(INSERT)',
\ 'no' : 'OP PENDING',
\ 'R' : 'REPLACE',
\ 'Rv' : 'V REPLACE',
\ 's' : 'SELECT',
\ 'S' : 'S-LINE',
\ '' : 'S-BLOCK',
\ 't' : 'TERMINAL',
\ 'v' : 'VISUAL',
\ 'V' : 'V-LINE',
\ '' : 'V-BLOCK',
\ }
let g:mode_color_map={
\ '__' : 'magenta',
\ 'c' : 'red',
\ 'i' : '208',
\ 'ic' : '208',
\ 'ix' : '208',
\ 'n' : 'white',
\ 'ni' : '208',
\ 'no' : 'red',
\ 'R' : '135',
\ 'Rv' : '135',
\ 's' : '135',
\ 'S' : '135',
\ '' : '135',
\ 't' : 'white',
\ 'v' : '135',
\ 'V' : '135',
\ '' : '135',
\ }
function! GetMode()
let col=get(g:mode_color_map, mode(), mode())
exec printf("hi StatusLine ctermbg=%s", col)
return get(g:mode_map, mode(), mode())
endfunction
set statusline=%{GetMode()}\ \ \ \ %.20f\ %m\ %r%=%c\ %l\/%L\ \(%2p%%\)\ %y
"set statusline=%y
" Always show the status line
set laststatus=2
" }}}
" Editing mappings {{{
" Delete trailing white space on save
func! DeleteTrailingWS()
exe "normal mz"
%s/\s\+$//ge
exe "normal `z"
endfunc
augroup whitespace
autocmd!
autocmd BufWrite *.hs :call DeleteTrailingWS()
augroup END
" }}}
" Helper functions {{{
function! CmdLine(str)
exe "menu Foo.Bar :" . a:str
emenu Foo.Bar
unmenu Foo
endfunction
function! VisualSelection(direction, extra_filter) range
let l:saved_reg = @"
execute "normal! vgvy"
let l:pattern = escape(@", '\\/.*$^~[]')
let l:pattern = substitute(l:pattern, "\n$", "", "")
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
let @/ = l:pattern
let @" = l:saved_reg
endfunction
" }}}
" Tags {{{
set tags=tags;/,codex.tags;/
" }}}
" Conversion {{{
function! Pointfree()
call setline('.', split(system('pointfree '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n"))
endfunction
vnoremap <silent> <leader>h. :call Pointfree()<CR>
function! Pointful()
call setline('.', split(system('pointful '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n"))
endfunction
vnoremap <silent> <leader>h> :call Pointful()<CR>
" }}}
let g:syntastic_carp_checkers = ['carp']
command Cr !carp -x %