diff --git a/vimrc b/vimrc new file mode 100644 index 0000000..eea3c74 --- /dev/null +++ b/vimrc @@ -0,0 +1,557 @@ +" ● + +if &shell =~# 'fish$' + set shell=bash +endif + +" #plugins {{{ + +if has('nvim') + if empty(glob('~/.config/nvim/autoload/plug.vim'))"{{{ + silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC + endif + "}}} + + call plug#begin('~/.vim/bundle') + source ~/.config/nvim/init.plugins.vim + " +else + if empty(glob('~/.vim/autoload/plug.vim'))"{{{ + silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC + endif + "}}} + + call plug#begin('~/.config/nvim/bundle') + source ~/.config/vim/vimrc.plugins.vim +endif + +source ~/.config/vim/vimrc.plugins.shared +call plug#end() + +runtime macros/matchit.vim + + +"----------------------------------------------------------------------------}}} +" #functions {{{ + +function! MyFoldText() "{{{ + if !exists('g:foldtext_column') + let g:foldtext_column = 80 " column to right align foldtext with + endif + + if !exists('b:foldtext_column') + let b:foldtext_column = g:foldtext_column " column to right align foldtext with + endif + + if !exists('g:foldtext_maxcolumn') + let g:foldtext_maxcolumn = 120 + endif + + let l:linecount = v:foldend - v:foldstart + " don't display foldmarker braces + " put one of the braces in brackets so vim doesn't treat + " it as an actual fold marker + let l:line = substitute(getline(v:foldstart), '"\?{\({\){', '', '') + " don't display vim comment quotation marks + " TODO other comment markers + let l:line = substitute(l:line, "\^\"\\s\\?", '', '') + + " let l:postfix = l:linecount . ' ' . substitute(v:folddashes, '-', '•', 'g') + let l:postfix = l:linecount . ' ' . substitute(v:folddashes, '-', '↓', 'g') + while strchars(l:postfix) < 7 + let l:postfix = ' ' . l:postfix + endwhile + " let l:postfix = ' ↓ ' . l:postfix + + let l:len_line = len(l:line) + let l:len_postfix = strchars(l:postfix) + + if l:len_line + l:len_postfix <= b:foldtext_column + let l:padding = ' '[l:len_line + l:len_postfix + 0:b:foldtext_column - 1] + let l:foldtext = l:line . l:padding . l:postfix + else + let l:sniptext = ' ⋯' + let l:foldtext = l:line[:b:foldtext_column - 1 - strchars(l:sniptext) - l:len_postfix] . l:sniptext . l:postfix + endif + + return l:foldtext +endfunction + +"}}} +function! SynStack()"{{{ + if !exists('*synstack') + return + endif + echo map(synstack(line('.'), col('.')), 'synIDattr(v:val,"name")') '-> ' . synIDattr(synIDtrans(synID(line('.'),col('.'),1)), 'name' ) +endfunc +nmap pp :call SynStack() +"}}} + +function! s:RunShellCommand(cmdline) abort"{{{ +" Shell command +" http://vim.wikia.com/wiki/VimTip1599 + + let l:expanded_cmdline = a:cmdline + for l:part in split(a:cmdline, ' ') + if l:part[0] =~ '\v[%#<]' + let l:expanded_part = fnameescape(expand(l:part)) + let l:expanded_cmdline = substitute(l:expanded_cmdline, l:part, l:expanded_part, '') + endif + endfor + + if g:shell_scratch_buffer_nr > -1 + let l:win_nr = bufwinnr(g:shell_scratch_buffer_nr) + if l:win_nr < 0 + execute 'bdelete' g:shell_scratch_buffer_nr + top new + let g:shell_scratch_buffer_nr = bufnr('%') + else + execute l:win_nr. ' wincmd w' + setlocal modifiable + %delete _ + endif + else + top new + let g:shell_scratch_buffer_nr = bufnr('%') + endif + + setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap + nnoremap q :bdelete + augroup ResetShellBufferNr + autocmd! * + autocmd BufUnload let g:shell_scratch_buffer_nr = -1 + augroup END + + " call setline(1, 'You entered: ' . a:cmdline) + " call setline(2, 'Expanded Form: ' .l:expanded_cmdline) + " call setline(3,substitute(getline(2),'.','=','g')) + execute '$read !'. l:expanded_cmdline + 1 + + setlocal nomodifiable + if !exists('b:shell_line_count') + let b:shell_line_count = line('$') + if b:shell_line_count > 25 + let b:shell_line_count = 20 + endif + execute 'resize' b:shell_line_count + 1 + endif + + wincmd p +endfunction + +command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand() +let g:shell_scratch_buffer_nr = -1 + +"}}} +function! SaveAndExecute(ex_command) abort "{{{ +" https://stackoverflow.com/a/40195855 +" ex_command: command to run to execute file + " SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim + + " save and reload current file + silent execute 'update | edit' + + " get file path of current file + let s:current_buffer_file_path = expand('%') + + let s:output_buffer_name = 'Output' + let s:output_buffer_filetype = 'output' + + " reuse existing buffer window if it exists otherwise create a new one + if !exists('c:buf_nr') || !bufexists(s:buf_nr) || bufwinnr(s:buf_nr) == -1 + silent execute 'top new ' . s:output_buffer_name + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + silent execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + silent execute 'setlocal filetype=' . s:output_buffer_filetype + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal winfixheight + setlocal cursorline " make it easy to distinguish + " setlocal nonumber + " setlocal norelativenumber + setlocal showbreak="" + + nnoremap q :bdelete!'.zz + + " clear the buffer + setlocal noreadonly + " setlocal modifiable + %delete _ + + " add the console output + silent execute '.!'. a:ex_command . ' ' . shellescape(s:current_buffer_file_path, 1) + + " resize window to content length + " Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function. + " However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function. + " But if you close the output buffer then it returns to using the default size when its recreated + "execute 'resize' . line('$') + + " make the buffer non modifiable + setlocal readonly + " setlocal nomodifiable +endfunction + +"}}} +function! JsIncludeExpr(file)"{{{ + " substitute(substitute(v:fname,'^[\\~@]\/','./',''),'^[\\~@]','./node_modules/','') + return substitute(substitute(a:file,'^[\\~@]\/','./',''),'^[\\~@]','./node_modules/','') + +endfunction + +"}}} +function! Redir(cmd) "{{{ + for win in range(1, winnr('$')) + if getwinvar(win, 'scratch') + execute win . 'windo close' + endif + endfor + if a:cmd =~ '^!' + let output = system(matchstr(a:cmd, '^!\zs.*')) + else + redir => output + execute a:cmd + redir END + endif + vnew + let w:scratch = 1 + setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile + call setline(1, split(output, "\n")) +endfunction + +command! -nargs=1 -complete=command Redir silent call Redir() +" Usage: +" :Redir hi ............. show the full output of command ':hi' in a scratch window +" :Redir !ls -al ........ show the full output of command ':!ls -al' in a scratch window +"}}} +"----------------------------------------------------------------------------}}} +"#commands{{{ +" TrimWhitespace{{{ +command! -range=% TrimWhitespace let b:wv = winsaveview() | + \ keeppattern ,s/\s\+$// | + \ call winrestview(b:wv) +"}}} +" Scratch, ScratchVertical{{{ +command! Scratch new | setlocal buftype=nofile | setlocal bufhidden=hide | setlocal noswapfile +command! ScratchVertical vnew | setlocal buftype=nofile | setlocal bufhidden=hide | setlocal noswapfile +"}}} +"}}} +" #settings {{{ +scriptencoding utf-8 + +syntax on +set fillchars=stl:\ ,stlnc:\ ,vert:\|,fold:\ + +set guioptions-=mTrLb +set guioptions+=c + +if exists('+termguicolors') + let &t_8f = "\[38;2;%lu;%lu;%lum" + let &t_8b = "\[48;2;%lu;%lu;%lum" + set termguicolors +endif + +colorscheme monotonous-dark + +set updatetime=100 +set timeoutlen=500 +set lazyredraw + +" the ;/home/ray tells vim to stop searching at /home/ray +set tags+=./.tags,.tags,./tags-py,.tags-py;/home/ray/ + +" persisitent undo file +set undofile +set undodir=~/.vim/.vimtmp +set backupdir=~/.vim/.vimtmp +set directory=~/.vim/.vimtmp + +set viewoptions-=options + +set ignorecase +set smartcase + +set wildmenu +set wildmode=longest:full,full +set wildignore+=/node_modules/,dist/ + +" Use ag over grep +if executable('ag') + set grepprg=ag\ --nogroup\ --nocolor\ --ignore\ node_modules +endif + +set hidden + +set hlsearch + +set completeopt=menuone + +set nospell +set spelllang=en_gb + +set diffopt+=vertical + +set rnu nu + +set tabstop=8 +set softtabstop=2 +set shiftwidth=2 +set shiftround +set expandtab +set autoindent + +set textwidth=120 +set formatoptions=cq +set wrapmargin=0 + +set cursorline + +set foldcolumn=2 +if has('patch-7-4-2201') + set signcolumn=yes +endif +set colorcolumn=80,120 + +set iskeyword+=- +set scrolloff=10 +set showcmd +set incsearch + +set laststatus=2 +set shortmess=aoOT +set cmdheight=3 + +set foldmethod=indent +set foldnestmax=3 +set foldlevelstart=2 + +set showmode + +set autoindent +set breakindent +set showbreak=\ \ ↳\ + +set mouse=a + +set listchars=eol:¬,tab:>-,trail:~,extends:>,precedes:<,space:· + +set foldtext=MyFoldText() +set conceallevel=0 +"----------------------------------------------------------------------------}}} +" #mappings {{{ +let g:mapleader = ' ' +" search and replace {{{ +nnoremap rr :%s/\<=expand('')\>//g +"}}} +" #syntax +nnoremap s :syntax on +nnoremap S :syntax off +" miscallaneous {{{ +nnoremap l :colorscheme monotonous-light +nnoremap d :colorscheme monotonous-dark +nnoremap 0 ^ +nnoremap cs :let @/="" +nnoremap : :setlocal number: +nnoremap rc :so $MYVIMRC +nnoremap nh (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n" +nnoremap sl :set invlist +nnoremap aa A +nnoremap a2 A +nnoremap ab AB +nnoremap co :!clear; +nnoremap ;; A; +nnoremap ;j jA; +nnoremap ,, A, +nnoremap ,j jA, +" Focus on current fold, close the rest +nnoremap zz zMzvzt +" replace current word with last yanked/deleted text +nnoremap rw "_diwP +" replace current word with last yanked text +nnoremap ry diw"0P +" quick grep of visual selection +vnoremap gr y:grep! -R " . +" open quickfix window of TODOs +" FIXME i want fixme!!! +nnoremap td :grep -RE '(TODO\\|FIXME)' .:botright cwindow:echo len(getqflist()) 'TODOs' +" devdocs mapping +nnoremap dd :DD +" write and delete current buffer +nnoremap bx :w\|bd +" sync highlighting from start +nnoremap ss :syntax sync fromstart + +"}}} +" terminal{{{ +if has('terminal') + tnoremap +endif +"}}} +" windows{{{ + nnoremap ww :resize:vertical resize + +" }}} +" git mappings {{{ +" also see vim-fugitive plugin section +nnoremap gD :!clear; echo 'git diff'; git diff +nnoremap ga :!clear; git add %; git status +nnoremap gA :!clear; git add .; git status +nnoremap gg :!clear; git add %; git commit -m '' +nnoremap gP :!clear; echo 'git push'; git push + +"}}} +" movement/navigation{{{ +nnoremap j :resize -5 +nnoremap k :resize +5 +nnoremap l :vertical resize +5 +nnoremap h :vertical resize -5 +" alias for :tjump +nnoremap tj g +" alias for :ptjump +nnoremap tp g} + +"}}} +" location list and quickfix mappings {{{ +nnoremap lo :botright lwindow +nnoremap :lprevzv +nnoremap :lnextzv +nnoremap lc :lclose +nnoremap lh :lhistory +nnoremap lp :lolder +nnoremap ln :lnewer + +nnoremap qo :botright cwindow +nnoremap :cprevzv +nnoremap :cnextzv +nnoremap qc :cclose +nnoremap qh :chistory +nnoremap qp :colder +nnoremap qn :cnewer + +"}}} +" insert mode mappings {{{ +inoremap jkrg :reg +inoremap :w :w +inoremap [:w :w +inoremap {:w :w +" Chain multiple path completions with / key. Selects the first suggestion if +" no current selection. Use ctrl-y to finish completion as normal. +inoremap / pumvisible() + \ ? len(v:completed_item) ? '' : '' + \ : '/' + +"}}} +" working_with_underscores{{{ +nnoremap w f_l +nnoremap b hT_ +nnoremap e lt_ +onoremap u t_ +onoremap U f_ +"}}} +"----------------------------------------------------------------------------}}} +" #abbreviations {{{ + +" spelling"{{{ +iabbrev adn and +iabbrev waht what +iabbrev tehn then +iabbrev functin function +iabbrev positin position + +"}}} +" css{{{ +iabbrev pabs; position: absolute; +iabbrev pfix; position: fixed; +iabbrev prel; position: relative; +iabbrev fdr; flex-direction: row; +iabbrev fdc; flex-direction: column; +iabbrev jcc; justify-content: center; +iabbrev aic; align-items: center; +iabbrev t0; top: 0; +iabbrev b0; bottom: 0; +iabbrev l0; left: 0; +iabbrev r0; right: 0; + +iabbrev ct'' content-type: ''; + +"}}} + +"----------------------------------------------------------------------------}}} +" #autocommands {{{ + +" persistent folds {{{ + augroup AutoSaveFolds + autocmd! + autocmd BufWrite ?* mkview + autocmd BufRead ?* silent! loadview + augroup END + +" }}} +" Show trailing whitepace and spaces before a tab: {{{ + augroup whitespaceerrors + autocmd! + autocmd Syntax * syn match ExtraWhitespace /\s\+$\| \+\ze\t/ containedin=ALL + augroup END + +" }}} +" automatically reload if color scheme file written {{{ +" augroup coloreload +" autocmd! +" autocmd BufWritePost customred256.vim so $MYVIMRC +" augroup end +" + +" }}} +" line numbering {{{ +" if exists('##CmdlineEnter') +" augroup linenumbering +" autocmd! +" autocmd CmdlineEnter * :redraw | :set number +" autocmd CmdlineLeave * :set nonumber +" augroup END + " endif + +" }}} +" Automatically reload .vimrc if changed {{{ + augroup myvimrc + autocmd! + autocmd BufWritePost .vimrc,_vimrc,vimrc,.gvimrc,_gvimrc,gvimrc so $MYVIMRC | if has('gui_running') | so $MYGVIMRC | endif + augroup END + +" }}} +" Open quickfix window{{{ + augroup QuickFixAutoload + autocmd! + autocmd QuickFixCmdPost [^l]* nested botright cwindow + autocmd QuickFixCmdPost l* nested botright lwindow + augroup END + +" }}} + +"----------------------------------------------------------------------------}}} +" #statusline {{{ + set statusline=\ + set statusline+=[%n]\ \ + set statusline+=%l\ of\ %L\ + set statusline+=(%p%%) + set statusline+=%= + set statusline+=%y\ + set statusline+=%r\ %m\ %F + set statusline+=\ + +"----------------------------------------------------------------------------}}} +runtime vimrc-overrides + + + +" vim: set foldmethod=marker: