" ============================================================================== " 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! | 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 j gj nnoremap k gk nnoremap ^ g^ nnoremap $ g$ " Toggle fold with space if we're in a fold, otherwise just space nnoremap @=(foldlevel('.')?'za':"\") vnoremap 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 rtw :%s/\s\+$//e " Open help topic in a full new tab command! -nargs=1 -complete=help H :tabnew | :set buftype=help | :h " Simple mapping to dotfiles directory (f = current tab; F = new tab) nnoremap f :edit ~/.dotfiles/ nnoremap F :tabnew ~/.dotfiles/ " Emulate vim-vinegar nnoremap - :silent edit =empty(expand('%')) ? '.' : \ expand('%:p:h') " Send the select range to the specified pane command! -nargs=? -range Twrite execute TmuxWrite(, , ) " Some notes/wiki shortcuts nnoremap ww :edit ~/Documents/Wiki/index.md nnoremap ws :vsplit ~/Documents/Wiki/scratchpad.md nnoremap wt :vsplit ~/Documents/Wiki/to-do.md nnoremap wd :edit ~/Documents/Wiki/diary/diary.wiki nnoremap tj :call NewJournal() nnoremap :execute "normal! f(gf" " ============================================================================== " 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