diff --git a/git.vim b/vim/git.vim similarity index 100% rename from git.vim rename to vim/git.vim diff --git a/vim/shame.vim b/vim/shame.vim new file mode 100644 index 0000000..7efb1bf --- /dev/null +++ b/vim/shame.vim @@ -0,0 +1,1035 @@ +" ┌────────────────────────────┐ +" │ Everything in one big file │ +" └────────────────────────────┘ +" +" This should eventually be split into smaller individual files. + +" Sessions +set sessionoptions=blank,buffers,curdir,folds,help,options,tabpages +set foldmethod=marker + +set nocompatible + +" some conditional configs +if has('mouse') + set mouse=a +endif + +if &t_Co > 2 || has("gui_running") + syntax on + set hlsearch "Highlight search results +endif + +if has("cryptv") + if v:version >= 800 + set cm=blowfish2 + elseif v:version >= 703 + set cm=blowfish + end +end + +set colorcolumn=+1 +hi ColorColumn ctermbg=magenta ctermfg=white guibg=magenta guifg=white + +" set linespace=0 +set scrolloff=6 +set history=50 " keep 50 lines of command line history +set nonumber +set relativenumber +set langmenu=en_UK +let $LANG = 'en_GB.UTF-8' +source $VIMRUNTIME/delmenu.vim +source $VIMRUNTIME/menu.vim +set guioptions-=r +set guioptions-=R +set guioptions-=l +set guioptions-=L +try + set undodir=$HOME/.vimundo + set undofile +catch + echom "Undofile doesn't work :(" +endtry +filetype plugin on +filetype indent on +set ruler +"set backspace=eol,start,indent +set backspace=start,indent,eol +set path+=** " Enable fuzzy search " STAAAAAARS +set wildmenu "Menu for tab completion +set enc=utf8 + +" Search Stuff +set ignorecase +set smartcase +noh +set incsearch +set lazyredraw +set magic "Who doesn't want to be a vim-wizard? +set showmatch + +" Backup and file stuff +set nobackup +set nowb +" set noswapfile +set swapfile + +" Indentation, etc. +if exists("$EXPANDTAB") + set expandtab +else + set noexpandtab +end +if exists("$TABSTOP") + let &tabstop=str2nr($TABSTOP) +else + set tabstop=3 +end +set shiftwidth=0 " Not needed +set softtabstop=0 " Not needed +set smarttab +set autoindent +set smartindent +set smarttab +set gdefault + +" set wrap +set breakat=\ .,{ +au BufEnter,BufRead * set linebreak +set display+=lastline +if v:version>=800 + set breakindent + set breakindentopt=sbr + au WinNew * set breakindentopt=sbr + set showbreak=.\ +else + set showbreak=+->\ +end +set listchars=eol:¶,tab:\│\ ,trail:·,nbsp:…,space:· + +set modeline " Allows setting vim options in other files +set statusline=\ (%n)\ %f\ %a\ [%M%R]\ [%Y]\ %{strlen(@\")}%=0x%B\ [%l/%L,\ %c%V]\ %4.P +set laststatus=2 +set cmdheight=1 +set timeoutlen=1200 + +" Allow indentation to work in XML files (and possibly others) +filetype plugin indent on + +" Clipboard and Copy/Paste things +if has('unnamedplus') " Allow copying to and from OS clipboard + set clipboard=unnamedplus +else + if has("unix") + autocmd VimLeave * call system("xsel -ib", getreg('*')) + end + set clipboard=unnamed +end +if has("unix") + autocmd VimLeave * call system( + \ 'echo -n '.shellescape(getreg('+')).' | xclip -selection clipboard' + \ ) +end + +" === GENERIC ABBREVIATIONS === + +abbrev eshrug ¯\_(ツ)_/¯ + +" === GENERAL UTILITIES === + +" --- TEXT SNIPPETS --- + +" -- Global -- + +if !exists('s:snippets') + let s:snippets = {} +end + +" Runs a sequence of commands asynchronously +function! Async(array, ...) + if len(a:array) > 0 + call job_start(a:array[0], {"out_io": "null", "in_io": "null", "err_io": "null", "exit_cb": function("Async", [a:array[1:-1]])}) + end +endfun + +function! s:make_snippet(name, lines) + let s:snippets[a:name] = a:lines +endfun + +function! s:make_snippet_range(name, line_start, line_end) + call s:make_snippet(a:name, getline(a:line_start, a:line_end)) +endfun + +function! s:insert_snippet(name) + for line in get(s:snippets, a:name, []) + put =line + endfor +endfun + +function! MkSnip(name, str) + call s:make_snippet(a:name, split(a:str, '\n')) +endfun + +command! -nargs=1 Snippet call s:insert_snippet() +command! -range -nargs=1 MkSnippet call s:make_snippet_range(, , ) + +" -- Filetype -- + +if !exists('s:ft_snippets') + let s:ft_snippets = {} +end + +function! s:make_ft_snippet(ft, name, lines) + if !get(s:ft_snippets, a:ft, 0) + let s:ft_snippets[a:ft] = {} + end + let s:ft_snippets[a:ft][a:name] = a:lines +endfun + +function! s:make_ft_snippet_range(ft, name, line_start, line_end) + call s:make_ft_snippet(a:ft, a:name, getline(a:line_start, a:line_end)) +endfun + +function! s:insert_ft_snippet(ft, name) + for line in get(get(s:ft_snippets, a:ft, {}), a:name, []) + put =line + endfor +endfun + +function! MkFTSnip(ft, name, str) + call s:make_ft_snippet(a:ft, a:name, split(a:str, '\n')) +endfun + +command! -nargs=1 FTSnippet call s:insert_ft_snippet(&filetype, ) +command! -range -nargs=1 FTMkSnippet call s:make_ft_snippet_range(&filetype, , , ) + +function! RangeChooser() + let temp = tempname() + + if has("gui_running") + exec 'silent !xterm -e ranger --choosefiles=' . shellescape(temp).' '.expand("%:p:h") + else + exec 'silent !ranger --choosefiles=' . shellescape(temp).' '.expand("%:p:h") + endif + + if !filereadable(temp) + redraw! + return + endif + + let names = readfile(temp) + + if empty(names) + redraw! + return + endif + + 1,$argd + for name in names + exec 'argadd ' . fnameescape(name) + endfor + rewind + redraw! +endfunction + +command! -bar RangerChooser call RangeChooser() + +if has("unix") + nnoremap :RangerChooser +elseif has("win32") + nnoremap :e %:p:h +end + +" --- SURROUND --- + +function! s:vsurround(left, right) + if visualmode() ==# "v" + let l:type="char" + elseif visualmode() ==# "V" + let l:type="line" + elseif visualmode() ==# "" + let l:type="block" + end + call surround(l:type, a:left, a:right) +endf + +function! s:surround(type, left, right) + if a:type ==? 'char' + exec 'normal! `>a'.a:right.'`$A'.a:right.'`<`>I'.a:left + elseif a:type ==? 'block' + exec 'normal! `<`>A'.a:right.'`<`>I'.a:left + end +endf + +" --- AUTO CLOSE --- + +function! s:autoClose_HelperOpen(open, close) + let next_c = getline(".")[col(".")-1] + if match(next_c, "\s") + return a:open.a:close."\" + else + return a:open + end +endfunc + +function! s:autoClose_HelperClose(open, close) + if getline(".")[col(".")-1] ==# a:close + return "\" + elseif getline(line(".")+1) + if match(getline(line(".")+1), "\M^\s*".escape(a:close, "\\")) + return "\\\f".a:close."\" + end + else + return a:close + end +endfunc + +function! s:autoClose_HelperDouble(open) + if getline(".")[col(".")-1] ==# a:open " Step over + return "\" + else + return a:open.a:open."\" + end +endfunc + +function! s:autoClose_HelperEnter() + if exists("b:autoClose_Pairs") + let next_c = getline(".")[col(".")-1] + let prev_c = getline(".")[col(".")-2] + + if (next_c !=# "") && (prev_c !=# "") + if exists("b:autoClose_Pairs[prev_c]") + if (next_c ==# b:autoClose_Pairs[prev_c]) + return "\m'\\`'\" + end + end + end + end + return "\" +endfunc + +function! s:autoClose_HelperSpace() + if exists("b:autoClose_Pairs") + let next_c = getline(".")[col(".")-1] + let prev_c = getline(".")[col(".")-2] + + if (next_c !=# "") && (prev_c !=# "") + if exists("b:autoClose_Pairs[prev_c]") + if (next_c ==# b:autoClose_Pairs[prev_c]) + return "\\h\" + end + end + end + end + return "\" +endfunc + +function! s:autoClose_AddPair(open, close) + if !exists("b:autoClose_Pairs") + let b:autoClose_Pairs = {} + end + let b:autoClose_Pairs[a:open] = a:close + + if a:open!=#a:close + exe "inoremap ".a:open." autoClose_HelperOpen('".a:open."', '".a:close."')" + exe "inoremap ".a:close." autoClose_HelperClose('".a:open."', '".a:close."')" + else + exe "inoremap ".a:open." autoClose_HelperDouble('".a:open."')" + end + inoremap autoClose_HelperEnter() + inoremap autoClose_HelperSpace() +endfunc + +function! MatchingLines(pattern) + let list = [] + let pattern = a:pattern + exec "g/".pattern."/ call add(list, expand('%').'('.line('.').') : '.matchstr(getline('.'), '".pattern."'))" + return list +endfunc + +function! s:mld_helper(list, pattern) + " Helper function for MatchingLinesDict + call add(a:list, {'filename': expand("%"), 'lnum': line("."), 'col': match(getline("."), a:pattern)+1, 'text': matchstr(getline("."), a:pattern)}) +endfunc +function! MatchingLinesDict(pattern) + let list = [] + silent! exec "g/".a:pattern."/ call s:mld_helper(list, a:pattern)" + return list +endfunc +com! -nargs=1 List call setloclist(0, MatchingLinesDict()) + \ | lopen + +function! LocationAddLineCol(filename, lnum, text, col) + call setloclist(0, [{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text, 'col': a:col}], 'a') +endfunction + +function! QuickfixAddLineCol(filename, lnum, text, col) + call setqflist([{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text, 'col': a:col}], 'a') +endfunction + +function! LocationAddLine(filename, lnum, text) + call setloclist(0, [{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text}], 'a') +endfunction + +function! QuickfixAddLine(filename, lnum, text) + call setqflist([{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text}], 'a') +endfunction + +" Original implementation: https://stackoverflow.com/a/6271254/4984564 +function! VisualSelection() + if mode()=="v" + let [line_start, column_start] = getpos("v")[1:2] + let [line_end, column_end] = getpos(".")[1:2] + else + let [line_start, column_start] = getpos("'<")[1:2] + let [line_end, column_end] = getpos("'>")[1:2] + end + if (line2byte(line_start)+column_start) > (line2byte(line_end)+column_end) + let [line_start, column_start, line_end, column_end] = + \ [line_end, column_end, line_start, column_start] + end + let lines = getline(line_start, line_end) + if len(lines) == 0 + return '' + endif + let lines[-1] = lines[-1][: column_end - 1] + let lines[0] = lines[0][column_start - 1:] + return join(lines, "\n") +endfunction + +function! StringReverse(str) + return join(reverse(split(str, ".\\zs")), "") +endfunc + +function! ShiftMarker(m,n) + let [bufn,line,column,offset]=getpos("'".a:m) + call setpos("'".a:m,[bufn,line,column+(a:n),offset]) +endfunc + +function! ShiftSelection(n) + let [bufn_a,line_a,column_a,offset_a]=getpos("'>") + let [bufn_b,line_b,column_b,offset_b]=getpos("'<") + call setpos("'>",[bufn_a,line_a,column_a+(a:n),offset_a]) + call setpos("'<",[bufn_b,line_b,column_b+(a:n),offset_b]) +endfunc + +" Auto-close quickfix list when leaving it +function! s:autobd() + au! WinLeave bd! +endfun + +" === GENERAL COMMANDS === + +" General Purpose +command! Modifiable setl modifiable! +command! -range=% Count echo(-+1) +command! Closeall bufdo bdelete +command! Context bufdo bdelete | e . +command! Kontext Context +command! -range=% Numbers , + \ s/^/\=printf("%0".float2nr(ceil(log10(+1)))."i", line("."))."\t"/ + \ | noh + +command! L lopen | set number | set norelativenumber +command! LAddLine call LocationAddLine(expand("%"), line("."), getline(".")) +command! QAddLine call QuickfixAddLine(expand("%"), line("."), getline(".")) +command! LAddCursor call LocationAddLineCol(expand("%"), line("."), getline("."), col(".")) +command! QAddCursor call QuickfixAddLineCol(expand("%"), line("."), getline("."), col(".")) + +command! Fixmes call setloclist(0, MatchingLinesDict("\\c\\)) +command! -nargs=1 QFind call setqflist(MatchingLinesDict()) + +function! s:hex(...) + if !(a:000 == [""]) + let l:args = map(copy(a:000), {i,val -> "".val}) + else + let l:args = [] + end + if &filetype != "xxd" + silent exec '%!xxd '.join(l:args, " ") + set filetype=xxd + nnoremap i i + echo "A witch turned your file into a hexadecimal toad!" + else + nunmap i + silent exec '%!xxd -r '.join(l:args, " ") + filetype detect + echo "The witch turned your file back into binary data" + end +endfunction +command! -nargs=* Hex call hex() + +command! -range=% LuaCompile ,w !luac -l -p - + +" === FILE STUFF === + +function! s:unsaved() + if &mod + let l:filetype = &filetype + diffthis + below new + set modifiable + r # + 1,1del + diffthis + au BufUnload diffoff! + let &filetype = l:filetype + set nomodifiable + set buftype=nofile + set bufhidden=delete + silent exec "file =".expand("#:t")."@".strftime("%H:%M") + exec "normal \k" + set foldlevel=999 + else + echom "No changes to show :)" + end +endfun +command! Unsaved call unsaved() + +function! s:snapshot() + let l:filetype = &filetype + let l:clipboard = @" + let l:pos = getpos(".") + + silent 0,$yank " + below new + set modifiable + silent put " + 1,1del + let &filetype = l:filetype + set nomodifiable + set buftype=nofile + set bufhidden=hide + call setpos(".", l:pos) + silent exec "file ¬".expand("#:t")."@".strftime("%H:%M") + + exec "normal \k" + set foldlevel=999 + + let @" = l:clipboard +endfun +command! Snapshot call snapshot() + +command! -nargs=? Scratch enew | call init_generic_file() | set filetype= | set buftype=nofile +command! Todo call matchadd('Todo', '^\s*\[ \?\].*$') | + \ call matchadd('Comment', '^\s*\[x\].*$') | + \ call matchadd('Comment', '^\s*\[-\].*$') | + \ call matchadd('Error', '^\s*\[!\].*$') +command! -nargs=? Tempfile exec 'new '.tempname() | set filetype= | au BufDelete call delete(expand('%')) + +" ┌──────────────────────────┐ +" ├─┬──────────────────────┐ │ +" ├─┤ GENERAL KEY MAPPINGS ├─┤ +" │ └──────────────────────┴─┤ +" └──────────────────────────┘ + +onoremap al :normal! 0vg_ +onoremap il :normal! ^vg_ + +nnoremap val 0vg_ +nnoremap vil ^vg_ + +" --- F5 --- +nnoremap :nnoremap : + +let mapleader = "\\" + +" --- Moving Between Buffers --- +nnoremap n :next:args +nnoremap p :previous:args + +let g:jmp_dist = 8 +map :exec "normal ".g:jmp_dist."j" +map :exec "normal ".g:jmp_dist."k" +nnoremap b +nnoremap e +" Yes, not 'noremap', do whatever is mapped to J and K assuming +" it is some sort of custom up-down motion, but g:jmp_dist times + +" --- Marks --- +nnoremap m :marks abcdefghijklmnopqrstuvwxyz +nnoremap M :marks ABCDEFGHIJKLMNOPQRSTUVWXYZ + +" --- modes --- +nnoremap + +" --- /dev/null --- +noremap d "_d +noremap d "_d +noremap "_x +noremap 0"_x$ + +" --- Numbers --- +nnoremap - +nnoremap = + +" --- Text --- +nnoremap U ~h + +" --- MOVEMENT --- +" noremap j gj +" noremap k gk + +noremap gj j +noremap gk k + +" --- CLIPBOARD --- +nnoremap Y y$ + +" --- VISUAL EXECUTE --- +vnoremap ""y + \ :call setreg("\"", substitute(getreg("\""), "\n", "", ""), "v") + \ :"`< + +let g:mooncompile = "!moonc ".expand(":p:h")."/lua" +command! Mooncompile silent exec g:mooncompile +let g:exe_prg = 'moonc -- | lua -e "package.path=package.path..[[;'.expand(':p:h:h').'/lua/?.lua]];vim=require[[vim]]" -' +vnoremap :exec "'<,'>!".g:exe_prg +inoremap 0v$:exec "'<,'>!".g:exe_prg + +" --- OTHER --- +" Don't exit visual mode when "shifting" +vnoremap < >gv + +" --- START OF SURROUND MAPPINGS --- +function! s:dquote_op(type) + normal `[m<`]m> + call surround(a:type, '"', '"') +endf +nnoremap " :set operatorfunc=dquote_opg@ +vnoremap " :call vsurround('"', '"') + +function! s:squote_op(type) + normal `[m<`]m> + call surround(a:type, "'", "'") +endf +nnoremap ' :set operatorfunc=squote_opg@ +vnoremap ' :call vsurround("'", "'") + +function! s:paren_op(type) + normal `[m<`]m> + call surround(a:type, "(", ")") +endf +nnoremap ( :set operatorfunc=paren_opg@ +vnoremap ( :call vsurround("(", ")") + +function! s:pracket_op(type) + normal `[m<`]m> + call surround(a:type, "[", "]") +endf +nnoremap [ :set operatorfunc=bracket_opg@ +vnoremap [ :call vsurround("[", "]") + +function! s:brace_op(type) + normal `[m<`]m> + call surround(a:type, "{", "}") +endf +nnoremap { :set operatorfunc=brace_opg@ +vnoremap { :call vsurround("{", "}") + +function! s:angle_op(type) + normal `[m<`]m> + call surround(a:type, "<", ">") +endf +nnoremap < :set operatorfunc=angle_opg@ +vnoremap < :call vsurround("<", ">") + +function! s:backtick_op(type) + normal `[m<`]m> + call surround(a:type, "`", "`") +endf +nnoremap ` :set operatorfunc=backtick_opg@ +vnoremap ` :call vsurround("`", "`") + +function! s:asterisk_op(type) + normal `[m<`]m> + call surround(a:type, "*", "*") +endf +nnoremap * :set operatorfunc=asterisk_opg@ +vnoremap * :call vsurround("*", "*") +" --- END OF SURROUND MAPPINGS --- + +nnoremap :L +noremap : +noremap @: +noremap Q @q +nnoremap gQ +" This part is just supposed to make saving as inconvenient as possible +" because I have a tendency to just save stuff pretty much as soon as I start +" typing because I'm bored and possibly a bit paranoid. +function! s:saveprompt() + if &swapfile + echo "You have swap files enabled, stop in-between-saving all the time!" + end + if input("Type 'save' to save: ") ==? "save" + write + echo "File saved, but was it really necessary?" + else + echo "Calm the fuck down man!" + end +endfun +noremap :call saveprompt() +nnoremap :bnext +nnoremap :bprevious +nnoremap j :lnext +nnoremap k :lNext +nnoremap j :cnext +nnoremap k :cNext +nnoremap Bi i +nnoremap Ea a +" This one does nothing, but I'm adding it to remember not to remap the tab key +nnoremap +nnoremap +noremap :setl number! +noremap :setl relativenumber! +noremap :setl autowriteall!:setl autowriteall? +noremap :setl list! +nnoremap ge +nnoremap gE +com! SetWD :cd %:p:h +com! SetLWD :lcd %:p:h +com! Trailing let _s=@/ | %s/\v(\\@ :copy . +vnoremap :copy '> +nnoremap dcx 0d$ +nnoremap : :let @* = @: +nnoremap R ":%s/\\<\\(".expand("")."\\)\\>/" +vnoremap R ":%s/".VisualSelection()."/" +" Put in new line with indentation +nnoremap ]p :let [content, type]= + \[getreg(v:register), getregtype(v:register)] \| + \call setreg(v:register, content, "V")]p + \:call setreg(v:register, content, type) +nnoremap [p :let [content, type]= + \[getreg(v:register), getregtype(v:register)] \| + \call setreg(v:register, content, "V")[p + \:call setreg(v:register, content, type) + +" Empty Lines +nnoremap o0 +nnoremap O0 + +" === GENERAL ABBREVIATIONS === +cabbr rcpath fnamemodify($MYVIMRC, ":p:h") + +cabbr %% expand('%:p:h') + +digraph <3 9829 +digraph ue 252 +digraph UE 220 +digraph ae 228 +digraph AE 196 +digraph oe 246 +digraph OE 214 +digraph ss 223 + +" === GENERAL AUTOCOMMANDS === + +command! HLProgress syntax match Comment /\_.*\ze\n.*\%#/ + +nnoremap h :call toggleWUC() + +function! s:updateWUC() + if exists("b:hlwuc") + if b:hlwuc > 1 + call matchdelete(b:hlwuc) + end + end + if exists("b:word_hl") + let hl = b:word_hl + else + let hl = "Underlined" + endif + let l:str = "\\<".escape(expand(""), "\\")."\\>" + let b:hlwuc = matchadd(hl, l:str) +endfunc + +function! s:toggleWUC() + augroup hlwuc + if exists("b:hlwuc") + autocmd! + if b:hlwuc > 1 + call matchdelete(b:hlwuc) + end + unlet b:hlwuc + else + autocmd CursorMoved call updateWUC() + autocmd CursorMovedI call updateWUC() + call updateWUC() + endif + augroup END + redraw +endfunction + +" Autosave when vim loses focus :) +function! TryAutosave(warn, mode) + if a:mode == 0 + if &autowriteall || &autowrite + silent wall + if a:warn + echo "Autosaving all buffers..." + end + end + elseif a:mode == 1 + if &autowriteall + if &mod + silent write + if a:warn + echo "Autosaving current buffer..." + end + end + end + end + + redraw +endfunction + +augroup autosave +autocmd! +autocmd FocusLost * call TryAutosave(0, 0) +autocmd BufLeave * call TryAutosave(0, 1) +autocmd CursorHold * call TryAutosave(0, 1) +augroup END + +vnoremap g :call GrepOperator(visualmode()) +nnoremap g :set operatorfunc=GrepOperatorg@ +function! s:GrepOperator(type) + let reg1 = @@ + if a:type==# 'v' + execute "normal! `y" + elseif a:type==# 'char' + execute "normal! `[y`]" + else + return + end + echom "vimgrep! /\\M".escape(@@, "\\")."/ *" + silent! execute "vimgrep /\\M".escape(@@, "\\")."/j *" + let @@ = reg1 + copen + set nowrap +endfunction + +" Window Height stuff +command! EqualH call Equal() +command! -nargs=1 WinHeight call SetWinMinHeight() +function! Equal() + set winminheight=0 + set winheight=1 + set equalalways! + set equalalways! +endfunc +function! SetWinMinHeight(num) + execute "set winminheight=".0 + if a:num>=0 + execute "set winheight=".(a:num+1) + execute "set winminheight=".a:num + endif + execute "set winheight=".9999 +endfunc +" call SetWinMinHeight(2) +function! AddWinMinHeight(num) + let a:new = &winminheight + a:num + call SetWinMinHeight(a:new) + set winminheight? +endfunc + +" Window Width Stuff +command! EqualW silent! call EqualW() +command! -nargs=1 WinWidth call SetWinMinWidth() +function! EqualW() + set winminwidth=0 + set winwidth=1 + set equalalways! + set equalalways! +endfunc +function! SetWinMinWidth(num) + execute "set winminwidth=".0 + if a:num>=0 + execute "set winwidth=".(a:num+1) + execute "set winminwidth=".a:num + endif + execute "set winwidth=".9999 +endfunc +function! AddWinMinWidth(num) + let a:new = &winminwidth + a:num + call SetWinMinWidth(a:new) + set winminwidth? +endfunc + + +" === GENERIC AUTOCOMMANDS === + +if has("autocmd") + " Enable file type detection. + " Use the default filetype settings, so that mail gets 'tw' set to 72, + " 'cindent' is on in C files, etc. + " Also load indent files, to automatically do language-dependent indenting. + filetype plugin indent on + + " When editing a file, always jump to the last known cursor position. + " Don't do it when the position is invalid or when inside an event handler + " (happens when dropping a file on gvim). + autocmd BufReadPost * + \ if line("'\"") >= 1 && line("'\"") <= line("$") | + \ exe "normal! g`\"" | + \ endif + +endif + +" === FILETYPE SPECIFIC STUFF === + +" --- GENERIC STUFF --- +au BufNewFile,BufRead * :call init_generic_file() + +function! s:init_generic_file() + call s:autoClose_AddPair("[", "]") + call s:autoClose_AddPair("(", ")") + call s:autoClose_AddPair("{", "}") + call s:autoClose_AddPair('"', '"') +endfunc + +" --- VIMSCRIPT STUFF --- +au BufNewFile,BufRead *.vim,*vimrc :call init_vim_file() + +function! s:init_vim_file() + setl number + nnoremap :w:so % + nnoremap c A" + nnoremap if ofunction! m'()endfunction`'l + + command! -buffer Functions lex MatchingLines("^\\s*fun\\(ction\\)\\?\\>!.*$") + command! -buffer Commands lex MatchingLines("^\\s*com\\(mand\\)\\?\\>!.*$") + command! -buffer Autocommands lex MatchingLines("^\\s*au\\(tocmd\\)\\?\\>!\\@!.*$") +endfunction + +" --- C / C++ Stuff --- + +" Insert Stuff +au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ii O#include <>i +au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ip oprintf("m'\n");`'a +au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap im oint main(int argc, char *args[]) {}O +" Other Stuff +au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ; m'$a;`' + +" --- Ruby Stuff --- +au BufNewFile,BufRead *.rb :call init_ruby_file() + +function! s:init_ruby_file() + set makeprg=ruby\ -wc\ % + setl number + command! -buffer Methods call setloclist(0, MatchingLinesDict("^\\s*def\\>\\s\\+\\zs.*$")) + command! -buffer Classes call setloclist(0, MatchingLinesDict("^\\s*class\\>\\s\\+\\zs.*$")) + command! -buffer Modules call setloclist(0, MatchingLinesDict("^\\s*module\\>\\s\\+\\zs.*$")) + command! -buffer Members call setloclist(0, MatchingLinesDict("@\\<\\i*\\>")) + command! -buffer Requires call setloclist(0, MatchingLinesDict("^\\s*require\\(_relative\\)\\?\\>\\s\\+\\zs.*$")) + + nnoremap ic oclass m'end`'a + nnoremap id odef m'()end`'a + + nnoremap ~ :call RubyComment(0) + nnoremap # :call RubyComment(1) + vnoremap ~ :call RubyComment(0) + vnoremap # :call RubyComment(1) +endfunction + +function! s:RubyComment(a) + if a:a==0 + " silent! exec '.s/\m^\s*\zs#*//' + silent! exec '.s/\v^(\s|#)*//' + normal == + elseif a:a==1 + " silent! exec '.s/\v^(\s*#)@!/#/' + silent! exec '.s/\v^(\s|#)*/# /' + normal == + end +endfunction + +" --- Lua Stuff --- + +" Matches all types of Lua string! +" \v(["'])\zs.{-}\ze\\@1init_lua_file() + +function! s:init_lua_file() + setl number + command! -buffer Requires call setloclist(0, MatchingLinesDict("\\vrequire\\s*\\(?(([\"'])\\zs.{-}\\ze\\\\@1 let do local +endfunction! + +" --- HTML Stuff --- +au BufNewFile,BufRead *.html,*.htm,*.etlua,*.erb :call init_html_file() + +function! s:init_html_file() + setl number + command! -buffer -nargs=1 Tag normal + \ i<><m'/>`' + nnoremap T ""ciw<""p>m'""p>`'l + nnoremap T ""diw"_cc<""p>o""p>O + + function! s:insert_tag(tag, newline) + if !a:newline + let l:text = "<".a:tag.">" + else + end + put =l:text + endfunction + + nnoremap :call insert_tag(input(""), 0) + + inoremap ""ciw<""p>m'""p>`'l + inoremap ""diw"_cc<""p>o""p>O +endfunction + +" --- Moonscript Stuff --- + +augroup MOON + au! + au BufWritePost *.moon call automoon() +augroup END +com! ToggleAutoMoon echo toggleautomoon() +com! ToggleAutoMoonLocal echo toggleautomoonlocal() +function! s:automoon() + if exists('g:automoon') || exists('b:automoon') + silent !moonc % + redraw + end +endfun +function! s:toggleautomoon() + if exists('g:automoon') + unlet g:automoon + return 'Automoon: off' + else + let g:automoon=1 + return 'Automoon: on' + end +endfun +function! s:toggleautomoonlocal() + if exists('b:automoon') + unlet b:automoon + return 'Local Automoon: off' + else + let b:automoon=1 + return 'Local Automoon: on' + end +endfun + +" --- Markdown Stuff --- +augroup markdown + autocmd! + autocmd FileType markdown call init_markdown_file() +augroup END +function! s:init_markdown_file() + set textwidth=80 +endfunction + +" --- LaTeX Stuff --- + +command! Latex2PDF call Async([ 'lualatex -draftmode '.expand('%'), 'biber '.expand('%:r'), 'lualatex '.expand('%') ]) diff --git a/vimrc b/vimrc index d4b34b2..2bce413 100644 --- a/vimrc +++ b/vimrc @@ -1,1041 +1,7 @@ -" vim: set bufhidden=delete list noexpandtab :miv " +" vim: set bufhidden=delete noexpandtab tabstop=3 :miv " "!!! makes use of marker ' -let s:root = expand(':p:h') +let &rtp=expand(':p:h').'/vim,'.&rtp -set nocompatible -"""""""""""""""" - -" ┌────────────────────────┐ -" │ General Configurations │ -" └────────────────────────┘ - -" Sessions -set sessionoptions=blank,buffers,curdir,folds,help,options,tabpages -set foldmethod=marker - -" some conditional configs -if has('mouse') - set mouse=a -endif - -if &t_Co > 2 || has("gui_running") - syntax on - set hlsearch "Highlight search results -endif - -if has("cryptv") - if v:version >= 800 - set cm=blowfish2 - elseif v:version >= 703 - set cm=blowfish - end -end - -set colorcolumn=+1 -hi ColorColumn ctermbg=magenta ctermfg=white guibg=magenta guifg=white - -" set linespace=0 -set scrolloff=6 -set history=50 " keep 50 lines of command line history -set nonumber -set relativenumber -set langmenu=en_UK -let $LANG = 'en_GB.UTF-8' -source $VIMRUNTIME/delmenu.vim -source $VIMRUNTIME/menu.vim -set guioptions-=r -set guioptions-=R -set guioptions-=l -set guioptions-=L -try - set undodir=$HOME/.vimundo - set undofile -catch - echom "Undofile doesn't work :(" -endtry -filetype plugin on -filetype indent on -set ruler -"set backspace=eol,start,indent -set backspace=start,indent,eol -set path+=** " Enable fuzzy search " STAAAAAARS -set wildmenu "Menu for tab completion -set enc=utf8 - -" Search Stuff -set ignorecase -set smartcase -noh -set incsearch -set lazyredraw -set magic "Who doesn't want to be a vim-wizard? -set showmatch - -" Backup and file stuff -set nobackup -set nowb -" set noswapfile -set swapfile - -" Indentation, etc. -if exists("$EXPANDTAB") - set expandtab -else - set noexpandtab -end -if exists("$TABSTOP") - let &tabstop=str2nr($TABSTOP) -else - set tabstop=3 -end -set shiftwidth=0 " Not needed -set softtabstop=0 " Not needed -set smarttab -set autoindent -set smartindent -set smarttab -set gdefault - -" set wrap -set breakat=\ .,{ -au BufEnter,BufRead * set linebreak -set display+=lastline -if v:version>=800 - set breakindent - set breakindentopt=sbr - au WinNew * set breakindentopt=sbr - set showbreak=.\ -else - set showbreak=+->\ -end -set listchars=eol:¶,tab:\│\ ,trail:·,nbsp:…,space:· - -set modeline " Allows setting vim options in other files -set statusline=\ (%n)\ %f\ %a\ [%M%R]\ [%Y]\ %{strlen(@\")}%=0x%B\ [%l/%L,\ %c%V]\ %4.P -set laststatus=2 -set cmdheight=1 -set timeoutlen=1200 - -" Allow indentation to work in XML files (and possibly others) -filetype plugin indent on - -" Clipboard and Copy/Paste things -if has('unnamedplus') " Allow copying to and from OS clipboard - set clipboard=unnamedplus -else - if has("unix") - autocmd VimLeave * call system("xsel -ib", getreg('*')) - end - set clipboard=unnamed -end -if has("unix") - autocmd VimLeave * call system( - \ 'echo -n '.shellescape(getreg('+')).' | xclip -selection clipboard' - \ ) -end - -" === GENERIC ABBREVIATIONS === - -abbrev eshrug ¯\_(ツ)_/¯ - -" === GENERAL UTILITIES === - -" --- TEXT SNIPPETS --- - -" -- Global -- - -if !exists('s:snippets') - let s:snippets = {} -end - -" Runs a sequence of commands asynchronously -function! Async(array, ...) - if len(a:array) > 0 - call job_start(a:array[0], {"out_io": "null", "in_io": "null", "err_io": "null", "exit_cb": function("Async", [a:array[1:-1]])}) - end -endfun - -function! s:make_snippet(name, lines) - let s:snippets[a:name] = a:lines -endfun - -function! s:make_snippet_range(name, line_start, line_end) - call s:make_snippet(a:name, getline(a:line_start, a:line_end)) -endfun - -function! s:insert_snippet(name) - for line in get(s:snippets, a:name, []) - put =line - endfor -endfun - -function! MkSnip(name, str) - call s:make_snippet(a:name, split(a:str, '\n')) -endfun - -command! -nargs=1 Snippet call s:insert_snippet() -command! -range -nargs=1 MkSnippet call s:make_snippet_range(, , ) - -" -- Filetype -- - -if !exists('s:ft_snippets') - let s:ft_snippets = {} -end - -function! s:make_ft_snippet(ft, name, lines) - if !get(s:ft_snippets, a:ft, 0) - let s:ft_snippets[a:ft] = {} - end - let s:ft_snippets[a:ft][a:name] = a:lines -endfun - -function! s:make_ft_snippet_range(ft, name, line_start, line_end) - call s:make_ft_snippet(a:ft, a:name, getline(a:line_start, a:line_end)) -endfun - -function! s:insert_ft_snippet(ft, name) - for line in get(get(s:ft_snippets, a:ft, {}), a:name, []) - put =line - endfor -endfun - -function! MkFTSnip(ft, name, str) - call s:make_ft_snippet(a:ft, a:name, split(a:str, '\n')) -endfun - -command! -nargs=1 FTSnippet call s:insert_ft_snippet(&filetype, ) -command! -range -nargs=1 FTMkSnippet call s:make_ft_snippet_range(&filetype, , , ) - -function! RangeChooser() - let temp = tempname() - - if has("gui_running") - exec 'silent !xterm -e ranger --choosefiles=' . shellescape(temp).' '.expand("%:p:h") - else - exec 'silent !ranger --choosefiles=' . shellescape(temp).' '.expand("%:p:h") - endif - - if !filereadable(temp) - redraw! - return - endif - - let names = readfile(temp) - - if empty(names) - redraw! - return - endif - - 1,$argd - for name in names - exec 'argadd ' . fnameescape(name) - endfor - rewind - redraw! -endfunction - -command! -bar RangerChooser call RangeChooser() - -if has("unix") - nnoremap :RangerChooser -elseif has("win32") - nnoremap :e %:p:h -end - -" --- SURROUND --- - -function! s:vsurround(left, right) - if visualmode() ==# "v" - let l:type="char" - elseif visualmode() ==# "V" - let l:type="line" - elseif visualmode() ==# "" - let l:type="block" - end - call surround(l:type, a:left, a:right) -endf - -function! s:surround(type, left, right) - if a:type ==? 'char' - exec 'normal! `>a'.a:right.'`$A'.a:right.'`<`>I'.a:left - elseif a:type ==? 'block' - exec 'normal! `<`>A'.a:right.'`<`>I'.a:left - end -endf - -" --- AUTO CLOSE --- - -function! s:autoClose_HelperOpen(open, close) - let next_c = getline(".")[col(".")-1] - if match(next_c, "\s") - return a:open.a:close."\" - else - return a:open - end -endfunc - -function! s:autoClose_HelperClose(open, close) - if getline(".")[col(".")-1] ==# a:close - return "\" - elseif getline(line(".")+1) - if match(getline(line(".")+1), "\M^\s*".escape(a:close, "\\")) - return "\\\f".a:close."\" - end - else - return a:close - end -endfunc - -function! s:autoClose_HelperDouble(open) - if getline(".")[col(".")-1] ==# a:open " Step over - return "\" - else - return a:open.a:open."\" - end -endfunc - -function! s:autoClose_HelperEnter() - if exists("b:autoClose_Pairs") - let next_c = getline(".")[col(".")-1] - let prev_c = getline(".")[col(".")-2] - - if (next_c !=# "") && (prev_c !=# "") - if exists("b:autoClose_Pairs[prev_c]") - if (next_c ==# b:autoClose_Pairs[prev_c]) - return "\m'\\`'\" - end - end - end - end - return "\" -endfunc - -function! s:autoClose_HelperSpace() - if exists("b:autoClose_Pairs") - let next_c = getline(".")[col(".")-1] - let prev_c = getline(".")[col(".")-2] - - if (next_c !=# "") && (prev_c !=# "") - if exists("b:autoClose_Pairs[prev_c]") - if (next_c ==# b:autoClose_Pairs[prev_c]) - return "\\h\" - end - end - end - end - return "\" -endfunc - -function! s:autoClose_AddPair(open, close) "TODO: Improve with expand('') - if !exists("b:autoClose_Pairs") - let b:autoClose_Pairs = {} - end - let b:autoClose_Pairs[a:open] = a:close - - if a:open!=#a:close - exe "inoremap ".a:open." autoClose_HelperOpen('".a:open."', '".a:close."')" - exe "inoremap ".a:close." autoClose_HelperClose('".a:open."', '".a:close."')" - else - exe "inoremap ".a:open." autoClose_HelperDouble('".a:open."')" - end - inoremap autoClose_HelperEnter() - inoremap autoClose_HelperSpace() -endfunc - -function! MatchingLines(pattern) - let list = [] - let pattern = a:pattern - exec "g/".pattern."/ call add(list, expand('%').'('.line('.').') : '.matchstr(getline('.'), '".pattern."'))" - return list -endfunc - -function! s:mld_helper(list, pattern) - " Helper function for MatchingLinesDict - call add(a:list, {'filename': expand("%"), 'lnum': line("."), 'col': match(getline("."), a:pattern)+1, 'text': matchstr(getline("."), a:pattern)}) -endfunc -function! MatchingLinesDict(pattern) - let list = [] - silent! exec "g/".a:pattern."/ call s:mld_helper(list, a:pattern)" - return list -endfunc -com! -nargs=1 List call setloclist(0, MatchingLinesDict()) - \ | lopen - -function! LocationAddLineCol(filename, lnum, text, col) - call setloclist(0, [{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text, 'col': a:col}], 'a') -endfunction - -function! QuickfixAddLineCol(filename, lnum, text, col) - call setqflist([{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text, 'col': a:col}], 'a') -endfunction - -function! LocationAddLine(filename, lnum, text) - call setloclist(0, [{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text}], 'a') -endfunction - -function! QuickfixAddLine(filename, lnum, text) - call setqflist([{'filename': a:filename, 'lnum': a:lnum, 'desc': a:text}], 'a') -endfunction - -" Original implementation: https://stackoverflow.com/a/6271254/4984564 -function! VisualSelection() - if mode()=="v" - let [line_start, column_start] = getpos("v")[1:2] - let [line_end, column_end] = getpos(".")[1:2] - else - let [line_start, column_start] = getpos("'<")[1:2] - let [line_end, column_end] = getpos("'>")[1:2] - end - if (line2byte(line_start)+column_start) > (line2byte(line_end)+column_end) - let [line_start, column_start, line_end, column_end] = - \ [line_end, column_end, line_start, column_start] - end - let lines = getline(line_start, line_end) - if len(lines) == 0 - return '' - endif - let lines[-1] = lines[-1][: column_end - 1] - let lines[0] = lines[0][column_start - 1:] - return join(lines, "\n") -endfunction - -function! StringReverse(str) - return join(reverse(split(str, ".\\zs")), "") -endfunc - -function! ShiftMarker(m,n) - let [bufn,line,column,offset]=getpos("'".a:m) - call setpos("'".a:m,[bufn,line,column+(a:n),offset]) -endfunc - -function! ShiftSelection(n) - let [bufn_a,line_a,column_a,offset_a]=getpos("'>") - let [bufn_b,line_b,column_b,offset_b]=getpos("'<") - call setpos("'>",[bufn_a,line_a,column_a+(a:n),offset_a]) - call setpos("'<",[bufn_b,line_b,column_b+(a:n),offset_b]) -endfunc - -" Auto-close quickfix list when leaving it -function! s:autobd() - au! WinLeave bd! -endfun - -" === GENERAL COMMANDS === - -" General Purpose -command! Modifiable setl modifiable! -command! -range=% Count echo(-+1) -command! Closeall bufdo bdelete -command! Context bufdo bdelete | e . -command! Kontext Context -command! -range=% Numbers , - \ s/^/\=printf("%0".float2nr(ceil(log10(+1)))."i", line("."))."\t"/ - \ | noh - -command! L lopen | set number | set norelativenumber -command! LAddLine call LocationAddLine(expand("%"), line("."), getline(".")) -command! QAddLine call QuickfixAddLine(expand("%"), line("."), getline(".")) -command! LAddCursor call LocationAddLineCol(expand("%"), line("."), getline("."), col(".")) -command! QAddCursor call QuickfixAddLineCol(expand("%"), line("."), getline("."), col(".")) - -command! Fixmes call setloclist(0, MatchingLinesDict("\\c\\)) -command! -nargs=1 QFind call setqflist(MatchingLinesDict()) - -function! s:hex(...) - if !(a:000 == [""]) - let l:args = map(copy(a:000), {i,val -> "".val}) - else - let l:args = [] - end - if &filetype != "xxd" - silent exec '%!xxd '.join(l:args, " ") - set filetype=xxd - nnoremap i i - echo "A witch turned your file into a hexadecimal toad!" - else - nunmap i - silent exec '%!xxd -r '.join(l:args, " ") - filetype detect - echo "The witch turned your file back into binary data" - end -endfunction -command! -nargs=* Hex call hex() - -command! -range=% LuaCompile ,w !luac -l -p - - -exec 'so '.s:root.'/git.vim' - -" === FILE STUFF === - -function! s:unsaved() - if &mod - let l:filetype = &filetype - diffthis - below new - set modifiable - r # - 1,1del - diffthis - au BufUnload diffoff! - let &filetype = l:filetype - set nomodifiable - set buftype=nofile - set bufhidden=delete - silent exec "file =".expand("#:t")."@".strftime("%H:%M") - exec "normal \k" - set foldlevel=999 - else - echom "No changes to show :)" - end -endfun -command! Unsaved call unsaved() - -function! s:snapshot() - let l:filetype = &filetype - let l:clipboard = @" - let l:pos = getpos(".") - - silent 0,$yank " - below new - set modifiable - silent put " - 1,1del - let &filetype = l:filetype - set nomodifiable - set buftype=nofile - set bufhidden=hide - call setpos(".", l:pos) - silent exec "file ¬".expand("#:t")."@".strftime("%H:%M") - - exec "normal \k" - set foldlevel=999 - - let @" = l:clipboard -endfun -command! Snapshot call snapshot() - -command! -nargs=? Scratch enew | call init_generic_file() | set filetype= | set buftype=nofile -command! Todo call matchadd('Todo', '^\s*\[ \?\].*$') | - \ call matchadd('Comment', '^\s*\[x\].*$') | - \ call matchadd('Comment', '^\s*\[-\].*$') | - \ call matchadd('Error', '^\s*\[!\].*$') -command! -nargs=? Tempfile exec 'new '.tempname() | set filetype= | au BufDelete call delete(expand('%')) - -" ┌──────────────────────────┐ -" ├─┬──────────────────────┐ │ -" ├─┤ GENERAL KEY MAPPINGS ├─┤ -" │ └──────────────────────┴─┤ -" └──────────────────────────┘ - -onoremap al :normal! 0vg_ -onoremap il :normal! ^vg_ - -nnoremap val 0vg_ -nnoremap vil ^vg_ - -" --- F5 --- -nnoremap :nnoremap : - -let mapleader = "\\" - -" --- Moving Between Buffers --- -nnoremap n :next:args -nnoremap p :previous:args - -let g:jmp_dist = 8 -map :exec "normal ".g:jmp_dist."j" -map :exec "normal ".g:jmp_dist."k" -nnoremap b -nnoremap e -" Yes, not 'noremap', do whatever is mapped to J and K assuming -" it is some sort of custom up-down motion, but g:jmp_dist times - -" --- Marks --- -nnoremap m :marks abcdefghijklmnopqrstuvwxyz -nnoremap M :marks ABCDEFGHIJKLMNOPQRSTUVWXYZ - -" --- modes --- -nnoremap - -" --- /dev/null --- -noremap d "_d -noremap d "_d -noremap "_x -noremap 0"_x$ - -" --- Numbers --- -nnoremap - -nnoremap = - -" --- Text --- -nnoremap U ~h - -" --- MOVEMENT --- -" noremap j gj -" noremap k gk - -noremap gj j -noremap gk k - -" --- CLIPBOARD --- -nnoremap Y y$ - -" --- VISUAL EXECUTE --- -vnoremap ""y - \ :call setreg("\"", substitute(getreg("\""), "\n", "", ""), "v") - \ :"`< - -let g:mooncompile = "!moonc ".expand(":p:h")."/lua" -command! Mooncompile silent exec g:mooncompile -let g:exe_prg = 'moonc -- | lua -e "package.path=package.path..[[;'.expand(':p:h').'/lua/?.lua]];vim=require[[vim]]" -' -vnoremap :exec "'<,'>!".g:exe_prg -inoremap 0v$:exec "'<,'>!".g:exe_prg - -" --- OTHER --- -" Don't exit visual mode when "shifting" -vnoremap < >gv - -" --- START OF SURROUND MAPPINGS --- -function! s:dquote_op(type) - normal `[m<`]m> - call surround(a:type, '"', '"') -endf -nnoremap " :set operatorfunc=dquote_opg@ -vnoremap " :call vsurround('"', '"') - -function! s:squote_op(type) - normal `[m<`]m> - call surround(a:type, "'", "'") -endf -nnoremap ' :set operatorfunc=squote_opg@ -vnoremap ' :call vsurround("'", "'") - -function! s:paren_op(type) - normal `[m<`]m> - call surround(a:type, "(", ")") -endf -nnoremap ( :set operatorfunc=paren_opg@ -vnoremap ( :call vsurround("(", ")") - -function! s:pracket_op(type) - normal `[m<`]m> - call surround(a:type, "[", "]") -endf -nnoremap [ :set operatorfunc=bracket_opg@ -vnoremap [ :call vsurround("[", "]") - -function! s:brace_op(type) - normal `[m<`]m> - call surround(a:type, "{", "}") -endf -nnoremap { :set operatorfunc=brace_opg@ -vnoremap { :call vsurround("{", "}") - -function! s:angle_op(type) - normal `[m<`]m> - call surround(a:type, "<", ">") -endf -nnoremap < :set operatorfunc=angle_opg@ -vnoremap < :call vsurround("<", ">") - -function! s:backtick_op(type) - normal `[m<`]m> - call surround(a:type, "`", "`") -endf -nnoremap ` :set operatorfunc=backtick_opg@ -vnoremap ` :call vsurround("`", "`") - -function! s:asterisk_op(type) - normal `[m<`]m> - call surround(a:type, "*", "*") -endf -nnoremap * :set operatorfunc=asterisk_opg@ -vnoremap * :call vsurround("*", "*") -" --- END OF SURROUND MAPPINGS --- - -nnoremap :L -noremap : -noremap @: -noremap Q @q -nnoremap gQ -" This part is just supposed to make saving as inconvenient as possible -" because I have a tendency to just save stuff pretty much as soon as I start -" typing because I'm bored and possibly a bit paranoid. -function! s:saveprompt() - if &swapfile - echo "You have swap files enabled, stop in-between-saving all the time!" - end - if input("Type 'save' to save: ") ==? "save" - write - echo "File saved, but was it really necessary?" - else - echo "Calm the fuck down man!" - end -endfun -noremap :call saveprompt() -nnoremap :bnext -nnoremap :bprevious -nnoremap j :lnext -nnoremap k :lNext -nnoremap j :cnext -nnoremap k :cNext -nnoremap Bi i -nnoremap Ea a -" This one does nothing, but I'm adding it to remember not to remap the tab key -nnoremap -nnoremap -noremap :setl number! -noremap :setl relativenumber! -noremap :setl autowriteall!:setl autowriteall? -noremap :setl list! -nnoremap ge -nnoremap gE -com! SetWD :cd %:p:h -com! SetLWD :lcd %:p:h -com! Trailing let _s=@/ | %s/\v(\\@ :copy . -vnoremap :copy '> -nnoremap dcx 0d$ -nnoremap : :let @* = @: -nnoremap R ":%s/\\<\\(".expand("")."\\)\\>/" -vnoremap R ":%s/".VisualSelection()."/" -" Put in new line with indentation -nnoremap ]p :let [content, type]= - \[getreg(v:register), getregtype(v:register)] \| - \call setreg(v:register, content, "V")]p - \:call setreg(v:register, content, type) -nnoremap [p :let [content, type]= - \[getreg(v:register), getregtype(v:register)] \| - \call setreg(v:register, content, "V")[p - \:call setreg(v:register, content, type) - -" Empty Lines -nnoremap o0 -nnoremap O0 - -" === GENERAL ABBREVIATIONS === -cabbr rcpath fnamemodify($MYVIMRC, ":p:h") - -cabbr %% expand('%:p:h') - -digraph <3 9829 -digraph ue 252 -digraph UE 220 -digraph ae 228 -digraph AE 196 -digraph oe 246 -digraph OE 214 -digraph ss 223 - -" === GENERAL AUTOCOMMANDS === - -command! HLProgress syntax match Comment /\_.*\ze\n.*\%#/ - -nnoremap h :call toggleWUC() - -function! s:updateWUC() - if exists("b:hlwuc") - if b:hlwuc > 1 - call matchdelete(b:hlwuc) - end - end - if exists("b:word_hl") - let hl = b:word_hl - else - let hl = "Underlined" - endif - let l:str = "\\<".escape(expand(""), "\\")."\\>" - let b:hlwuc = matchadd(hl, l:str) -endfunc - -function! s:toggleWUC() - augroup hlwuc - if exists("b:hlwuc") - autocmd! - if b:hlwuc > 1 - call matchdelete(b:hlwuc) - end - unlet b:hlwuc - else - autocmd CursorMoved call updateWUC() - autocmd CursorMovedI call updateWUC() - call updateWUC() - endif - augroup END - redraw -endfunction - -" Autosave when vim loses focus :) -function! TryAutosave(warn, mode) - if a:mode == 0 - if &autowriteall || &autowrite - silent wall - if a:warn - echo "Autosaving all buffers..." - end - end - elseif a:mode == 1 - if &autowriteall - if &mod - silent write - if a:warn - echo "Autosaving current buffer..." - end - end - end - end - - redraw -endfunction - -augroup autosave -autocmd! -autocmd FocusLost * call TryAutosave(0, 0) -autocmd BufLeave * call TryAutosave(0, 1) -autocmd CursorHold * call TryAutosave(0, 1) -augroup END - -vnoremap g :call GrepOperator(visualmode()) -nnoremap g :set operatorfunc=GrepOperatorg@ -function! s:GrepOperator(type) - let reg1 = @@ - if a:type==# 'v' - execute "normal! `y" - elseif a:type==# 'char' - execute "normal! `[y`]" - else - return - end - echom "vimgrep! /\\M".escape(@@, "\\")."/ *" - silent! execute "vimgrep /\\M".escape(@@, "\\")."/j *" - let @@ = reg1 - copen - set nowrap -endfunction - -" Window Height stuff -command! EqualH call Equal() -command! -nargs=1 WinHeight call SetWinMinHeight() -function! Equal() - set winminheight=0 - set winheight=1 - set equalalways! - set equalalways! -endfunc -function! SetWinMinHeight(num) - execute "set winminheight=".0 - if a:num>=0 - execute "set winheight=".(a:num+1) - execute "set winminheight=".a:num - endif - execute "set winheight=".9999 -endfunc -" call SetWinMinHeight(2) -function! AddWinMinHeight(num) - let a:new = &winminheight + a:num - call SetWinMinHeight(a:new) - set winminheight? -endfunc - -" Window Width Stuff -command! EqualW silent! call EqualW() -command! -nargs=1 WinWidth call SetWinMinWidth() -function! EqualW() - set winminwidth=0 - set winwidth=1 - set equalalways! - set equalalways! -endfunc -function! SetWinMinWidth(num) - execute "set winminwidth=".0 - if a:num>=0 - execute "set winwidth=".(a:num+1) - execute "set winminwidth=".a:num - endif - execute "set winwidth=".9999 -endfunc -function! AddWinMinWidth(num) - let a:new = &winminwidth + a:num - call SetWinMinWidth(a:new) - set winminwidth? -endfunc - - -" === GENERIC AUTOCOMMANDS === - -if has("autocmd") - " Enable file type detection. - " Use the default filetype settings, so that mail gets 'tw' set to 72, - " 'cindent' is on in C files, etc. - " Also load indent files, to automatically do language-dependent indenting. - filetype plugin indent on - - " When editing a file, always jump to the last known cursor position. - " Don't do it when the position is invalid or when inside an event handler - " (happens when dropping a file on gvim). - autocmd BufReadPost * - \ if line("'\"") >= 1 && line("'\"") <= line("$") | - \ exe "normal! g`\"" | - \ endif - -endif - -" === FILETYPE SPECIFIC STUFF === - -" --- GENERIC STUFF --- -au BufNewFile,BufRead * :call init_generic_file() - -function! s:init_generic_file() - call s:autoClose_AddPair("[", "]") - call s:autoClose_AddPair("(", ")") - call s:autoClose_AddPair("{", "}") - call s:autoClose_AddPair('"', '"') -endfunc - -" --- VIMSCRIPT STUFF --- -au BufNewFile,BufRead *.vim,*vimrc :call init_vim_file() - -function! s:init_vim_file() - setl number - nnoremap :w:so % - nnoremap c A" - nnoremap if ofunction! m'()endfunction`'l - - command! -buffer Functions lex MatchingLines("^\\s*fun\\(ction\\)\\?\\>!.*$") - command! -buffer Commands lex MatchingLines("^\\s*com\\(mand\\)\\?\\>!.*$") - command! -buffer Autocommands lex MatchingLines("^\\s*au\\(tocmd\\)\\?\\>!\\@!.*$") -endfunction - -" --- C / C++ Stuff --- - -" Insert Stuff -au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ii O#include <>i -au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ip oprintf("m'\n");`'a -au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap im oint main(int argc, char *args[]) {}O -" Other Stuff -au BufNewFile,BufRead *.c,*.cpp,*.h,*.hpp :nnoremap ; m'$a;`' - -" --- Ruby Stuff --- -au BufNewFile,BufRead *.rb :call init_ruby_file() - -function! s:init_ruby_file() - set makeprg=ruby\ -wc\ % - setl number - command! -buffer Methods call setloclist(0, MatchingLinesDict("^\\s*def\\>\\s\\+\\zs.*$")) - command! -buffer Classes call setloclist(0, MatchingLinesDict("^\\s*class\\>\\s\\+\\zs.*$")) - command! -buffer Modules call setloclist(0, MatchingLinesDict("^\\s*module\\>\\s\\+\\zs.*$")) - command! -buffer Members call setloclist(0, MatchingLinesDict("@\\<\\i*\\>")) - command! -buffer Requires call setloclist(0, MatchingLinesDict("^\\s*require\\(_relative\\)\\?\\>\\s\\+\\zs.*$")) - - nnoremap ic oclass m'end`'a - nnoremap id odef m'()end`'a - - nnoremap ~ :call RubyComment(0) - nnoremap # :call RubyComment(1) - vnoremap ~ :call RubyComment(0) - vnoremap # :call RubyComment(1) -endfunction - -function! s:RubyComment(a) - if a:a==0 - " silent! exec '.s/\m^\s*\zs#*//' - silent! exec '.s/\v^(\s|#)*//' - normal == - elseif a:a==1 - " silent! exec '.s/\v^(\s*#)@!/#/' - silent! exec '.s/\v^(\s|#)*/# /' - normal == - end -endfunction - -" --- Lua Stuff --- - -" Matches all types of Lua string! -" \v(["'])\zs.{-}\ze\\@1init_lua_file() - -function! s:init_lua_file() - setl number - command! -buffer Requires call setloclist(0, MatchingLinesDict("\\vrequire\\s*\\(?(([\"'])\\zs.{-}\\ze\\\\@1 let do local -endfunction! - -" --- HTML Stuff --- -au BufNewFile,BufRead *.html,*.htm,*.etlua,*.erb :call init_html_file() - -function! s:init_html_file() - setl number - command! -buffer -nargs=1 Tag normal - \ i<><m'/>`' - nnoremap T ""ciw<""p>m'""p>`'l - nnoremap T ""diw"_cc<""p>o""p>O - - function! s:insert_tag(tag, newline) - if !a:newline - let l:text = "<".a:tag.">" - else - end - put =l:text - endfunction - - nnoremap :call insert_tag(input(""), 0) - - inoremap ""ciw<""p>m'""p>`'l - inoremap ""diw"_cc<""p>o""p>O -endfunction - -" --- Moonscript Stuff --- - -augroup MOON - au! - au BufWritePost *.moon call automoon() -augroup END -com! ToggleAutoMoon echo toggleautomoon() -com! ToggleAutoMoonLocal echo toggleautomoonlocal() -function! s:automoon() - if exists('g:automoon') || exists('b:automoon') - silent !moonc % - redraw - end -endfun -function! s:toggleautomoon() - if exists('g:automoon') - unlet g:automoon - return 'Automoon: off' - else - let g:automoon=1 - return 'Automoon: on' - end -endfun -function! s:toggleautomoonlocal() - if exists('b:automoon') - unlet b:automoon - return 'Local Automoon: off' - else - let b:automoon=1 - return 'Local Automoon: on' - end -endfun - -" --- Markdown Stuff --- -augroup markdown - autocmd! - autocmd FileType markdown call init_markdown_file() -augroup END -function! s:init_markdown_file() - set textwidth=80 -endfunction - -" --- LaTeX Stuff --- - -command! Latex2PDF call Async([ 'lualatex -draftmode '.expand('%'), 'biber '.expand('%:r'), 'lualatex '.expand('%') ]) +run git.vim +run shame.vim