aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--files/vim/.vimrc (renamed from files/rcs/.vimrc)95
-rw-r--r--files/vim/ftplugin/ftplugin/css/css.vim11
-rw-r--r--files/vim/ftplugin/ftplugin/css/css_mappings.vim15
-rw-r--r--files/vim/ftplugin/ftplugin/html/html.vim8
-rw-r--r--files/vim/ftplugin/ftplugin/html/html_mappings.vim63
-rw-r--r--files/vim/ftplugin/ftplugin/java/java.vim13
-rw-r--r--files/vim/ftplugin/ftplugin/javascript/javascript.vim12
-rw-r--r--files/vim/ftplugin/ftplugin/javascript/javascript_mappings.vim22
-rw-r--r--files/vim/ftplugin/ftplugin/python/python.vim17
-rw-r--r--files/vim/ftplugin/ftplugin/sh/sh.vim5
-rw-r--r--files/vim/ftplugin/ftplugin/tex/tex.vim33
-rw-r--r--files/vim/ftplugin/ftplugin/text/text.vim12
-rw-r--r--files/vim/ftplugin/ftplugin/vimwiki/vimwiki.vim18
-rw-r--r--files/vim/plugin/plugin/SWTC.vim339
-rw-r--r--files/vim/plugin/plugin/dragvisuals.vim345
-rw-r--r--files/vim/plugin/plugin/rng.vim83
16 files changed, 1008 insertions, 83 deletions
diff --git a/files/rcs/.vimrc b/files/vim/.vimrc
index bbedcf3..65b41fa 100644
--- a/files/rcs/.vimrc
+++ b/files/vim/.vimrc
@@ -65,7 +65,12 @@ vmap <expr> D DVB_Duplicate()
" Show tabs
"exec "set listchars=tab:\uBB\uBB,trail:\uB7,nbsp:~"
exec "set listchars=tab:\uBB·,trail:\uB7,nbsp:~"
-nnoremap <leader>t :set list!<CR>
+nnoremap <leader>l :set list!<CR>
+
+" For YouCompleteMe
+let g:ycm_auto_trigger = 0
+let g:ycm_autoclose_preview_window_after_insertion = 1
+let g:ycm_key_list_stop_completion = ['<C-y>', '<C-Space>']
" For syntastic
set statusline+=%#warningmsg#
@@ -147,6 +152,12 @@ map <C-l> <C-w>l
"map <C-K> <C-w>K
"map <C-L> <C-w>L
+nnoremap <Tab> gt
+nnoremap <S-Tab> gT
+
+nnoremap <leader>S :!tmux split-window -p 40<CR><CR>
+
+nnoremap <leader>/ /grtfjx<CR>
" Color
syntax enable
syntax on
@@ -196,85 +207,3 @@ nnoremap <leader>cs <Esc>:r ~/.config/custom/vim/c/switch.txt<CR>/<+++><CR>cf>
nnoremap <leader>cw <Esc>:r ~/.config/custom/vim/c/while.txt<CR>/<+++><CR>cf>
nnoremap <leader>cd <Esc>:r ~/.config/custom/vim/c/do.txt<CR>/<+++><CR>cf>
-nnoremap <leader>fixit :YcmCompleter FixIt<CR>
-
-"" html
-
-" Layout elements
-inoremap <leader>hheader <header><Enter><Enter></header><Enter><++><Esc>kki
-inoremap <leader>hnav <nav><Enter><Enter></nav><Enter><++><Esc>kki
-inoremap <leader>hsection <section><Enter><Enter></section><Enter><++><Esc>kki
-inoremap <leader>harticle <article><Enter><Enter></article><Enter><++><Esc>kki
-inoremap <leader>hfooter <footer><Enter><Enter></footer><Enter><++><Esc>kki
-inoremap <leader>haside <aside><Enter><Enter></aside><Enter><++><Esc>kki
-inoremap <leader>hdiv <div class=""><Enter><++><Enter></div><Enter><++><Esc>?""<Enter>a
-
-" Headers and paragraphs
-inoremap <leader>hh1 <h1></h1><Enter><++><Esc>?</h1><Enter>i
-inoremap <leader>hh2 <h2></h2><Enter><++><Esc>?</h2><Enter>i
-inoremap <leader>hh3 <h3></h3><Enter><++><Esc>?</h3><Enter>i
-inoremap <leader>hh4 <h4></h4><Enter><++><Esc>?</h4><Enter>i
-inoremap <leader>hh5 <h5></h5><Enter><++><Esc>?</h5><Enter>i
-inoremap <leader>hh6 <h6></h6><Enter><++><Esc>?</h6><Enter>i
-inoremap <leader>hp <p></p><Enter><++><Esc>?</p><Enter>i
-
-" Text formatting
-inoremap <leader>hb <b></b><++><Esc>?</b><Enter>i
-inoremap <leader>hi <i></i><++><Esc>?</i><Enter>i
-inoremap <leader>hem <em></em><++><Esc>?</em><Enter>i
-inoremap <leader>hcode <code></code><++><Esc>?</code><Enter>i
-inoremap <leader>hsub <sub></sub><++><Esc>?</sub><Enter>i
-inoremap <leader>hsup <sup></sup><++><Esc>?</sup><Enter>i
-inoremap <leader>hcite <cite></cite><++><Esc>?</cite><Enter>i
-
-" Tables
-inoremap <leader>htable <table border=""><Enter><caption><++></caption><Enter><thead><Enter><tr><Enter><++><Enter></tr><Enter></thead><Enter><tbody><Enter><++><Enter></tbody><Enter></table><Enter><++><Esc>?""<Enter>a
-inoremap <leader>htr <tr><Enter><Enter></tr><Enter><++><Esc>kki
-inoremap <leader>hth <th></th><Enter><++><Esc>?</<Enter>i
-inoremap <leader>htd <td></td><Enter><++><Esc>?</<Enter>i
-
-" Lists
-inoremap <leader>hul <ul><Enter><li></li><Enter><++><Enter></ul><Enter><++><Esc>?</l<Enter>i
-inoremap <leader>hol <ol><Enter><li></li><Enter><++><Enter></ol><Enter><++><Esc>?</l<Enter>i
-inoremap <leader>hli <li></li><Enter><++><Esc>?</<Enter>i
-
-" Forms
-inoremap <leader>hform <form><Enter><fieldset><Enter><Enter></fieldset><Enter></form><Enter><++><Esc>3ki
-inoremap <leader>hfs <fieldset><Enter><Enter></fieldset><Enter><++><Esc>kki
-inoremap <leader>hlegend <legend></legend><Enter><++><Esc>?</<Enter>i
-inoremap <leader>hlabel <label><input type="<++>"></label><Enter><++><Esc>?<i<Enter>i
-
-" Media
-inoremap <leader>ha <a href=""><++></a><Enter><++><Esc>?""<Enter>a
-inoremap <leader>himg <img src="" alt="<++>"><Enter><++><Esc>?""<Enter>a
-
-" Misc
-" Comment a line
-nnoremap <leader>hc I<!-- <Esc>A --><Esc>0
-" Uncomment a line
-nnoremap <leader>hC 05x/--><Enter>3x0
-
-"" LaTeX
-
-nnoremap <leader>lc :w<Enter>:! pdflatex --shell-escape %<Enter>
-inoremap <leader>ldocclass \documentclass{}<Esc>o<++><Esc>k$i
-inoremap <leader>lpckg \usepackage{}<Esc>o<++><Esc>k$i
-inoremap <leader>lbdoc \begin{document}<Esc>o<Enter><Enter><Enter>\end{document}<Esc>kkI
-inoremap <leader>lauthor \author{}<Esc>o<++><Esc>k$i
-inoremap <leader>ltitle \title{}<Esc>o<++><Esc>k$i
-inoremap <leader>lsection \section{}<Esc>o<++><Esc>k$i
-inoremap <leader>lssection \subsection{}<Esc>o<++><Esc>k$i
-inoremap <leader>lsssection \subsubsection{}<Esc>o<++><Esc>k$i
-inoremap <leader>lssssection \paragraph{}<Esc>o<++><Esc>k$i
-inoremap <leader>lsssssection \subparagraph{}<Esc>o<++><Esc>k$i
-inoremap <leader>lb \textbf{}<++><Esc>F}i
-inoremap <leader>li \textit{}<++><Esc>F}i
-inoremap <leader>lemph \emph{}<++><Esc>F}i
-inoremap <leader>llabel \label{}<++><Esc>F}i
-inoremap <leader>lref ~\ref{}<++><Esc>F}i
-inoremap <leader>lenumerate \begin{enumerate}<Esc>o<Enter><Enter><Enter>\end{enumerate}<Esc>kkI\item<Enter><Esc>I<Tab><++><Esc>k<<i<Tab><Esc>$a<Space>
-inoremap <leader>litemize \begin{itemize}<Esc>o<Enter><Enter><Enter>\end{itemize}<Esc>kkI\item<Enter><Esc>I<Tab><++><Esc>k<<i<Tab><Esc>$a<Space>
-inoremap <leader>litem \item<Enter><++><Esc>k$a<Space>
-inoremap <leader>limage \begin{figure}[H]<Enter>\begin{center}<Enter>\includegraphics[width=\textwidth]{}<Enter>\caption{<++>}<Enter>\end{center}<Enter>\end{figure}<Enter><++><Esc>4k$i
-inoremap <leader>ltable \begin{table}[H]<Enter>\makebox[\linewidth]{\centering<Enter>\centering<Enter>\begin{tabular}{c<Space>cxxx}<Enter>\toprule<Enter><++><Space>&<Space><++><Space>\\<Enter>\midrule<Enter><++><Space>&<Space><++><Space>\\<Enter>\bottomrule<Enter>\end{tabular}<Enter>}<Enter>\end{table}<Enter><++><Esc>?xxx<Enter>cw
-
diff --git a/files/vim/ftplugin/ftplugin/css/css.vim b/files/vim/ftplugin/ftplugin/css/css.vim
new file mode 100644
index 0000000..0064fda
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/css/css.vim
@@ -0,0 +1,11 @@
+" ~/.vim/ftplugin/css/css.vim
+" CSS-specific vim configuration
+"
+" Syntastic linters: csslint, prettycss, sstylelint
+
+
+call matchadd('ColorColumn', '\%81v', 100)
+
+let g:syntastic_css_csslint_args = "--ignore=order-alphabetical,ids"
+
+autocmd BufEnter *.css source ~/.vim/ftplugin/css/css_mappings.vim
diff --git a/files/vim/ftplugin/ftplugin/css/css_mappings.vim b/files/vim/ftplugin/ftplugin/css/css_mappings.vim
new file mode 100644
index 0000000..161f850
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/css/css_mappings.vim
@@ -0,0 +1,15 @@
+" ~/.vim/ftplugin/css/css_mappings.vim
+" CSS-specific vim configuration (reloaded when entering buffer)
+
+" Tabs are expanded to 4 spaces
+set tabstop=4 shiftwidth=4 noexpandtab
+" Don't show existing tabs
+set nolist
+
+set textwidth=80
+
+" Mappings
+nnoremap <leader>cc :sp ~/.vim/ftplugin/css/css.vim<CR>
+nnoremap <leader>cm :sp ~/.vim/ftplugin/css/css_mappings.vim<CR>
+nnoremap <leader>e :Errors<CR>
+nnoremap <leader>s vi{!sort<CR>
diff --git a/files/vim/ftplugin/ftplugin/html/html.vim b/files/vim/ftplugin/ftplugin/html/html.vim
new file mode 100644
index 0000000..e4e0ab5
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/html/html.vim
@@ -0,0 +1,8 @@
+" ~/.vim/ftplugin/html/html.vim
+" HTML-specific vim configuration
+"
+" Syntastic linter: tidy
+
+call matchadd('ColorColumn', '\%101v', 100)
+
+autocmd BufEnter *.html source ~/.vim/ftplugin/html_mappings.vim
diff --git a/files/vim/ftplugin/ftplugin/html/html_mappings.vim b/files/vim/ftplugin/ftplugin/html/html_mappings.vim
new file mode 100644
index 0000000..b798408
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/html/html_mappings.vim
@@ -0,0 +1,63 @@
+" ~/.vim/ftplugin/html/html_mappings.vim
+" HTML-specific vim mappings
+
+nnoremap <leader>o :!$BROWSER % &<CR><CR>
+nnoremap <leader>f :!firefox --new-window % &<CR><CR>
+nnoremap <leader>cc :sp ~/.vim/ftplugin/html.vim<CR>
+nnoremap <leader>cm :sp ~/.vim/ftplugin/html_mappings.vim<CR>
+nnoremap <leader>e :Errors<CR>
+
+" Layout elements
+inoremap <leader>hheader <header><Enter><Enter></header><Enter><++><Esc>kki
+inoremap <leader>hnav <nav><Enter><Enter></nav><Enter><++><Esc>kki
+inoremap <leader>hsection <section><Enter><Enter></section><Enter><++><Esc>kki
+inoremap <leader>harticle <article><Enter><Enter></article><Enter><++><Esc>kki
+inoremap <leader>hfooter <footer><Enter><Enter></footer><Enter><++><Esc>kki
+inoremap <leader>haside <aside><Enter><Enter></aside><Enter><++><Esc>kki
+inoremap <leader>hdiv <div class=""><Enter><++><Enter></div><Enter><++><Esc>?""<Enter>a
+
+" Headers and paragraphs
+inoremap <leader>hh1 <h1></h1><Enter><++><Esc>?</h1><Enter>i
+inoremap <leader>hh2 <h2></h2><Enter><++><Esc>?</h2><Enter>i
+inoremap <leader>hh3 <h3></h3><Enter><++><Esc>?</h3><Enter>i
+inoremap <leader>hh4 <h4></h4><Enter><++><Esc>?</h4><Enter>i
+inoremap <leader>hh5 <h5></h5><Enter><++><Esc>?</h5><Enter>i
+inoremap <leader>hh6 <h6></h6><Enter><++><Esc>?</h6><Enter>i
+inoremap <leader>hp <p></p><Enter><++><Esc>?</p><Enter>i
+
+" Text formatting
+inoremap <leader>hb <b></b><++><Esc>?</b><Enter>i
+inoremap <leader>hi <i></i><++><Esc>?</i><Enter>i
+inoremap <leader>hem <em></em><++><Esc>?</em><Enter>i
+inoremap <leader>hcode <code></code><++><Esc>?</code><Enter>i
+inoremap <leader>hsub <sub></sub><++><Esc>?</sub><Enter>i
+inoremap <leader>hsup <sup></sup><++><Esc>?</sup><Enter>i
+inoremap <leader>hcite <cite></cite><++><Esc>?</cite><Enter>i
+
+" Tables
+inoremap <leader>htable <table border=""><Enter><caption><++></caption><Enter><thead><Enter><tr><Enter><++><Enter></tr><Enter></thead><Enter><tbody><Enter><++><Enter></tbody><Enter></table><Enter><++><Esc>?""<Enter>a
+inoremap <leader>htr <tr><Enter><Enter></tr><Enter><++><Esc>kki
+inoremap <leader>hth <th></th><Enter><++><Esc>?</<Enter>i
+inoremap <leader>htd <td></td><Enter><++><Esc>?</<Enter>i
+
+" Lists
+inoremap <leader>hul <ul><Enter><li></li><Enter><++><Enter></ul><Enter><++><Esc>?</l<Enter>i
+inoremap <leader>hol <ol><Enter><li></li><Enter><++><Enter></ol><Enter><++><Esc>?</l<Enter>i
+inoremap <leader>hli <li></li><Enter><++><Esc>?</<Enter>i
+
+" Forms
+inoremap <leader>hform <form><Enter><fieldset><Enter><Enter></fieldset><Enter></form><Enter><++><Esc>3ki
+inoremap <leader>hfs <fieldset><Enter><Enter></fieldset><Enter><++><Esc>kki
+inoremap <leader>hlegend <legend></legend><Enter><++><Esc>?</<Enter>i
+inoremap <leader>hlabel <label><input type="<++>"></label><Enter><++><Esc>?<i<Enter>i
+
+" Media
+inoremap <leader>ha <a href=""><++></a><Enter><++><Esc>?""<Enter>a
+inoremap <leader>himg <img src="" alt="<++>"><Enter><++><Esc>?""<Enter>a
+
+" Misc
+" Comment a line
+nnoremap <leader>hc I<!-- <Esc>A --><Esc>0
+" Uncomment a line
+nnoremap <leader>hC 05x/--><Enter>3x0
+
diff --git a/files/vim/ftplugin/ftplugin/java/java.vim b/files/vim/ftplugin/ftplugin/java/java.vim
new file mode 100644
index 0000000..0c9fe43
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/java/java.vim
@@ -0,0 +1,13 @@
+" ~/.vim/ftplugin/java.vim
+" Java-specific vim configuration
+
+nnoremap <leader>gt :YcmCompleter GoTo<CR>
+nnoremap <leader>gr :YcmCompleter GoToReferences<CR>
+nnoremap <leader>fi :YcmCompleter FixIt<CR>
+nnoremap <leader>rr :YcmCompleter RefactorRename<Space>
+nnoremap <leader>e :YcmDiags<CR>
+nnoremap <leader>R :!./run.sh<CR>
+
+call matchadd('ColorColumn', '\%131v', 100)
+
+let g:syntastic_java_checkers = []
diff --git a/files/vim/ftplugin/ftplugin/javascript/javascript.vim b/files/vim/ftplugin/ftplugin/javascript/javascript.vim
new file mode 100644
index 0000000..470287d
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/javascript/javascript.vim
@@ -0,0 +1,12 @@
+" ~/.vim/ftplugin/javascript/javascript.vim
+" JavaScript-specific vim configuration
+"
+" Syntastic linters: jslint
+
+" Column marker: 80 characters
+call matchadd('ColorColumn', '\%81v', 100)
+
+" JSLint arguments
+let g:syntastic_javascript_jslint_args = "--browser --indent"
+
+autocmd BufEnter *.js source ~/.vim/ftplugin/javasctipt/javascript_BufEnter.vim
diff --git a/files/vim/ftplugin/ftplugin/javascript/javascript_mappings.vim b/files/vim/ftplugin/ftplugin/javascript/javascript_mappings.vim
new file mode 100644
index 0000000..f7214e2
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/javascript/javascript_mappings.vim
@@ -0,0 +1,22 @@
+" ~/.vim/ftplugin/javascript/javascript_BufEnter.vim
+" JavaScript-specific vim configuration (reloaded when entering buffer)
+
+" Tabs are expanded to 4 spaces
+set tabstop=4 shiftwidth=4 expandtab
+" Show existing tabs (they can be deleted with :retab)
+set list
+
+set textwidth=80
+
+" Mappings
+nnoremap <leader>cc :sp ~/.vim/ftplugin/javascript/javascript.vim<CR>
+nnoremap <leader>cm :sp ~/.vim/ftplugin/javascript/javascript_BufEnter.vim<CR>
+nnoremap <leader>E :Errors<CR>
+inoremap <leader>if if (<+++>) {<CR><++><CR>} <++><Esc>?<+++><CR>cf>
+inoremap <leader>else else {<CR><+++><CR>}<CR><++><Esc>?<+++><CR>cf>
+
+nnoremap <leader>gt :YcmCompleter GoTo<CR>
+nnoremap <leader>gr :YcmCompleter GoToReferences<CR>
+nnoremap <leader>fi :YcmCompleter FixIt<CR>
+nnoremap <leader>r :YcmCompleter RefactorRename<Space>
+nnoremap <leader>e :YcmDiags<CR>
diff --git a/files/vim/ftplugin/ftplugin/python/python.vim b/files/vim/ftplugin/ftplugin/python/python.vim
new file mode 100644
index 0000000..74c7e2c
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/python/python.vim
@@ -0,0 +1,17 @@
+" ~/.vim/ftplugin/python/python.vim
+" Python-specific vim configuration
+
+" Column marker: 80 characters
+call matchadd('ColorColumn', '\%81v', 100)
+let b:syntastic_mode="passive"
+
+nnoremap <leader>c :sp ~/.vim/ftplugin/python/python.vim<CR>
+nnoremap <leader>E :Errors<CR>
+
+nnoremap <leader>gt :YcmCompleter GoTo<CR>
+nnoremap <leader>gr :YcmCompleter GoToReferences<CR>
+nnoremap <leader>gd :YcmCompleter GetDoc<CR>
+nnoremap <leader>gT :YcmCompleter GetType<CR>
+nnoremap <leader>fi :YcmCompleter FixIt<CR>
+nnoremap <leader>r :YcmCompleter RefactorRename<Space>
+nnoremap <leader>e :YcmDiags<CR>
diff --git a/files/vim/ftplugin/ftplugin/sh/sh.vim b/files/vim/ftplugin/ftplugin/sh/sh.vim
new file mode 100644
index 0000000..bebdcba
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/sh/sh.vim
@@ -0,0 +1,5 @@
+" ~/.vim/ftplugin/sh.vim
+" Bourne shell scripts specific vim configuration
+
+nnoremap <leader>e :Errors<CR>
+call matchadd('ColorColumn', '\%101v', 100)
diff --git a/files/vim/ftplugin/ftplugin/tex/tex.vim b/files/vim/ftplugin/ftplugin/tex/tex.vim
new file mode 100644
index 0000000..43492e5
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/tex/tex.vim
@@ -0,0 +1,33 @@
+" ~/.vim/ftplugin/tex.vim
+" LaTeX-specific vim configuration
+
+" Syntastic linters: chktex, lacheck, proselint
+
+call matchadd('ColorColumn', '\%91v', 100)
+
+nnoremap <leader>c :sp ~/.vim/ftplugin/tex.vim<CR>
+nnoremap <leader>e :Errors<CR>
+" proselint not enabled by default (and better not be)
+nnoremap <leader>sp :SyntasticCheck proselint<CR>
+
+nnoremap <leader>lc :w<Enter>:! pdflatex --shell-escape %<Enter>
+inoremap <leader>ldocclass \documentclass{}<Esc>o<++><Esc>k$i
+inoremap <leader>lpckg \usepackage{}<Esc>o<++><Esc>k$i
+inoremap <leader>lbdoc \begin{document}<Esc>o<Enter><Enter><Enter>\end{document}<Esc>kkI
+inoremap <leader>lauthor \author{}<Esc>o<++><Esc>k$i
+inoremap <leader>ltitle \title{}<Esc>o<++><Esc>k$i
+inoremap <leader>lsection \section{}<Esc>o<++><Esc>k$i
+inoremap <leader>lssection \subsection{}<Esc>o<++><Esc>k$i
+inoremap <leader>lsssection \subsubsection{}<Esc>o<++><Esc>k$i
+inoremap <leader>lssssection \paragraph{}<Esc>o<++><Esc>k$i
+inoremap <leader>lsssssection \subparagraph{}<Esc>o<++><Esc>k$i
+inoremap <leader>lb \textbf{}<++><Esc>F}i
+inoremap <leader>li \textit{}<++><Esc>F}i
+inoremap <leader>lemph \emph{}<++><Esc>F}i
+inoremap <leader>llabel \label{}<++><Esc>F}i
+inoremap <leader>lref ~\ref{}<++><Esc>F}i
+inoremap <leader>lenumerate \begin{enumerate}<Esc>o<Enter><Enter><Enter>\end{enumerate}<Esc>kkI\item<Enter><Esc>I<Tab><++><Esc>k<<i<Tab><Esc>$a<Space>
+inoremap <leader>litemize \begin{itemize}<Esc>o<Enter><Enter><Enter>\end{itemize}<Esc>kkI\item<Enter><Esc>I<Tab><++><Esc>k<<i<Tab><Esc>$a<Space>
+inoremap <leader>litem \item<Enter><++><Esc>k$a<Space>
+inoremap <leader>limage \begin{figure}[H]<Enter>\begin{center}<Enter>\includegraphics[width=\textwidth]{}<Enter>\caption{<++>}<Enter>\end{center}<Enter>\end{figure}<Enter><++><Esc>4k$i
+inoremap <leader>ltable \begin{table}[H]<Enter>\makebox[\linewidth]{\centering<Enter>\centering<Enter>\begin{tabular}{c<Space>cxxx}<Enter>\toprule<Enter><++><Space>&<Space><++><Space>\\<Enter>\midrule<Enter><++><Space>&<Space><++><Space>\\<Enter>\bottomrule<Enter>\end{tabular}<Enter>}<Enter>\end{table}<Enter><++><Esc>?xxx<Enter>cw
diff --git a/files/vim/ftplugin/ftplugin/text/text.vim b/files/vim/ftplugin/ftplugin/text/text.vim
new file mode 100644
index 0000000..3252e54
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/text/text.vim
@@ -0,0 +1,12 @@
+" ~/.vim/ftplugin/text.vim
+" Plain text files vim configuration
+"
+" Syntastic linter: proselint
+
+nnoremap <leader>c :sp ~/.vim/ftplugin/text.vim<CR>
+nnoremap <leader>e :Errors<CR>
+
+call matchadd('ColorColumn', '\%101v', 100)
+
+" Proselint is slow to act
+" let g:syntastic_text_checkers = ['proselint']
diff --git a/files/vim/ftplugin/ftplugin/vimwiki/vimwiki.vim b/files/vim/ftplugin/ftplugin/vimwiki/vimwiki.vim
new file mode 100644
index 0000000..92eea91
--- /dev/null
+++ b/files/vim/ftplugin/ftplugin/vimwiki/vimwiki.vim
@@ -0,0 +1,18 @@
+" ~/.vim/ftplugin/vimwiki.vim
+" vimwiki-specific vim configuration
+"
+" Syntastic linter: mdl, proselint, textlint
+
+" Tabs hate: tabs are expanded to 2 spaces
+set tabstop=2 shiftwidth=2 expandtab
+" Show existing tabs (they can be deleted with :retab)
+set list
+
+" Column marker: 80 characters
+call matchadd('ColorColumn', '\%81v', 100)
+set textwidth=80
+
+let g:syntastic_vimwiki_checkers = ['markdown/mdl']
+
+nnoremap <leader>c :sp ~/.vim/ftplugin/vimwiki.vim<CR>
+nnoremap <leader>e :Errors<CR>
diff --git a/files/vim/plugin/plugin/SWTC.vim b/files/vim/plugin/plugin/SWTC.vim
new file mode 100644
index 0000000..9459e92
--- /dev/null
+++ b/files/vim/plugin/plugin/SWTC.vim
@@ -0,0 +1,339 @@
+" Vim global plugin for Star Wars crawls
+" Maintainer: Damian Conway
+" License: This file is placed in the public domain.
+
+"######################################################################
+"## ##
+"## To use: ##
+"## ##
+"## :SWTC <filename> ##
+"## ##
+"## See file 'intro.swtc' for the crawl-specification syntax ##
+"## ##
+"######################################################################
+
+
+" If already loaded, we're done...
+if exists("loaded_SWcrawl")
+ finish
+endif
+let loaded_SWcrawl = 1
+
+" Preserve external compatibility options, then enable full vim compatibility...
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Set up the actual colon command...
+command! -nargs=1 -complete=file SWTC call SWcrawl(<f-args>)
+
+
+" Implementation....
+
+let s:CRAWL_SPEED = 1 "(lines per second)
+let s:STAR_DENSITY = 50 "(pixels per star, i.e. 1 star per STAR_DENSITY pixels)
+let s:STARFIELD_HEIGHT = 2 "(screens deep)
+
+let s:LOGO_LINE1 = '^\s*\[\zs.*\ze\]\s*$'
+let s:LOGO_LINE2 = '^\s*\[\[\zs.*\ze\]\]\s*$'
+let s:LOGO_LINE3 = '^\s*\[\[\[\zs.*\ze\]\]\]\s*$'
+let s:LOGO_LINE4 = '^\s*\[\[\[\[\zs.*\ze\]\]\]\]\s*$'
+let s:CENTRED_CRAWL_LINE = '^\s*[>]\s*\zs.\{-}\ze\s*[<]\s*$'
+let s:CRAWL_LINE = '^\s*[|]\s*\zs.\{-}\ze\s*[|]\s*$'
+let s:PREFACE_LINE = '^\s*\zs.\{-}\ze\s*$'
+
+highlight SWC_PREFACE ctermfg=cyan
+highlight SWC_FADE_LIGHT ctermfg=cyan
+highlight SWC_FADE_DARK ctermfg=blue
+highlight SWC_LOGO ctermfg=yellow cterm=bold
+highlight SWC_CRAWL ctermfg=yellow
+highlight SWC_STAR ctermfg=white
+highlight SWC_BLACK ctermfg=black ctermbg=black
+
+let s:PREFACE_POS = { 'x': 10, 'y': 5 }
+
+function! SWcrawl (textsource)
+ " Load preface, logo, and text to be crawled...
+ let preface = []
+ let logo1 = []
+ let logo2 = []
+ let logo3 = []
+ let logo4 = []
+ let crawl = []
+ let centred = []
+ let max_crawl_width = 0
+ for nextline in readfile(a:textsource)
+ " Ignore blank lines...
+ if nextline =~ '^\s*$'
+ continue
+
+ " Lines in [...] are logo components...
+ elseif nextline =~ s:LOGO_LINE4
+ let logo4 += [ matchstr(nextline, s:LOGO_LINE4) ]
+ elseif nextline =~ s:LOGO_LINE3
+ let logo3 += [ matchstr(nextline, s:LOGO_LINE3) ]
+ elseif nextline =~ s:LOGO_LINE2
+ let logo2 += [ matchstr(nextline, s:LOGO_LINE2) ]
+ elseif nextline =~ s:LOGO_LINE1
+ let logo1 += [ matchstr(nextline, s:LOGO_LINE1) ]
+
+ " Lines in |...| are crawl components...
+ elseif nextline =~ s:CRAWL_LINE
+ let next_crawl = matchstr(nextline, s:CRAWL_LINE)
+ if strlen(next_crawl) > max_crawl_width
+ let max_crawl_width = strlen(substitute(next_crawl,'\s\+',' ','g'))
+ endif
+ let crawl += [ next_crawl ]
+ let centred += [ 0 ]
+
+ " Lines in >...< are centred crawl components...
+ elseif nextline =~ s:CENTRED_CRAWL_LINE
+ let next_crawl = matchstr(nextline, s:CENTRED_CRAWL_LINE)
+ if strlen(next_crawl) > max_crawl_width
+ let max_crawl_width = strlen(substitute(next_crawl,'\s\+',' ','g'))
+ endif
+ let crawl += [ next_crawl ]
+ let centred += [ 1 ]
+
+ " Anything else is preface...
+ else
+ let preface += [ substitute(matchstr(nextline, s:PREFACE_LINE), "^\s*", repeat(" ",s:PREFACE_POS.x), '') ]
+
+ endif
+ endfor
+
+ " Ensure all logos available...
+ let logo1 = len(logo1) ? logo1 : ["YOUR", "LOGO", "HERE"]
+ let logo2 = len(logo2) ? logo2 : copy(logo1)
+ let logo3 = len(logo3) ? logo3 : copy(logo2)
+ let logo4 = len(logo4) ? logo4 : copy(logo3)
+
+ " Save current buffer for final transition effect...
+ let original_buffer = getline(1,'$')
+
+ " Switch to a new buffer...
+ let prev_matches = getmatches()
+ enew!
+ let b:WIN = { 'x' : winwidth(0), 'y' : winheight(0) }
+ call setline(1, repeat([""], b:WIN.y + 1))
+
+ " And hide annoyances...
+ set lcs=
+ let old_rulerformat = &rulerformat
+ let &rulerformat="%#SWC_BLACK#%l"
+ echo ""
+
+ " Generate starfield...
+ let stars = SWC_gen_stars()
+
+ " Clear screen...
+ call setline(1, repeat([""], s:STARFIELD_HEIGHT * b:WIN.y) + original_buffer)
+ redraw
+ sleep 2
+
+ " Start with preface...
+ call matchadd('SWC_PREFACE', '.', 100)
+ call setline(s:PREFACE_POS.y, preface)
+ echo ""
+ redraw
+ sleep 5
+
+ " Clean up...
+ call clearmatches()
+ call setline(s:PREFACE_POS.y, repeat([""], len(preface)))
+ echo ""
+ redraw
+ sleep 1
+
+ " Then show logo receding at centre of screen...
+ call clearmatches()
+ call matchadd('SWC_BLACK', '*', 102)
+ call matchadd('SWC_STAR', '\s\zs[.]\ze\s', 101)
+ call matchadd('SWC_LOGO', '.', 100)
+ call SWC_draw_logo(logo1)
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ sleep 3
+
+ " Push it away...
+ call setline(1, repeat([""], b:WIN.y))
+ call SWC_draw_logo(logo2)
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ sleep 500m
+
+ call setline(1, repeat([""], b:WIN.y))
+ call SWC_draw_logo(logo3)
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ sleep 500m
+
+ call setline(1, repeat([""], b:WIN.y))
+ call SWC_draw_logo(logo4)
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ sleep 500m
+
+
+ " Clean up...
+ call clearmatches()
+ call matchadd('SWC_STAR', '\s\zs[.]\ze\s', 101)
+ call setline(1, repeat([""], b:WIN.y))
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ sleep 2
+
+ " Run crawl...
+ call clearmatches()
+ call matchadd('SWC_CRAWL', '.', 100)
+ call matchadd('SWC_STAR', '\s\zs[.]\ze\s', 101)
+ for offset_from_bottom in range(1, len(crawl) + b:WIN.y)
+ let crawl_line = offset_from_bottom < b:WIN.y ? 0 : offset_from_bottom - b:WIN.y + 1
+ for screen_line in range(1, b:WIN.y)
+ if screen_line >= b:WIN.y - offset_from_bottom && crawl_line < len(crawl)
+ let padded_line = SWC_pad(crawl[crawl_line], screen_line, centred[crawl_line], max_crawl_width)
+ call setline(screen_line, padded_line)
+ let crawl_line += 1
+ else
+ call setline(screen_line, "")
+ endif
+ endfor
+ call SWC_paint_stars(stars)
+ echo ""
+ redraw
+ exec 'sleep ' . s:trunc(1000/s:CRAWL_SPEED) . 'm'
+ if getchar(0) || offset_from_bottom > len(crawl) && padded_line !~ '\S'
+ break
+ endif
+ endfor
+
+ " Pan starfield down...
+ call matchadd('SWC_FADE_DARK', '[^.]', 200)
+ sleep 200m
+ for offset_from_top in range(1, s:STARFIELD_HEIGHT * b:WIN.y)
+ 1delete
+ redraw
+ exec 'sleep ' . (200 - 2 * offset_from_top) . 'm'
+ endfor
+ sleep 200m
+
+
+ " Switch back to previous buffer and restore normal highlighting...
+ edit! #
+ call setmatches(prev_matches)
+ let &rulerformat = old_rulerformat
+ redraw
+
+endfunction
+
+function s:trunc (n)
+ return str2nr(string( a:n ))
+endfunction
+
+function! SWC_draw_logo (logo)
+ let logo = copy(a:logo)
+
+ " Find centre for logo...
+ let logo_width = 0
+ for line in logo
+ if strlen(line) > logo_width
+ let logo_width = strlen(line)
+ endif
+ endfor
+ let logo_pos_x = (b:WIN.x - logo_width) / 2
+ let logo_pos_y = (b:WIN.y - len(logo)) / 2
+
+ " Move logo to centre...
+ call map(logo, "repeat(' ', logo_pos_x) . v:val")
+
+ " Draw logo
+ call setline(logo_pos_y, logo)
+
+endfunction
+
+function! SWC_pad (text, y_pos, centred, max_text_width)
+
+ " Does this need padding???
+ let words = split(a:text, '\s\+')
+ if len(words) < 1
+ return a:text
+ endif
+
+ " How many unpadded characters are there???
+ let unpadded_width = 0
+ for word in words
+ let unpadded_width += strlen(word)
+ endfor
+
+ " How much padding is needed???
+ let rel_y = (2.0 * a:y_pos / b:WIN.y) - 1.0
+ let stretched_width = s:trunc( a:max_text_width + rel_y * (b:WIN.x - a:max_text_width) )
+ let required_padding = max([ 0, stretched_width - unpadded_width ])
+ let indent = (b:WIN.x - stretched_width) / 2
+ let gap_count = len(words) - 1
+
+ " Is this a last line???
+ let tight = a:centred || strlen(a:text) < 0.9 * a:max_text_width
+
+ " Insert padding...
+ if a:y_pos >= b:WIN.y/2
+ let min_padding_needed_for = gap_count
+ if tight
+ let min_pad_per_gap = max([ 1, s:trunc(rel_y * 6.0) ])
+ else
+ let min_pad_per_gap = max([ 1, required_padding / gap_count ])
+ let leftover_padding = required_padding - gap_count * min_pad_per_gap
+ let min_padding_needed_for = min([ gap_count, gap_count - leftover_padding ])
+ endif
+ let padded_text = join(words[0 : min_padding_needed_for], repeat(" ", min_pad_per_gap))
+ \ . repeat(" ", min_pad_per_gap+1)
+ \ . join(words[min_padding_needed_for+1 : -1], repeat(" ", min_pad_per_gap+1))
+ let padded_text = substitute(padded_text, '\s*$', '', '')
+
+ " Or remove chars (in the distance)...
+ elseif a:text =~ '\S'
+" let delta = s:trunc( 8.0 * (b:WIN.y/2 - a:y_pos) )
+" let greeked_len = max([ 0, strlen(substitute(a:text, '^\s*\|\s*$', '', 'g')) - delta ])
+ let greeked_len = tight ? stretched_width * (unpadded_width + gap_count) / a:max_text_width : stretched_width
+ let padded_text = repeat('~', greeked_len)
+
+ " Or ignore it...
+ else
+ let padded_text = ""
+
+ endif
+
+ " Indent to centre...
+ let padded_text = substitute(padded_text, '\s*$', '', '')
+ let max_ever_padding = b:WIN.x - a:max_text_width
+ let indent = a:centred ? (b:WIN.x - strlen(padded_text))/2
+ \ : indent
+ return repeat(" ", indent) . padded_text
+endfunction
+
+function! SWC_gen_stars ()
+ let star_count = b:WIN.x * s:STARFIELD_HEIGHT * b:WIN.y / s:STAR_DENSITY
+ let stars = []
+ for n in range(star_count)
+ let x = RandomNumber(b:WIN.x) + 1
+ let y = RandomNumber(s:STARFIELD_HEIGHT * b:WIN.y) + 1
+ let stars += [{'y':y,'x':x}]
+ endfor
+ return stars
+endfunction
+
+function! SWC_paint_stars (stars)
+ let max_x = b:WIN.x
+ for star in a:stars
+ let line = strpart(getline(star.y) . repeat(" ", max_x), 0, max_x)
+ let line = substitute(line, '\s\zs\%'.(star.x-1).'c\s\ze\s', '.', '')
+ call setline(star.y, line)
+ endfor
+endfunction
+
+" Restore previous external compatibility options
+let &cpo = s:save_cpo
diff --git a/files/vim/plugin/plugin/dragvisuals.vim b/files/vim/plugin/plugin/dragvisuals.vim
new file mode 100644
index 0000000..12c4f5d
--- /dev/null
+++ b/files/vim/plugin/plugin/dragvisuals.vim
@@ -0,0 +1,345 @@
+" Vim global plugin for dragging virtual blocks
+" Last change: Tue Jul 24 07:19:35 EST 2012
+" Maintainer: Damian Conway
+" License: This file is placed in the public domain.
+
+"#########################################################################
+"## ##
+"## Add the following (uncommented) to your .vimrc... ##
+"## ##
+"## runtime plugin/dragvisuals.vim ##
+"## ##
+"## vmap <expr> <LEFT> DVB_Drag('left') ##
+"## vmap <expr> <RIGHT> DVB_Drag('right') ##
+"## vmap <expr> <DOWN> DVB_Drag('down') ##
+"## vmap <expr> <UP> DVB_Drag('up') ##
+"## vmap <expr> D DVB_Duplicate() ##
+"## ##
+"## " Remove any introduced trailing whitespace after moving... ##
+"## let g:DVB_TrimWS = 1 ##
+"## ##
+"## Or, if you use the arrow keys for normal motions, choose ##
+"## four other keys for block dragging. For example: ##
+"## ##
+"## vmap <expr> h DVB_Drag('left') ##
+"## vmap <expr> l DVB_Drag('right') ##
+"## vmap <expr> j DVB_Drag('down') ##
+"## vmap <expr> k DVB_Drag('up') ##
+"## ##
+"## Or: ##
+"## ##
+"## vmap <expr> <S-LEFT> DVB_Drag('left') ##
+"## vmap <expr> <S-RIGHT> DVB_Drag('right') ##
+"## vmap <expr> <S-DOWN> DVB_Drag('down') ##
+"## vmap <expr> <S-UP> DVB_Drag('up') ##
+"## ##
+"## Or even: ##
+"## ##
+"## vmap <expr> <LEFT><LEFT> DVB_Drag('left') ##
+"## vmap <expr> <RIGHT><RIGHT> DVB_Drag('right') ##
+"## vmap <expr> <DOWN><DOWN> DVB_Drag('down') ##
+"## vmap <expr> <UP><UP> DVB_Drag('up') ##
+"## ##
+"#########################################################################
+
+
+" If already loaded, we're done...
+if exists("loaded_dragvirtualblocks")
+ finish
+endif
+let loaded_dragvirtualblocks = 1
+
+" Preserve external compatibility options, then enable full vim compatibility...
+let s:save_cpo = &cpo
+set cpo&vim
+
+"====[ Implementation ]====================================
+
+" Toggle this to stop trimming on drags...
+if !exists('g:DVB_TrimWS')
+ let g:DVB_TrimWS = 1
+endif
+
+function! DVB_Drag (dir)
+ " No-op in Visual mode...
+ if mode() ==# 'v'
+ return "\<ESC>gv"
+
+ " Do Visual Line drag indirectly via temporary nmap
+ " (to ensure we have access to block position data)...
+ elseif mode() ==# 'V'
+ " Set up a temporary convenience...
+ exec "nnoremap <silent><expr><buffer> M \<SID>Drag_Lines('".a:dir."')"
+
+ " Return instructions to implement the move and reset selection...
+ return '"vyM'
+
+ " Otherwise do Visual Block drag indirectly via temporary nmap
+ " (to ensure we have access to block position data)...
+ else
+ " Set up a temporary convenience...
+ exec "nnoremap <silent><expr><buffer> M \<SID>Drag_Block('".a:dir."')"
+
+ " Return instructions to implement the move and reset selection...
+ return '"vyM'
+ endif
+endfunction
+
+" Duplicate selected block and place to the right...
+function! DVB_Duplicate ()
+ exec "nnoremap <silent><expr><buffer> M \<SID>DuplicateBlock()"
+ return '"vyM'
+endfunction
+
+function! s:DuplicateBlock ()
+ nunmap <buffer> M
+ " Locate block boundaries...
+ let [buf_left, line_left, col_left, offset_left ] = getpos("'<")
+ let [buf_right, line_right, col_right, offset_right] = getpos("'>")
+
+ " Identify special '$' blocks...
+ let dollar_block = 0
+ let start_col = min([col_left+offset_left, col_right+offset_right])
+ let end_col = max([col_left+offset_left, col_right+offset_right])
+ let visual_width = end_col - start_col + 1
+ for visual_line in split(getreg("v"),"\n")
+ if strlen(visual_line) > visual_width
+ let dollar_block = 1
+ let visual_width = strlen(visual_line)
+ endif
+ endfor
+ let square_up = (dollar_block ? (start_col+visual_width-2).'|' : '')
+
+ set virtualedit=all
+ return 'gv'.square_up.'yPgv'
+ \. (visual_width-dollar_block) . 'lo' . (visual_width-dollar_block) . 'l'
+ \. "y:set virtualedit=block\<CR>gv"
+ \. (dollar_block ? 'o$' : '')
+endfunction
+
+
+" Kludge to hide change reporting inside implementation...
+let s:NO_REPORT = ":let b:DVB_report=&report\<CR>:let &report=1000000000\<CR>"
+let s:PREV_REPORT = ":let &report = b:DVB_report\<CR>"
+
+
+" Drag in specified direction in Visual Line mode...
+function! s:Drag_Lines (dir)
+ " Clean up the temporary convenience...
+ nunmap <buffer> M
+
+ " Locate block being shifted...
+ let [buf_left, line_left, col_left, offset_left ] = getpos("'<")
+ let [buf_right, line_right, col_right, offset_right] = getpos("'>")
+
+ " Drag entire lines left if possible...
+ if a:dir == 'left'
+ " Are all lines indented at least one space???
+ let lines = getline(line_left, line_right)
+ let all_indented = match(lines, '^[^ ]') == -1
+ nohlsearch
+
+ " If can't trim one space from start of each line, be a no-op...
+ if !all_indented
+ return 'gv'
+
+ " Otherwise drag left by removing one space from start of each line...
+ else
+ return s:NO_REPORT
+ \ . "gv:s/^ //\<CR>"
+ \ . s:PREV_REPORT
+ \ . "gv"
+ endif
+
+ " To drag entire lines right, add a space in column 1...
+ elseif a:dir == 'right'
+ return s:NO_REPORT
+ \ . "gv:s/^/ /\<CR>:nohlsearch\<CR>"
+ \ . s:PREV_REPORT
+ \ . "gv"
+
+ " To drag entire lines upwards...
+ elseif a:dir == 'up'
+ let EOF = line('$')
+
+ " Can't drag up if at first line...
+ if line_left == 1 || line_right == 1
+ return 'gv'
+
+ " Needs special handling at EOF (because cursor moves up on delete)...
+ elseif line_left == EOF || line_right == EOF
+ let height = line_right - line_left
+ let select_extra = height ? height . 'j' : ""
+ return s:NO_REPORT
+ \ . 'gvxP'
+ \ . s:PREV_REPORT
+ \ . 'V' . select_extra
+
+ " Otherwise just cut-move-paste-reselect...
+ else
+ let height = line_right - line_left
+ let select_extra = height ? height . 'j' : ""
+ return s:NO_REPORT
+ \ . 'gvxkP'
+ \ . s:PREV_REPORT
+ \ . 'V' . select_extra
+ endif
+
+ " To drag entire lines downwards...
+ elseif a:dir == 'down'
+ let EOF = line('$')
+
+ " This is how much extra we're going to have to reselect...
+ let height = line_right - line_left
+ let select_extra = height ? height . 'j' : ""
+
+ " Needs special handling at EOF (to push selection down into new space)...
+ if line_left == EOF || line_right == EOF
+ return "O\<ESC>gv"
+
+ " Otherwise, just cut-move-paste-reselect...
+ else
+ return s:NO_REPORT
+ \ . 'gvxp'
+ \ . s:PREV_REPORT
+ \ . 'V' . select_extra
+ endif
+
+ endif
+endfunction
+
+" Drag in specified direction in Visual Block mode...
+function! s:Drag_Block (dir)
+ " Clean up the temporary convenience...
+ nunmap <buffer> M
+
+ " Locate block being shifted...
+ let [buf_left, line_left, col_left, offset_left ] = getpos("'<")
+ let [buf_right, line_right, col_right, offset_right] = getpos("'>")
+
+ " Identify special '$' blocks...
+ let dollar_block = 0
+ let start_col = min([col_left+offset_left, col_right+offset_right])
+ let end_col = max([col_left+offset_left, col_right+offset_right])
+ let visual_width = end_col - start_col + 1
+ for visual_line in split(getreg("v"),"\n")
+ if strlen(visual_line) > visual_width
+ let dollar_block = 1
+ let visual_width = strlen(visual_line)
+ endif
+ endfor
+ let square_up = (dollar_block ? (start_col+visual_width-2).'|' : '')
+
+ " Drag left...
+ if a:dir == 'left'
+ "Can't drag left at left margin...
+ if col_left == 1 || col_right == 1
+ return 'gv'
+
+ " Otherwise reposition one column left (and optionally trim any whitespace)...
+ elseif g:DVB_TrimWS
+ " May need to be able to temporarily step past EOL...
+ let prev_ve = &virtualedit
+ set virtualedit=all
+
+ " Are we moving past other text???
+ let square_up_final = ""
+ if dollar_block
+ let lines = getline(line_left, line_right)
+ if match(lines, '^.\{'.(start_col-2).'}\S') >= 0
+ let dollar_block = 0
+ let square_up_final = (start_col+visual_width-3).'|'
+ endif
+ endif
+
+ let vcol = start_col - 2
+ return 'gv'.square_up.'xhP'
+ \ . s:NO_REPORT
+ \ . "gvhoho:s/\\s*$//\<CR>gv\<ESC>"
+ \ . ':set virtualedit=' . prev_ve . "\<CR>"
+ \ . s:PREV_REPORT
+ \ . ":nohlsearch\<CR>gv"
+ \ . (dollar_block ? '$' : square_up_final )
+ else
+ return 'gv'.square_up.'xhPgvhoho'
+ endif
+
+ " Drag right...
+ elseif a:dir == 'right'
+ " May need to be able to temporarily step past EOL...
+ let prev_ve = &virtualedit
+ set virtualedit=all
+
+ " Reposition block one column to the right...
+ if g:DVB_TrimWS
+ let vcol = start_col
+ return 'gv'.square_up.'xp'
+ \ . s:NO_REPORT
+ \ . "gvlolo"
+ \ . ":s/\\s*$//\<CR>gv\<ESC>"
+ \ . ':set virtualedit=' . prev_ve . "\<CR>"
+ \ . s:PREV_REPORT
+ \ . (dollar_block ? 'gv$' : 'gv')
+ else
+ return 'gv'.square_up.'xp:set virtualedit=' . prev_ve . "\<CR>gvlolo"
+ endif
+
+ " Drag upwards...
+ elseif a:dir == 'up'
+ " Can't drag upwards at top margin...
+ if line_left == 1 || line_right == 1
+ return 'gv'
+ endif
+
+ " May need to be able to temporarily step past EOL...
+ let prev_ve = &virtualedit
+ set virtualedit=all
+
+ " If trimming whitespace, jump to just below block to do it...
+ if g:DVB_TrimWS
+ let height = line_right - line_left + 1
+ return 'gv'.square_up.'xkPgvkoko"vy'
+ \ . height
+ \ . 'j:s/\s*$//'
+ \ . "\<CR>:nohlsearch\<CR>:set virtualedit="
+ \ . prev_ve
+ \ . "\<CR>gv"
+ \ . (dollar_block ? '$' : '')
+
+ " Otherwise just move and reselect...
+ else
+ return 'gv'.square_up.'xkPgvkoko"vy:set virtualedit='
+ \ . prev_ve
+ \ . "\<CR>gv"
+ \ . (dollar_block ? '$' : '')
+ endif
+
+ " Drag downwards...
+ elseif a:dir == 'down'
+ " May need to be able to temporarily step past EOL...
+ let prev_ve = &virtualedit
+ set virtualedit=all
+
+ " If trimming whitespace, move to just above block to do it...
+ if g:DVB_TrimWS
+ return 'gv'.square_up.'xjPgvjojo"vyk:s/\s*$//'
+ \ . "\<CR>:nohlsearch\<CR>:set virtualedit="
+ \ . prev_ve
+ \ . "\<CR>gv"
+ \ . (dollar_block ? '$' : '')
+
+ " Otherwise just move and reselect...
+ else
+ return 'gv'.square_up.'xjPgvjojo"vy'
+ \ . "\<CR>:set virtualedit="
+ \ . prev_ve
+ \ . "\<CR>gv"
+ \ . (dollar_block ? '$' : '')
+ endif
+ endif
+endfunction
+
+
+" Restore previous external compatibility options
+let &cpo = s:save_cpo
+
diff --git a/files/vim/plugin/plugin/rng.vim b/files/vim/plugin/plugin/rng.vim
new file mode 100644
index 0000000..51c9991
--- /dev/null
+++ b/files/vim/plugin/plugin/rng.vim
@@ -0,0 +1,83 @@
+" George Marsaglia's Multiply-with-carry Random Number Generator {{{
+" Modified to work within Vim's semantics
+let s:m_w = 1 + getpid()
+let s:m_z = localtime()
+
+" not sure of the wisdom of generating a full 32-bit RN here
+" and then using abs() on the sucker. Feedback welcome.
+function! RandomNumber(...)
+ if a:0 == 0
+ let s:m_z = (36969 * and(s:m_z, 0xffff)) + (s:m_z / 65536)
+ let s:m_w = (18000 * and(s:m_w, 0xffff)) + (s:m_w / 65536)
+ return (s:m_z * 65536) + s:m_w " 32-bit result
+ elseif a:0 == 1 " We return a number in [0, a:1] or [a:1, 0]
+ return a:1 < 0 ? RandomNumber(a:1,0) : RandomNumber(0,a:1)
+ else " if a:2 >= 2
+ return abs(RandomNumber()) % (abs(a:2 - a:1) + 1) + a:1
+ endif
+endfunction
+" end RNG }}}
+
+" RandomChar(base, cap)
+" base : the lowest char number desired
+" cap : the highest char number desired
+" Defaults to ASCII characters in the range
+" 33-126 (!-~)
+" But it's capable of much wider character tables
+function! RandomChar(...)
+ let base = 33
+ let cap = 126
+ if a:0 > 0
+ let base = a:1
+ endif
+ if a:0 > 1
+ let cap = a:2
+ endif
+ return nr2char(RandomNumber(base, cap))
+endfunction
+
+function! RandomCharsInSet(length, set)
+ let from = join(map(range(len(a:set)), 'nr2char(char2nr("a")+v:val)'), '')
+ let to = join(a:set, '')
+ return map(RandomChars(a:length, 97, 96+len(a:set)), 'tr(v:val, from, to)')
+endfunction
+
+function! RandomChars(length, ...)
+ let args = []
+ if a:0 > 0
+ if type(a:1) == type([])
+ let args = a:1
+ else
+ let args = a:000
+ endif
+ endif
+ return map(repeat([0], a:length), 'call("RandomChar", args)')
+endfunction
+
+function! RandomString(length, ...)
+ let args = []
+ if a:0 > 0
+ if type(a:1) == type([])
+ let args = a:1
+ else
+ let args = a:000
+ endif
+ endif
+ return join(call('RandomChars', [a:length, args]), '')
+endfunction
+
+let s:chars = '! " # $ % & '' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~'
+let s:charlist = split(s:chars, ' ')
+
+function! RandomCharFromRegex(regex, ...)
+ let charlist = a:0 ? split(a:1, '\zs') : copy(s:charlist)
+ call filter(charlist, 'v:val =~ a:regex')
+ return charlist[RandomNumber(0, len(charlist) - 1)]
+endfunction
+
+function! RandomStringFromRegex(regex, lenght, ...)
+ let charlist = a:0 ? split(a:1, '\zs') : copy(s:charlist)
+ call filter(charlist, 'v:val =~ a:regex')
+ let len = len(charlist) - 1
+ return join(map(range(a:lenght), 'charlist[RandomNumber(0, len)]'), '')
+endfunction