" vim: set bufhidden=delete list noexpandtab :miv " "!!! makes use of marker ' let s:root = expand(':p:h') 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 dx 0"_d$ 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('%') ])