dotfiles/vim/vimrc
2019-08-01 16:18:43 +00:00

212 lines
9.8 KiB
VimL

" ==============================================================================
" vimrc file for niblock :: Use `:so %` to re-source after changes
" ==============================================================================
" ==============================================================================
" General Settings
" ==============================================================================
set nocompatible " Why? (https://goo.gl/2RiJoo)
if !exists('g:syntax_on')
syntax enable " Syntax hilighting
endif
filetype plugin indent on " Enable filetype/indent/plugins
set encoding=utf-8 " Character encoding
set spelllang=en_us " Set default dictionary
set autoread " Auto-reload modified files
set hidden " Allow for un-saved buffers
set autochdir " Change directory automatically
set clipboard+=unnamed " Include the global buffer
set autoindent " Enable auto-indentation
set expandtab " Spaces for tab
set shiftwidth=2 " Spaces per shift
set softtabstop=2 " Spaces to use when editing
set listchars=tab:>-,trail" Show me tabs and spaces
set number " Enable line numbers
set wrap " Wrap text
set textwidth=80 " How long a line is
set winwidth=90 " Minimum width of a window
set scrolloff=5 " 5 line scroll buffer
set foldmethod=indent " Fold on indent
set foldlevelstart=99 " No default folding
set path+=** " Recursive filename completion
set wildmenu " Enable wildmenu
set wildmode=list:longest:full " Configure wildmenu
set wildignorecase " Ignore case for wildmenu
set ignorecase smartcase " Ignore case, unless it matters
set incsearch " Zoom to results as I search
set nohlsearch " Disable search highlighting
let g:netrw_liststyle=3 " Netrw Tree list style
let g:netrw_banner=0 " Disable the netrw banner
augroup ruby_settings " Custom settings: Ruby{-like}
autocmd!
autocmd FileType ruby,eruby,yaml
\ setlocal makeprg=rubocop
augroup END
augroup python_settings " Custom settings: Python-like
autocmd!
autocmd FileType py
\ setlocal shiftwidth=4
\ softtabstop=4
augroup END
augroup shell_settings " Custom settings: Shell-like
autocmd!
autocmd FileType sh
\ setlocal makeprg=shellcheck
augroup END
augroup spellcheckr " Spelling, for some files...
autocmd!
autocmd BufNewFile,BufRead *.md,*.rdoc,*.txt,*.wiki
\ setlocal spell
augroup END
augroup lintr " Linting, based on :make!
autocmd!
autocmd BufWritePost *.rb,*.sh
\ silent make! <afile> | silent redraw!
autocmd QuickFixCmdPost [^l]* cwindow
augroup END
" ==============================================================================
" Colors
" ==============================================================================
augroup user_stl_colors " Custom status-line colors
autocmd!
autocmd ColorScheme *
\ hi User1 term=bold cterm=bold ctermfg=Red ctermbg=DarkGrey |
\ hi User2 term=bold cterm=bold ctermfg=Cyan ctermbg=DarkGrey |
\ hi User3 term=bold cterm=bold ctermfg=White ctermbg=DarkGrey |
\ hi User4 ctermfg=White ctermbg=Black |
\ hi User5 ctermfg=150 ctermbg=Black |
\ hi User6 ctermfg=Grey ctermbg=Black
augroup END
if filereadable(expand('~/.vim/colors/minimalist.vim'))
colorscheme minimalist " Set colorscheme
endif
" ==============================================================================
" Status Line
" ==============================================================================
set laststatus=2 " Enable the statusline
set statusline=%!ActiveStatus() " Style it
function! ActiveStatus() abort " When in the active window
let statusline="" " Initialize it
let statusline.="%3*%m" " Modified flag
let statusline.="%6*%{expand('%:p:h')}/" " Full-path to current buffer
let statusline.="%4*%t" " File name
let statusline.="%5*%{GitBranch()}" " Show Git branch, if applicable
let statusline.="%=" " Switch to right-side
let statusline.="%4*%y\ " " Filetype
let statusline.="%3*" " Color change (see :hi)
let statusline.="\|%4l\:%2c\|" " Line and column
let statusline.="%2*%{&spell?'[SPELL]':''}" " Spell flag
let statusline.="%1*%r%0*" " Read-only flag
return statusline
endfunction
function! PassiveStatus() abort " When in a non-active window
let statusline="" " Initialize it
let statusline.="%6*%m" " Modified flag
let statusline.="%{expand('%:p:h')}/" " Full-path to current buffer
let statusline.="%t" " File name
let statusline.="%{GitBranch()}" " Show Git branch, if applicable
let statusline.="%=" " Switch to right-side
let statusline.="%y\ " " Filetype
let statusline.="\|%4l\:%2c\|" " Line and column
let statusline.="%{&spell?'[SPELL]':''}" " Spell flag
let statusline.="%r%0*" " Read-only flag
return statusline
endfunction
augroup user_statusline " Change based on active window
autocmd!
autocmd WinEnter * setlocal statusline=%!ActiveStatus()
autocmd WinLeave * setlocal statusline=%!PassiveStatus()
augroup END
" ==============================================================================
" Mappings
" ==============================================================================
let mapleader = ','
" Make moving up/down work on wrapped lines of text
nnoremap <silent> j gj
nnoremap <silent> k gk
nnoremap <silent> ^ g^
nnoremap <silent> $ g$
" Toggle fold with space if we're in a fold, otherwise just space
nnoremap <silent> <Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
vnoremap <Space> zf
" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %
" Remove Trailing Whitespaace
nnoremap <silent> <leader>rtw :<C-u>%s/\s\+$//e<CR>
" Open help topic in a full new tab
command! -nargs=1 -complete=help H :tabnew | :set buftype=help | :h <args>
" Simple mapping to dotfiles directory (f = current tab; F = new tab)
nnoremap <silent> <leader>f :<C-u>edit ~/.dotfiles/<CR>
nnoremap <silent> <leader>F :<C-u>tabnew ~/.dotfiles/<CR>
" Emulate vim-vinegar
nnoremap <silent> - :silent edit <C-R>=empty(expand('%')) ? '.' :
\ expand('%:p:h')<CR><CR>
" Send the select range to the specified pane
command! -nargs=? -range Twrite execute TmuxWrite(<q-args>, <line1>, <line2>)
" Some notes/wiki shortcuts
nnoremap <silent> <leader>ww :<C-u>edit ~/Documents/Wiki/index.md<CR>
nnoremap <silent> <leader>ws :<C-u>vsplit ~/Documents/Wiki/scratchpad.md<CR>
nnoremap <silent> <leader>wt :<C-u>vsplit ~/Documents/Wiki/to-do.md<CR>
nnoremap <silent> <leader>wd :<C-u>edit ~/Documents/Wiki/diary/diary.wiki<CR>
nnoremap <silent> <leader>tj :call NewJournal()<CR>
nnoremap <silent> <leader><Space> :<C-u>execute "normal! f(gf"<CR>
" ==============================================================================
" Functions
" ==============================================================================
" Read from the journal template, and replace 'Date' with today's date
function! NewJournal() abort
.-1read ~/.vim/templates/journal
s/Date/\=strftime("%A, %B %d")/
endfunction
" Fetch the git branch of the current file, if applicable
function! GitBranch() abort
let l:branchname = system("git rev-parse --abbrev-ref HEAD 2>/dev/null
\ | tr -d '\n'")
return strlen(l:branchname) > 0 ? '#'.l:branchname : ''
endfunction
" Simple tmux send-keys functionality
function! TmuxWrite(pane, line1, line2) abort
let l:val = join(filter(map(getline(a:line1, a:line2),
\ 'substitute(v:val, "^\\s*", "", "")'),
\ "!empty(v:val)"),
\ "\r")
try
if empty(a:pane)
throw 'Twrite Failed: No pane provided'
endif
let l:panes = systemlist('tmux list-panes -t '.a:pane.' -F "#D
\ #{pane_active}"')
let l:target = substitute(
\join(filter(l:panes, 'match(v:val, ''%\d 1'') == 0'), ""),
\'\(%\d\) 1', '\1', "")
if l:target ==# $TMUX_PANE
throw 'Twrite Failed: Not writing self'
endif
let l:out = system('tmux send-keys -t'.l:target.' "" '
\.shellescape(l:val))
if v:shell_error
throw 'Twrite Failed: '.l:out[0:-2]
endif
echo len(l:val).' keys sent to '.a:pane
return ''
catch /.*/
return 'echoerr '.string(v:exception)
endtry
endfunction