From 7e63e40b3a47e3f77575ec0e96532855e394dfab Mon Sep 17 00:00:00 2001 From: Luke Smith Date: Mon, 5 Nov 2018 19:57:28 -0500 Subject: [PATCH] switch to plugged for vim plugins --- .Renviron | 1 - .vim/autoload/pathogen.vim | 289 -- .vim/autoload/plug.vim | 2526 +++++++++++++++++ .vim/bundle/goyo.vim/README.md | 130 - .vim/bundle/goyo.vim/autoload/goyo.vim | 447 --- .vim/bundle/goyo.vim/plugin/goyo.vim | 24 - .vim/bundle/vim-multiple-cursors/.rspec | 2 - .vim/bundle/vim-multiple-cursors/.travis.yml | 11 - .vim/bundle/vim-multiple-cursors/CHANGELOG.md | 109 - .../vim-multiple-cursors/CONTRIBUTING.md | 23 - .vim/bundle/vim-multiple-cursors/Gemfile | 4 - .vim/bundle/vim-multiple-cursors/Gemfile.lock | 30 - .../vim-multiple-cursors/MIT-LICENSE.txt | 20 - .vim/bundle/vim-multiple-cursors/README.md | 247 -- .vim/bundle/vim-multiple-cursors/Rakefile | 11 - .../autoload/multiple_cursors.vim | 1256 -------- .../doc/multiple_cursors.txt | 253 -- .vim/bundle/vim-multiple-cursors/doc/tags | 25 - .../plugin/multiple_cursors.vim | 89 - .../spec/benchmark_spec.rb | 142 - .../spec/multiple_cursors_spec.rb | 817 ------ .../vim-multiple-cursors/spec/spec_helper.rb | 25 - .vim/bundle/vim-surround/README.markdown | 97 - .vim/bundle/vim-surround/doc/surround.txt | 207 -- .vim/bundle/vim-surround/doc/tags | 18 - .vim/bundle/vim-surround/plugin/surround.vim | 598 ---- .vim/bundle/wal.vim/LICENSE.md | 9 - .vim/bundle/wal.vim/README.md | 15 - .../wal.vim/autoload/airline/themes/wal.vim | 62 - .vim/bundle/wal.vim/colors/wal.vim | 193 -- .vim/luke/deadkeys.vim | 260 -- .vim/luke/ipa.vim | 186 -- .vim/luke/prose.vim | 38 - .vim/plugin/dragvisuals.vim | 345 --- .vim/plugin/vmath.vim | 152 - .vimrc | 40 +- 36 files changed, 2545 insertions(+), 6156 deletions(-) delete mode 100644 .vim/autoload/pathogen.vim create mode 100644 .vim/autoload/plug.vim delete mode 100644 .vim/bundle/goyo.vim/README.md delete mode 100644 .vim/bundle/goyo.vim/autoload/goyo.vim delete mode 100644 .vim/bundle/goyo.vim/plugin/goyo.vim delete mode 100644 .vim/bundle/vim-multiple-cursors/.rspec delete mode 100644 .vim/bundle/vim-multiple-cursors/.travis.yml delete mode 100644 .vim/bundle/vim-multiple-cursors/CHANGELOG.md delete mode 100644 .vim/bundle/vim-multiple-cursors/CONTRIBUTING.md delete mode 100644 .vim/bundle/vim-multiple-cursors/Gemfile delete mode 100644 .vim/bundle/vim-multiple-cursors/Gemfile.lock delete mode 100644 .vim/bundle/vim-multiple-cursors/MIT-LICENSE.txt delete mode 100644 .vim/bundle/vim-multiple-cursors/README.md delete mode 100644 .vim/bundle/vim-multiple-cursors/Rakefile delete mode 100644 .vim/bundle/vim-multiple-cursors/autoload/multiple_cursors.vim delete mode 100644 .vim/bundle/vim-multiple-cursors/doc/multiple_cursors.txt delete mode 100644 .vim/bundle/vim-multiple-cursors/doc/tags delete mode 100644 .vim/bundle/vim-multiple-cursors/plugin/multiple_cursors.vim delete mode 100644 .vim/bundle/vim-multiple-cursors/spec/benchmark_spec.rb delete mode 100644 .vim/bundle/vim-multiple-cursors/spec/multiple_cursors_spec.rb delete mode 100644 .vim/bundle/vim-multiple-cursors/spec/spec_helper.rb delete mode 100644 .vim/bundle/vim-surround/README.markdown delete mode 100644 .vim/bundle/vim-surround/doc/surround.txt delete mode 100644 .vim/bundle/vim-surround/doc/tags delete mode 100644 .vim/bundle/vim-surround/plugin/surround.vim delete mode 100755 .vim/bundle/wal.vim/LICENSE.md delete mode 100644 .vim/bundle/wal.vim/README.md delete mode 100644 .vim/bundle/wal.vim/autoload/airline/themes/wal.vim delete mode 100755 .vim/bundle/wal.vim/colors/wal.vim delete mode 100644 .vim/luke/deadkeys.vim delete mode 100644 .vim/luke/ipa.vim delete mode 100644 .vim/luke/prose.vim delete mode 100644 .vim/plugin/dragvisuals.vim delete mode 100644 .vim/plugin/vmath.vim diff --git a/.Renviron b/.Renviron index f43bae9..d2e1be9 100644 --- a/.Renviron +++ b/.Renviron @@ -1,2 +1 @@ - R_LIBS_USER = ~/.R/library diff --git a/.vim/autoload/pathogen.vim b/.vim/autoload/pathogen.vim deleted file mode 100644 index dbe07f0..0000000 --- a/.vim/autoload/pathogen.vim +++ /dev/null @@ -1,289 +0,0 @@ -" pathogen.vim - path option manipulation -" Maintainer: Tim Pope -" Version: 2.4 - -" Install in ~/.vim/autoload (or ~\vimfiles\autoload). -" -" For management of individually installed plugins in ~/.vim/bundle (or -" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your -" .vimrc is the only other setup necessary. -" -" The API is documented inline below. - -if exists("g:loaded_pathogen") || &cp - finish -endif -let g:loaded_pathogen = 1 - -" Point of entry for basic default usage. Give a relative path to invoke -" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke -" pathogen#surround(). Curly braces are expanded with pathogen#expand(): -" "bundle/{}" finds all subdirectories inside "bundle" inside all directories -" in the runtime path. -function! pathogen#infect(...) abort - for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}'] - if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]' - call pathogen#surround(path) - elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)' - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#surround(path . '/{}') - elseif path =~# '[{}*]' - call pathogen#interpose(path) - else - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#interpose(path . '/{}') - endif - endfor - call pathogen#cycle_filetype() - if pathogen#is_disabled($MYVIMRC) - return 'finish' - endif - return '' -endfunction - -" Split a path into a list. -function! pathogen#split(path) abort - if type(a:path) == type([]) | return a:path | endif - if empty(a:path) | return [] | endif - let split = split(a:path,'\\\@]','\\&','') - endif -endfunction - -" Like findfile(), but hardcoded to use the runtimepath. -function! pathogen#runtime_findfile(file,count) abort - let rtp = pathogen#join(1,pathogen#split(&rtp)) - let file = findfile(a:file,rtp,a:count) - if file ==# '' - return '' - else - return fnamemodify(file,':p') - endif -endfunction - -" Section: Deprecated - -function! s:warn(msg) abort - echohl WarningMsg - echomsg a:msg - echohl NONE -endfunction - -" Prepend all subdirectories of path to the rtp, and append all 'after' -" directories in those subdirectories. Deprecated. -function! pathogen#runtime_prepend_subdirectories(path) abort - call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')') - return pathogen#surround(a:path . pathogen#slash() . '{}') -endfunction - -function! pathogen#incubate(...) abort - let name = a:0 ? a:1 : 'bundle/{}' - call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')') - return pathogen#interpose(name) -endfunction - -" Deprecated alias for pathogen#interpose(). -function! pathogen#runtime_append_all_bundles(...) abort - if a:0 - call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')') - else - call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()') - endif - return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}') -endfunction - -" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/.vim/autoload/plug.vim b/.vim/autoload/plug.vim new file mode 100644 index 0000000..4e05630 --- /dev/null +++ b/.vim/autoload/plug.vim @@ -0,0 +1,2526 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]).'/**' + for dir in ['ftdetect', 'ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if s:is_win + set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1 + elseif a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'batchfile': (s:is_win && (s:nvim || s:vim8)) ? tempname().'.bat' : '', + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd + if !empty(job.batchfile) + call writefile(["@echo off\r", cmd . "\r"], job.batchfile) + let cmd = job.batchfile + endif + let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], cmd) + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + if has_key(job, 'batchfile') && !empty(job.batchfile) + call delete(job.batchfile) + endif + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg) + let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g') + let escaped = substitute(escaped, '%', '%%', 'g') + let escaped = substitute(escaped, '"', '\\^&', 'g') + let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g') + return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"' +endfunction + +function! s:shellesc(arg) + if &shell =~# 'cmd.exe$' + return s:shellesc_cmd(a:arg) + endif + return shellescape(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = 'git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 's:shellesc(v:val)')) + if has_key(v, 'rtp') + let cmd .= ' -- '.s:shellesc(v.rtp) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@` + `>`, `<`, `+`, -`-` keys. - -### Dimension expression - -The expected format of a dimension expression is -`[WIDTH][XOFFSET][x[HEIGHT][YOFFSET]]`. `XOFFSET` and `YOFFSET` should be -prefixed by `+` or `-`. Each component can be given in percentage. - -```vim -" Width -Goyo 120 - -" Height -Goyo x30 - -" Both -Goyo 120x30 - -" In percentage -Goyo 120x50% - -" With offsets -Goyo 50%+25%x50%-25% -``` - -Configuration -------------- - -- `g:goyo_width` (default: 80) -- `g:goyo_height` (default: 85%) -- `g:goyo_linenr` (default: 0) - -### Callbacks - -By default, [vim-airline](https://github.com/bling/vim-airline), -[vim-powerline](https://github.com/Lokaltog/vim-powerline), -[powerline](https://github.com/Lokaltog/powerline), -[lightline.vim](https://github.com/itchyny/lightline.vim), -[vim-signify](https://github.com/mhinz/vim-signify), -and [vim-gitgutter](https://github.com/airblade/vim-gitgutter) are temporarily -disabled while in Goyo mode. - -If you have other plugins that you want to disable/enable, or if you want to -change the default settings of Goyo window, you can set up custom routines -to be triggered on `GoyoEnter` and `GoyoLeave` events. - -```vim -function! s:goyo_enter() - silent !tmux set status off - silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z - set noshowmode - set noshowcmd - set scrolloff=999 - Limelight - " ... -endfunction - -function! s:goyo_leave() - silent !tmux set status on - silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z - set showmode - set showcmd - set scrolloff=5 - Limelight! - " ... -endfunction - -autocmd! User GoyoEnter nested call goyo_enter() -autocmd! User GoyoLeave nested call goyo_leave() -``` - -More examples can be found here: -[Customization](https://github.com/junegunn/goyo.vim/wiki/Customization) - -Inspiration ------------ - -- [LiteDFM](https://github.com/bilalq/lite-dfm) -- [VimRoom](http://projects.mikewest.org/vimroom/) - -Pros. ------ - -1. Works well with splits. Doesn't mess up with the current window arrangement -1. Works well with popular statusline plugins -1. Prevents accessing the empty windows around the central buffer -1. Can be closed with any of `:q[uit]`, `:clo[se]`, `:tabc[lose]`, or `:Goyo` -1. Can dynamically change the width of the window -1. Adjusts its colors when color scheme is changed -1. Realigns the window when the terminal (or window) is resized or when the size - of the font is changed -1. Correctly hides colorcolumns and Emojis in statusline -1. Highly customizable with callbacks - -License -------- - -MIT - diff --git a/.vim/bundle/goyo.vim/autoload/goyo.vim b/.vim/bundle/goyo.vim/autoload/goyo.vim deleted file mode 100644 index 735c950..0000000 --- a/.vim/bundle/goyo.vim/autoload/goyo.vim +++ /dev/null @@ -1,447 +0,0 @@ -" Copyright (c) 2015 Junegunn Choi -" -" MIT License -" -" Permission is hereby granted, free of charge, to any person obtaining -" a copy of this software and associated documentation files (the -" "Software"), to deal in the Software without restriction, including -" without limitation the rights to use, copy, modify, merge, publish, -" distribute, sublicense, and/or sell copies of the Software, and to -" permit persons to whom the Software is furnished to do so, subject to -" the following conditions: -" -" The above copyright notice and this permission notice shall be -" included in all copies or substantial portions of the Software. -" -" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -let s:cpo_save = &cpo -set cpo&vim - -function! s:const(val, min, max) - return min([max([a:val, a:min]), a:max]) -endfunction - -function! s:get_color(group, attr) - return synIDattr(synIDtrans(hlID(a:group)), a:attr) -endfunction - -function! s:set_color(group, attr, color) - let gui = a:color =~ '^#' - execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color) -endfunction - -function! s:blank(repel) - if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1 - \ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3 - call s:goyo_off() - endif - execute 'wincmd' a:repel -endfunction - -function! s:init_pad(command) - execute a:command - - setlocal buftype=nofile bufhidden=wipe nomodifiable nobuflisted noswapfile - \ nonu nocursorline nocursorcolumn winfixwidth winfixheight statusline=\ - if exists('&rnu') - setlocal nornu - endif - if exists('&colorcolumn') - setlocal colorcolumn= - endif - let bufnr = winbufnr(0) - - execute winnr('#') . 'wincmd w' - return bufnr -endfunction - -function! s:setup_pad(bufnr, vert, size, repel) - let win = bufwinnr(a:bufnr) - execute win . 'wincmd w' - execute (a:vert ? 'vertical ' : '') . 'resize ' . max([0, a:size]) - augroup goyop - execute 'autocmd WinEnter,CursorMoved nested call s:blank("'.a:repel.'")' - autocmd WinLeave call s:hide_statusline() - augroup END - - " To hide scrollbars of pad windows in GVim - let diff = winheight(0) - line('$') - (has('gui_running') ? 2 : 0) - if diff > 0 - setlocal modifiable - call append(0, map(range(1, diff), '""')) - normal! gg - setlocal nomodifiable - endif - execute winnr('#') . 'wincmd w' -endfunction - -function! s:resize_pads() - augroup goyop - autocmd! - augroup END - - let t:goyo_dim.width = s:const(t:goyo_dim.width, 2, &columns) - let t:goyo_dim.height = s:const(t:goyo_dim.height, 2, &lines) - - let vmargin = max([0, (&lines - t:goyo_dim.height) / 2 - 1]) - let yoff = s:const(t:goyo_dim.yoff, - vmargin, vmargin) - let top = vmargin + yoff - let bot = vmargin - yoff - 1 - call s:setup_pad(t:goyo_pads.t, 0, top, 'j') - call s:setup_pad(t:goyo_pads.b, 0, bot, 'k') - - let nwidth = max([len(string(line('$'))) + 1, &numberwidth]) - let width = t:goyo_dim.width + (&number ? nwidth : 0) - let hmargin = max([0, (&columns - width) / 2 - 1]) - let xoff = s:const(t:goyo_dim.xoff, - hmargin, hmargin) - call s:setup_pad(t:goyo_pads.l, 1, hmargin + xoff, 'l') - call s:setup_pad(t:goyo_pads.r, 1, hmargin - xoff, 'h') -endfunction - -function! s:tranquilize() - let bg = s:get_color('Normal', 'bg#') - for grp in ['NonText', 'FoldColumn', 'ColorColumn', 'VertSplit', - \ 'StatusLine', 'StatusLineNC', 'SignColumn'] - " -1 on Vim / '' on GVim - if bg == -1 || empty(bg) - call s:set_color(grp, 'fg', get(g:, 'goyo_bg', 'black')) - call s:set_color(grp, 'bg', 'NONE') - else - call s:set_color(grp, 'fg', bg) - call s:set_color(grp, 'bg', bg) - endif - call s:set_color(grp, '', 'NONE') - endfor -endfunction - -function! s:hide_statusline() - setlocal statusline=\ -endfunction - -function! s:hide_linenr() - if !get(g:, 'goyo_linenr', 0) - setlocal nonu - if exists('&rnu') - setlocal nornu - endif - endif - if exists('&colorcolumn') - setlocal colorcolumn= - endif -endfunction - -function! s:maps_nop() - let mapped = filter(['R', 'H', 'J', 'K', 'L', '|', '_'], - \ "empty(maparg(\"\\".v:val, 'n'))") - for c in mapped - execute 'nnoremap '.escape(c, '|').' ' - endfor - return mapped -endfunction - -function! s:maps_resize() - let commands = { - \ '=': ':let t:goyo_dim = parse_arg(t:goyo_dim_expr) call resize_pads()', - \ '>': ':let t:goyo_dim.width = winwidth(0) + 2 * v:count1 call resize_pads()', - \ '<': ':let t:goyo_dim.width = winwidth(0) - 2 * v:count1 call resize_pads()', - \ '+': ':let t:goyo_dim.height += 2 * v:count1 call resize_pads()', - \ '-': ':let t:goyo_dim.height -= 2 * v:count1 call resize_pads()' - \ } - let mapped = filter(keys(commands), "empty(maparg(\"\\".v:val, 'n'))") - for c in mapped - execute 'nnoremap '.c.' '.commands[c] - endfor - return mapped -endfunction - -nnoremap (goyo-resize) :call resize_pads() - -function! s:goyo_on(dim) - let dim = s:parse_arg(a:dim) - if empty(dim) - return - endif - - let s:orig_tab = tabpagenr() - let settings = - \ { 'laststatus': &laststatus, - \ 'showtabline': &showtabline, - \ 'fillchars': &fillchars, - \ 'winminwidth': &winminwidth, - \ 'winwidth': &winwidth, - \ 'winminheight': &winminheight, - \ 'winheight': &winheight, - \ 'ruler': &ruler, - \ 'sidescroll': &sidescroll, - \ 'sidescrolloff': &sidescrolloff - \ } - - " New tab - tab split - - let t:goyo_master = winbufnr(0) - let t:goyo_dim = dim - let t:goyo_dim_expr = a:dim - let t:goyo_pads = {} - let t:goyo_revert = settings - let t:goyo_maps = extend(s:maps_nop(), s:maps_resize()) - if has('gui_running') - let t:goyo_revert.guioptions = &guioptions - endif - - " vim-gitgutter - let t:goyo_disabled_gitgutter = get(g:, 'gitgutter_enabled', 0) - if t:goyo_disabled_gitgutter - silent! GitGutterDisable - endif - - " vim-signify - let t:goyo_disabled_signify = exists('b:sy') && b:sy.active - if t:goyo_disabled_signify - SignifyToggle - endif - - " vim-airline - let t:goyo_disabled_airline = exists('#airline') - if t:goyo_disabled_airline - AirlineToggle - endif - - " vim-powerline - let t:goyo_disabled_powerline = exists('#PowerlineMain') - if t:goyo_disabled_powerline - augroup PowerlineMain - autocmd! - augroup END - augroup! PowerlineMain - endif - - " lightline.vim - let t:goyo_disabled_lightline = exists('#lightline') - if t:goyo_disabled_lightline - silent! call lightline#disable() - endif - - call s:hide_linenr() - " Global options - let &winheight = max([&winminheight, 1]) - set winminheight=1 - set winheight=1 - set winminwidth=1 winwidth=1 - set laststatus=0 - set showtabline=0 - set noruler - set fillchars+=vert:\ - set fillchars+=stl:\ - set fillchars+=stlnc:\ - set sidescroll=1 - set sidescrolloff=0 - - " Hide left-hand scrollbars - if has('gui_running') - set guioptions-=l - set guioptions-=L - endif - - let t:goyo_pads.l = s:init_pad('vertical topleft new') - let t:goyo_pads.r = s:init_pad('vertical botright new') - let t:goyo_pads.t = s:init_pad('topleft new') - let t:goyo_pads.b = s:init_pad('botright new') - - call s:resize_pads() - call s:tranquilize() - - augroup goyo - autocmd! - autocmd TabLeave * call s:goyo_off() - autocmd VimResized * call s:resize_pads() - autocmd ColorScheme * call s:tranquilize() - autocmd BufWinEnter * call s:hide_linenr() | call s:hide_statusline() - autocmd WinEnter,WinLeave * call s:hide_statusline() - if has('nvim') - autocmd TermClose * call feedkeys("\(goyo-resize)") - endif - augroup END - - call s:hide_statusline() - if exists('g:goyo_callbacks[0]') - call g:goyo_callbacks[0]() - endif - if exists('#User#GoyoEnter') - doautocmd User GoyoEnter - endif -endfunction - -function! s:goyo_off() - if !exists('#goyo') - return - endif - - " Oops, not this tab - if !exists('t:goyo_revert') - return - endif - - " Clear auto commands - augroup goyo - autocmd! - augroup END - augroup! goyo - augroup goyop - autocmd! - augroup END - augroup! goyop - - for c in t:goyo_maps - execute 'nunmap '.escape(c, '|') - endfor - - let goyo_revert = t:goyo_revert - let goyo_disabled_gitgutter = t:goyo_disabled_gitgutter - let goyo_disabled_signify = t:goyo_disabled_signify - let goyo_disabled_airline = t:goyo_disabled_airline - let goyo_disabled_powerline = t:goyo_disabled_powerline - let goyo_disabled_lightline = t:goyo_disabled_lightline - let goyo_orig_buffer = t:goyo_master - let [line, col] = [line('.'), col('.')] - - if tabpagenr() == 1 - tabnew - normal! gt - bd - endif - tabclose - execute 'normal! '.s:orig_tab.'gt' - if winbufnr(0) == goyo_orig_buffer - " Doesn't work if window closed with `q` - execute printf('normal! %dG%d|', line, col) - endif - - let wmw = remove(goyo_revert, 'winminwidth') - let ww = remove(goyo_revert, 'winwidth') - let &winwidth = ww - let &winminwidth = wmw - let wmh = remove(goyo_revert, 'winminheight') - let wh = remove(goyo_revert, 'winheight') - let &winheight = max([wmh, 1]) - let &winminheight = wmh - let &winheight = wh - - for [k, v] in items(goyo_revert) - execute printf('let &%s = %s', k, string(v)) - endfor - execute 'colo '. get(g:, 'colors_name', 'default') - - if goyo_disabled_gitgutter - silent! GitGutterEnable - endif - - if goyo_disabled_signify - silent! if !b:sy.active - SignifyToggle - endif - endif - - if goyo_disabled_airline && !exists('#airline') - AirlineToggle - " For some reason, Airline requires two refreshes to avoid display - " artifacts - silent! AirlineRefresh - silent! AirlineRefresh - endif - - if goyo_disabled_powerline && !exists('#PowerlineMain') - doautocmd PowerlineStartup VimEnter - silent! PowerlineReloadColorscheme - endif - - if goyo_disabled_lightline - silent! call lightline#enable() - endif - - if exists('#Powerline') - doautocmd Powerline ColorScheme - endif - - if exists('g:goyo_callbacks[1]') - call g:goyo_callbacks[1]() - endif - if exists('#User#GoyoLeave') - doautocmd User GoyoLeave - endif -endfunction - -function! s:relsz(expr, limit) - if a:expr !~ '%$' - return str2nr(a:expr) - endif - return a:limit * str2nr(a:expr[:-2]) / 100 -endfunction - -function! s:parse_arg(arg) - if exists('g:goyo_height') || !exists('g:goyo_margin_top') && !exists('g:goyo_margin_bottom') - let height = s:relsz(get(g:, 'goyo_height', '85%'), &lines) - let yoff = 0 - else - let top = max([0, s:relsz(get(g:, 'goyo_margin_top', 4), &lines)]) - let bot = max([0, s:relsz(get(g:, 'goyo_margin_bottom', 4), &lines)]) - let height = &lines - top - bot - let yoff = top - bot - endif - - let dim = { 'width': s:relsz(get(g:, 'goyo_width', 80), &columns), - \ 'height': height, - \ 'xoff': 0, - \ 'yoff': yoff } - if empty(a:arg) - return dim - endif - let parts = matchlist(a:arg, '^\s*\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\%(x\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\)\?\s*$') - if empty(parts) - echohl WarningMsg - echo 'Invalid dimension expression: '.a:arg - echohl None - return {} - endif - if !empty(parts[1]) | let dim.width = s:relsz(parts[1], &columns) | endif - if !empty(parts[2]) | let dim.xoff = s:relsz(parts[2], &columns) | endif - if !empty(parts[3]) | let dim.height = s:relsz(parts[3], &lines) | endif - if !empty(parts[4]) | let dim.yoff = s:relsz(parts[4], &lines) | endif - return dim -endfunction - -function! goyo#execute(bang, dim) - if a:bang - if exists('#goyo') - call s:goyo_off() - endif - else - if exists('#goyo') == 0 - call s:goyo_on(a:dim) - elseif !empty(a:dim) - if winnr('$') < 5 - call s:goyo_off() - return goyo#execute(a:bang, a:dim) - endif - let dim = s:parse_arg(a:dim) - if !empty(dim) - let t:goyo_dim = dim - let t:goyo_dim_expr = a:dim - call s:resize_pads() - endif - else - call s:goyo_off() - end - end -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - diff --git a/.vim/bundle/goyo.vim/plugin/goyo.vim b/.vim/bundle/goyo.vim/plugin/goyo.vim deleted file mode 100644 index af4793a..0000000 --- a/.vim/bundle/goyo.vim/plugin/goyo.vim +++ /dev/null @@ -1,24 +0,0 @@ -" Copyright (c) 2015 Junegunn Choi -" -" MIT License -" -" Permission is hereby granted, free of charge, to any person obtaining -" a copy of this software and associated documentation files (the -" "Software"), to deal in the Software without restriction, including -" without limitation the rights to use, copy, modify, merge, publish, -" distribute, sublicense, and/or sell copies of the Software, and to -" permit persons to whom the Software is furnished to do so, subject to -" the following conditions: -" -" The above copyright notice and this permission notice shall be -" included in all copies or substantial portions of the Software. -" -" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -command! -nargs=? -bar -bang Goyo call goyo#execute(0, ) diff --git a/.vim/bundle/vim-multiple-cursors/.rspec b/.vim/bundle/vim-multiple-cursors/.rspec deleted file mode 100644 index 397921f..0000000 --- a/.vim/bundle/vim-multiple-cursors/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---color ---format d diff --git a/.vim/bundle/vim-multiple-cursors/.travis.yml b/.vim/bundle/vim-multiple-cursors/.travis.yml deleted file mode 100644 index cfb198a..0000000 --- a/.vim/bundle/vim-multiple-cursors/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -sudo: false -language: ruby - -addons: - apt: - packages: - - vim-gtk - -before_script: - - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" diff --git a/.vim/bundle/vim-multiple-cursors/CHANGELOG.md b/.vim/bundle/vim-multiple-cursors/CHANGELOG.md deleted file mode 100644 index 265b39f..0000000 --- a/.vim/bundle/vim-multiple-cursors/CHANGELOG.md +++ /dev/null @@ -1,109 +0,0 @@ -## 2.2 (06/10/2013) -Bugfixes: - - Fix plugin break in PASTE mode. This fixes #44. - -## 2.1 (04/26/2013) - -Bugfixes: - - Fix 1 regression where cursors could potentially get out of sync in insert mode - -Features: - - Added some logic to debug latency. Fanning out to 30 cursors in insert mode with my vimrc took over 300ms. It's like than 20ms with a plain vimrc. Need to debug what setting is causing the slowing down in insert mode and inform users. - -## 2.0 (04/24/2013) - -Bugfixes: - - Fix inconsistent undo behavior. Changes made in multicursor insert mode are now undone together. This fixes #22. - - Single key commands that do not terminate properly no longer cause ghostly cursors to linger on screen. An error message is now displayed informing the user the number of cursor locations that the input cannot be properly played back at. This fixes #28. - -## 1.16 (04/23/2013) - -Features: - - Add integration tests using vimrunner. Hook up travis-ci to run continous integration on commit. - -## 1.15 (04/22/2013) - -Bugfixes: - - Fix plugin causing error bell. This fixes #29. - -## 1.14 (04/22/2013) - -Features: - - Allow users to separate start key from next key. (credit: @xanderman) - -## 1.13 (04/22/2013) - -Bugfixes: - - Add support for switching to visual line mode from inside multicursor mode - - Fix highlight issue where extra character at end of line is highlighted for visual selections covering more than 2 lines. - -## 1.12 (04/19/2013) - -Bugfixes: - - Fix tab character causing highlight errors. This fixes #18 and fixes #32 - -## 1.11 (04/18/2013) - -Bugfixes: - - Fix regression where `C-n` doesn't exhibit correct behavior when all matches have been found - - Clear echo messages when a new input is received - -## 1.10 (04/17/2013) - -Bugfixes: - - `O` works now in normal mode. This fixes #24 - - Turn on `lazyredraw` during multicursor mode to prevent the sluggish screen redraws - -Features: - - Add command **MultipleCursorsFind** to add multiple virtual cursors using regexp. This closes #20 - -## 1.9 (04/17/2013) - -Bugfixes: - - Fix starting multicursor mode in visual line mode. This fixes #25 - - Major refactoring to avoid getting in and out of visual mode as much as possible - -## 1.8 (04/16/2013) - -Bugfixes: - - Fix regression that causes call stack to explode with too many cursors - -## 1.7 (04/15/2013) - -Bugfixes: - - Finally fix the annoying highlighting problem when the last virtual cursor is on the last character of the line. The solution is a hack, but it should be harmless - -## 1.6 (04/15/2013) - -Bugfixes: - - Stop chaining dictionary function calls. This fixes #10 and #11 - -## 1.5 (04/15/2013) - -Bugfixes: - - Exit Vim's visual mode before waiting for user's next input. This fixes #14 - -## 1.4 (04/14/2013) - -Bugfixes: - - Don't use clearmatches(). It clears highlighting from other plugins. This fixes #13 - -## 1.3 (04/14/2013) - -Bugfixes: - - Change mapping from using expression-quote syntax to using raw strings - -## 1.2 (04/14/2013) - -Bugfixes: - - Restore view when exiting from multicursor mode. This fixes #5 - - Remove the unnecessary user level mapping for 'prev' and 'skip' in visual mode, since we can purely detect those keys from multicursor mode - -## 1.1 (04/14/2013) - -Bugfixes: - - Stop hijacking escape key in normal mode. This fixes #1, #2, and #3 - -## 1.0 (04/13/2013) - -Initial release diff --git a/.vim/bundle/vim-multiple-cursors/CONTRIBUTING.md b/.vim/bundle/vim-multiple-cursors/CONTRIBUTING.md deleted file mode 100644 index 878aa59..0000000 --- a/.vim/bundle/vim-multiple-cursors/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -# Problems summary - -## Expected - -## Environment Information - * OS: - * Neovim/Vim/Gvim version: - -## Provide a minimal .vimrc with less than 50 lines - - " Your minimal.vimrc - -## Generate a logfile if appropriate - - 1. export NVIM_PYTHON_LOG_FILE=/tmp/log - 2. export NVIM_PYTHON_LOG_LEVEL=DEBUG - 3. nvim -u minimal.vimrc - 4. recreate your issue - 5. cat /tmp/log_{PID} - -## Screen shot (if possible) - -## Upload the log file diff --git a/.vim/bundle/vim-multiple-cursors/Gemfile b/.vim/bundle/vim-multiple-cursors/Gemfile deleted file mode 100644 index 7658cb9..0000000 --- a/.vim/bundle/vim-multiple-cursors/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' -gem 'vimrunner' -gem 'rake' -gem 'rspec' diff --git a/.vim/bundle/vim-multiple-cursors/Gemfile.lock b/.vim/bundle/vim-multiple-cursors/Gemfile.lock deleted file mode 100644 index e833b24..0000000 --- a/.vim/bundle/vim-multiple-cursors/Gemfile.lock +++ /dev/null @@ -1,30 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - diff-lcs (1.2.5) - rake (10.4.2) - rspec (3.4.0) - rspec-core (~> 3.4.0) - rspec-expectations (~> 3.4.0) - rspec-mocks (~> 3.4.0) - rspec-core (3.4.1) - rspec-support (~> 3.4.0) - rspec-expectations (3.4.0) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.4.0) - rspec-mocks (3.4.0) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.4.0) - rspec-support (3.4.1) - vimrunner (0.3.1) - -PLATFORMS - ruby - -DEPENDENCIES - rake - rspec - vimrunner - -BUNDLED WITH - 1.10.6 diff --git a/.vim/bundle/vim-multiple-cursors/MIT-LICENSE.txt b/.vim/bundle/vim-multiple-cursors/MIT-LICENSE.txt deleted file mode 100644 index dade7aa..0000000 --- a/.vim/bundle/vim-multiple-cursors/MIT-LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2013 Terry Ma - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.vim/bundle/vim-multiple-cursors/README.md b/.vim/bundle/vim-multiple-cursors/README.md deleted file mode 100644 index 8ed8c11..0000000 --- a/.vim/bundle/vim-multiple-cursors/README.md +++ /dev/null @@ -1,247 +0,0 @@ -# vim-multiple-cursors -[![Build Status](https://travis-ci.org/terryma/vim-multiple-cursors.svg)](https://travis-ci.org/terryma/vim-multiple-cursors) -[![Issue Stats](http://issuestats.com/github/terryma/vim-multiple-cursors/badge/pr?style=flat)](http://issuestats.com/github/terryma/vim-multiple-cursors) -[![Issue Stats](http://issuestats.com/github/terryma/vim-multiple-cursors/badge/issue?style=flat)](http://issuestats.com/github/terryma/vim-multiple-cursors) -## Contents - - [About](#about) - - [Features](#features) - - [Installation](#installation) - - [Quick Start](#quick-start) - - [Mapping](#mapping) - - [Settings](#settings) - - [Interactions with other plugins](#interactions-with-other-plugins) - - [Highlight](#highlight) - - *[FAQ](#faq)* - - *[Known issues](#known-issues)* - - *[Issue creation requirements](#issue-creation-requirements)* - - [Changelog](#changelog) - - [Contributing](#contributing) - - [Credit](#credit) - -### Contributors -- [eapache](https://github.com/eapache) -- [aschrab](https://github.com/aschrab) -- [kristijanhusak](https://github.com/kristijanhusak) -- [faceleg](https://github.com/faceleg) - -## About -[There](https://github.com/paradigm/vim-multicursor) [have](https://github.com/felixr/vim-multiedit) [been](https://github.com/hlissner/vim-multiedit) [many](https://github.com/adinapoli/vim-markmultiple) [attempts](https://github.com/AndrewRadev/multichange.vim) at bringing Sublime Text's awesome [multiple selection][sublime-multiple-selection] feature into Vim, but none so far have been in my opinion a faithful port that is simplistic to use, yet powerful and intuitive enough for an existing Vim user. [vim-multiple-cursors] is yet another attempt at that. - -### It's great for quick refactoring -![Example1](assets/example1.gif?raw=true) - -Vim command sequence: `2Gfpcname` - -### Add a cursor to each line of your visual selection -![Example2](assets/example2.gif?raw=true) - -Vim command sequence: `2Gvipi"",vipJ$r]Idays = [` - -### Do it backwards too! This is not just a replay of the above gif :) -![Example3](assets/example3.gif?raw=true) - -Vim command sequence: `2Gdf[$r,0f,vc` - -### Add multiple cursors using regexes -![Example4](assets/example4.gif?raw=true) - -To see what keystrokes are used for the above examples, see [the wiki page](https://github.com/terryma/vim-multiple-cursors/wiki/Keystrokes-for-example-gifs). - -## Features -- Live update in Insert mode -- One key to rule it all! See [Quick Start](#quick-start) on what the key does in different scenarios -- Works in Normal, Insert, and Visual mode for any commands (including - multi-key commands, assuming you set `g:multicursor_insert_maps` and - `g:multicursor_normal_maps`; see Settings below for details) - -## Installation -Install using [Pathogen], [Vundle], [Neobundle], or your favorite Vim package manager. -Requires vim 7.4 or later for full functionality. - -## Quick Start -Out of the box, all you need to know is a single key `Ctrl-n`. Pressing the key in Normal mode highlights the current word under the cursor in Visual mode and places a virtual cursor at the end of it. Pressing it again finds the next occurrence and places another virtual cursor at the end of the visual selection. If you select multiple lines in Visual mode, pressing the key puts a virtual cursor at every line and leaves you in Normal mode. - -After you've marked all your locations with `Ctrl-n`, you can change the visual selection with normal Vim motion commands in Visual mode. You could go to Normal mode by pressing `v` and wield your motion commands there. Single key command to switch to Insert mode such as `c` or `s` from Visual mode or `i`, `a`, `I`, `A` in Normal mode should work without any issues. - -At any time, you can press `` to exit back to regular Vim. - -Two additional keys are also mapped: -- `Ctrl-p` in Visual mode will remove the current virtual cursor and go back to the previous virtual cursor location. This is useful if you are trigger happy with `Ctrl-n` and accidentally went too far. -- `Ctrl-x` in Visual mode will remove the current virtual cursor and skip to the next virtual cursor location. This is useful if you don't want the current selection to be a candidate to operate on later. - -You can also add multiple cursors using a regular expression. The command `MultipleCursorsFind` accepts a range and a pattern, and it will create a virtual cursor at the end of every match within the range. If no range is passed in, then it defaults to the entire buffer. - -**NOTE:** If at any time you have lingering cursors on screen, you can press `Ctrl-n` in Normal mode and it will remove all prior cursors before starting a new one. - -## Mapping -Out of the box, only the single key `Ctrl-n` is mapped in regular Vim's Normal mode and Visual mode to provide the functionality mentioned above. `Ctrl-n`, `Ctrl-p`, `Ctrl-x`, and `` are mapped in the special multicursor mode once you've added at least one virtual cursor to the buffer. If you don't like the plugin taking over your favorite key bindings, you can turn off the default with -```viml -let g:multi_cursor_use_default_mapping=0 -``` - -You can then map the 'next', 'previous', 'skip', and 'exit' keys like the following: -```viml -" Default mapping -let g:multi_cursor_next_key='' -let g:multi_cursor_prev_key='' -let g:multi_cursor_skip_key='' -let g:multi_cursor_quit_key='' -``` - -By default, the 'next' key is also used to enter multicursor mode. If you want to use a different key to start multicursor mode than for selecting the next location, do like the following: -```viml -" Map start key separately from next key -let g:multi_cursor_start_key='' -``` - -Note that when multicursor mode is started, it selects current word with boundaries, i.e. it behaves like `*`. If you want to avoid word boundaries in Normal mode (as `g*` does) but still have old behaviour up your sleeve, you can do the following: -```viml -let g:multi_cursor_start_key='' -let g:multi_cursor_start_word_key='g' -``` -In this configuration `` will start multicursor mode without word boundaries (but only in Normal mode, as it does not make much sense to use it in Visual mode). Old behaviour with word boundaries is still available using `g`. - -**IMPORTANT:** Please note that currently only single keystrokes and special keys can be mapped. This means that a mapping like `n` will NOT work correctly. For a list of special keys that are supported, see `help :key-notation` - -**NOTE:** Please make sure to always map something to `g:multi_cursor_quit_key`, otherwise you'll have a tough time quitting from multicursor mode. - -**NOTE:** Prior to version 1.3, the recommended way to map the keys is using the expression quote syntax in Vim, using something like `"\"` or `"\"` (see h: expr-quote). After 1.3, the recommended way is to use a raw string like above. If your key mappings don't appear to work, give the new syntax a try. - -You can also map your own keys to quit, if ``g:multi_cursor_quit_key`` won't work: - -``` -let g:multi_cursor_quit_key='' -nnoremap :call multiple_cursors#quit() -``` - -## Settings -Currently there are four additional global settings one can tweak: - -### ```g:multi_cursor_exit_from_visual_mode``` (Default: 1) -If set to 0, then pressing `g:multi_cursor_quit_key` in _Visual_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. - -### ```g:multi_cursor_exit_from_insert_mode``` (Default: 1) -If set to 0, then pressing `g:multi_cursor_quit_key` in _Insert_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. - -### ```g:multi_cursor_insert_maps``` (Default: `{}`) -Any key in this map (values are ignored) will cause multi-cursor _Insert_ mode -to pause for `timeoutlen` waiting for map completion just like normal vim. -Otherwise keys mapped in insert mode are ignored when multiple cursors are -active. For example, setting it to `{'\':1}` will make insert-mode mappings -beginning with the default leader key work in multi-cursor mode. You have to -manually set this because vim doesn't provide a way to see which keys _start_ -mappings. - -### ```g:multi_cursor_normal_maps``` (Default: see below) -Default value: `{'!':1, '@':1, '=':1, 'q':1, 'r':1, 't':1, 'T':1, 'y':1, '[':1, ']':1, '\':1, 'd':1, 'f':1, 'F':1, 'g':1, '"':1, 'z':1, 'c':1, 'm':1, '<':1, '>':1}` - -Any key in this map (values are ignored) will cause multi-cursor _Normal_ mode -to pause for map completion just like normal vim. Otherwise keys mapped in -normal mode will "fail to replay" when multiple cursors are active. For example, -changing it from `{}` to `{'d':1}` makes normal-mode mappings beginning with `d` -(such as `dw` to delete a word) work in multi-cursor mode. - -### ```g:multi_cursor_visual_maps``` (Default: see below) -Default value: `{'i':1, 'a':1, 'f':1, 'F':1, 't':1, 'T':1}` - -Any key in this map (values are ignored) will cause multi-cursor _Visual_ mode -to pause for map completion just like normal vim. Otherwise keys mapped in -visual mode will "fail to replay" when multiple cursors are active. For example, -changing it from `{}` to `{'i':1}` makes visual-mode mappings beginning with `i` -(such as `it` to select an "inner tag block") work in multi-cursor mode. - -The default list contents should work for anybody, unless they have remapped a -key from an operator-pending command to a non-operator-pending command or -vice versa. - -These keys must be manually listed because vim doesn't provide a way to -automatically see which keys _start_ mappings, and trying to run motion commands -such as `j` as if they were operator-pending commands can break things. - -### Interactions with other plugins - -### ```Multiple_cursors_before/Multiple_cursors_after``` (Default: `nothing`) - -Other plugins may trigger on keypresses when in insert mode. These plugins -generally provide a means to toggle their active state. These hooks allow -the user to provide functions in their .vimrc to do this when multiple-cursor-mode -is entered. - -For example, if you are using [Neocomplete](https://github.com/Shougo/neocomplete.vim), -add this to your vimrc to prevent conflict: - -```viml -" Called once right before you start selecting multiple cursors -function! Multiple_cursors_before() - if exists(':NeoCompleteLock')==2 - exe 'NeoCompleteLock' - endif -endfunction - -" Called once only when the multiple selection is canceled (default ) -function! Multiple_cursors_after() - if exists(':NeoCompleteUnlock')==2 - exe 'NeoCompleteUnlock' - endif -endfunction -``` - -With this locking and unlocking we prevent neocomplete to trigger it's function calls until we are finished with multiple cursors editing. - -Plugins themselves can register `User` autocommands on `MultipleCursorsPre` and -`MultipleCursorsPost` for automatic integration. - -### Highlight -The plugin uses the highlight group `multiple_cursors_cursor` and `multiple_cursors_visual` to highlight the virtual cursors and their visual selections respectively. You can customize them by putting something similar like the following in your vimrc: - -```viml -" Default highlighting (see help :highlight and help :highlight-link) -highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse -highlight link multiple_cursors_visual Visual -``` - -## FAQ - -#### **Q** CTRL+n doesn't seem to work in gVIM? - -**A** Try setting `set selection=inclusive` in your `~/.gvimrc` - -#### **Q** How can I select `n` keywords with several keystrokes? I have tried `200` which does not work. - -**A** You can use :MultipleCursorsFind keyword. I have this binding in my vimrc: - -```VimL -nnoremap :MultipleCursorsFind / -vnoremap :MultipleCursorsFind / -``` - -This allows one to a) search for the keyword using `*` b) turn search results into cursors with `Alt-j`. - -## Known Issues -- Select mode is not implemented - -## Issue Creation Requirements - -This is a community supported project. Contributor's time is precious and limited. To ensure your issue is not closed out of hand, please ensure it meets the requirements outlined in [CONTRIBUTING.md](CONTRIBUTING.md). - -## Changelog -See [CHANGELOG.md](CHANGELOG.md) - -## Contributing -As one can see, there're still many issues to be resolved, patches and suggestions are always welcome! A list of open feature requests can be found [here](../../issues?labels=enhancement&state=open). - -Running the test suite requires ruby and rake as well as vim of course. On Mac -OS, [MacVim](https://code.google.com/p/macvim/) is known to work. - -## Credit -Obviously inspired by Sublime Text's [multiple selection][sublime-multiple-selection] feature, also encouraged by Emac's [multiple cursors][emacs-multiple-cursors] implementation by Magnar Sveen - -[vim-multiple-cursors]:http://github.com/terryma/vim-multiple-cursors -[sublime-multiple-selection]:http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html -[Pathogen]:http://github.com/tpope/vim-pathogen -[Vundle]:http://github.com/gmarik/vundle -[Neobundle]:http://github.com/Shougo/neobundle.vim -[emacs-multiple-cursors]:https://github.com/magnars/multiple-cursors.el - - -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/terryma/vim-multiple-cursors/trend.png)](https://bitdeli.com/free "Bitdeli Badge") diff --git a/.vim/bundle/vim-multiple-cursors/Rakefile b/.vim/bundle/vim-multiple-cursors/Rakefile deleted file mode 100644 index 7150a28..0000000 --- a/.vim/bundle/vim-multiple-cursors/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -require 'rspec/core/rake_task' - -RSpec::Core::RakeTask.new(:spec) do |t| - t.pattern = 'spec/multiple_cursors_spec.rb' -end - -RSpec::Core::RakeTask.new(:benchmark) do |t| - t.pattern = 'spec/benchmark_spec.rb' -end - -task :default => :spec diff --git a/.vim/bundle/vim-multiple-cursors/autoload/multiple_cursors.vim b/.vim/bundle/vim-multiple-cursors/autoload/multiple_cursors.vim deleted file mode 100644 index 36d267f..0000000 --- a/.vim/bundle/vim-multiple-cursors/autoload/multiple_cursors.vim +++ /dev/null @@ -1,1256 +0,0 @@ -"=============================================================================== -" Initialization -"=============================================================================== - -" Tweak key settings. If the key is set using 'expr-quote' (h: expr-quote), then -" there's nothing that we need to do. If it's set using raw strings, then we -" need to convert it. We need to resort to such voodoo exec magic here to get -" it to work the way we like. '' is converted to '\' by the end and -" the global vars are replaced by their new value. This is ok since the mapping -" using '' should already have completed in the plugin file. -for s:key in [ 'g:multi_cursor_next_key', - \ 'g:multi_cursor_prev_key', - \ 'g:multi_cursor_skip_key', - \ 'g:multi_cursor_quit_key' ] - if exists(s:key) - " Translate raw strings like "" into key code like "\" - exec 'let s:temp = '.s:key - if s:temp =~ '^<.*>$' - exec 'let '.s:key.' = "\'.s:temp.'"' - endif - else - " If the user didn't define it, initialize it to an empty string so the - " logic later don't break - exec 'let '.s:key.' = ""' - endif -endfor -unlet! s:key s:temp - -" These keys will not be replicated at every cursor location. Make sure that -" this assignment happens AFTER the key tweak setting above -let s:special_keys = { - \ 'v': [ g:multi_cursor_next_key, g:multi_cursor_prev_key, g:multi_cursor_skip_key ], - \ 'n': [ g:multi_cursor_next_key ], - \ } - -" The highlight group we use for all the cursors -let s:hi_group_cursor = 'multiple_cursors_cursor' - -" The highlight group we use for all the visual selection -let s:hi_group_visual = 'multiple_cursors_visual' - -" Used for preventing multiple calls on before function -let s:before_function_called = 0 - -" Used for searching whole words (search pattern is wrapped with \< and \>) -" Keep old behaviour by default (act like g*) -let s:use_word_boundary = 1 - -" Set up highlighting -if !hlexists(s:hi_group_cursor) - exec "highlight ".s:hi_group_cursor." term=reverse cterm=reverse gui=reverse" -endif -if !hlexists(s:hi_group_visual) - exec "highlight link ".s:hi_group_visual." Visual" -endif - -" Temporary buffer that is used for individual paste buffer save/restore -" operations -let s:paste_buffer_temporary_text = '' -let s:paste_buffer_temporary_type = '' - -"=============================================================================== -" Internal Mappings -"=============================================================================== - -inoremap (multiple-cursors-input) :call process_user_input() -nnoremap (multiple-cursors-input) :call process_user_input() -xnoremap (multiple-cursors-input) :call process_user_input() - -inoremap (multiple-cursors-apply) :call apply_user_input_next('i') -nnoremap (multiple-cursors-apply) :call apply_user_input_next('n') -xnoremap (multiple-cursors-apply) :call apply_user_input_next('v') - -inoremap (multiple-cursors-detect) :call detect_bad_input() -nnoremap (multiple-cursors-detect) :call detect_bad_input() -xnoremap (multiple-cursors-detect) :call detect_bad_input() - -inoremap (multiple-cursors-wait) :call wait_for_user_input('') -nnoremap (multiple-cursors-wait) :call wait_for_user_input('') -xnoremap (multiple-cursors-wait) :call wait_for_user_input('') - -" Note that although these mappings are seemingly triggerd from Visual mode, -" they are in fact triggered from Normal mode. We quit visual mode to allow the -" virtual highlighting to take over -nnoremap (multiple-cursors-prev) :call multiple_cursors#prev() -nnoremap (multiple-cursors-skip) :call multiple_cursors#skip() -nnoremap (multiple-cursors-new) :call multiple_cursors#new('v', 0) -nnoremap (multiple-cursors-new-word) :call multiple_cursors#new('v', 1) - -"=============================================================================== -" Public Functions -"=============================================================================== - -" Print some debugging info -function! multiple_cursors#debug() - call s:cm.debug() -endfunction - -function! multiple_cursors#get_latency_debug_file() - return s:latency_debug_file -endfunction - - -function! s:fire_pre_triggers() - if !s:before_function_called - doautocmd User MultipleCursorsPre - if exists('*Multiple_cursors_before') - exe "call Multiple_cursors_before()" - endif - let s:before_function_called = 1 - endif -endfunction - -" Creates a new cursor. Different logic applies depending on the mode the user -" is in and the current state of the buffer. -" 1. In normal mode, a new cursor is created at the end of the word under Vim's -" normal cursor -" 2. In visual mode, if the visual selection covers more than one line, a new -" cursor is created at the beginning of each line -" 3. In visual mode, if the visual selection covers a single line, a new cursor -" is created at the end of the visual selection. Another cursor will be -" attempted to be created at the next occurrence of the visual selection -function! multiple_cursors#new(mode, word_boundary) - " Call before function if exists only once until it is canceled () - call s:fire_pre_triggers() - let s:use_word_boundary = a:word_boundary - if a:mode ==# 'n' - " Reset all existing cursors, don't restore view and setting - call s:cm.reset(0, 0) - - " Select the word under cursor to set the '< and '> marks - exec "normal! viw" - call s:exit_visual_mode() - - " Add cursor with the current visual selection - call s:cm.add(s:pos("'>"), s:region("'<", "'>")) - call s:wait_for_user_input('v') - elseif a:mode ==# 'v' - " If the visual area covers the same line, then do a search for next - " occurrence - let start = line("'<") - let finish = line("'>") - if start != finish - call s:cm.reset(0, 0) - let col = col("'<") - for line in range(line("'<"), line("'>")) - let pos = [line, col] - call s:cm.add(pos) - endfor - " Start in normal mode - call s:wait_for_user_input('n') - else - " Came directly from visual mode - if s:cm.is_empty() - call s:cm.reset(0, 0) - - if visualmode() ==# 'V' - let left = [line('.'), 1] - let right = [line('.'), col('$')-1] - if right[1] == 0 " empty line - return - endif - call s:cm.add(right, [left, right]) - else - call s:cm.add(s:pos("'>"), s:region("'<", "'>")) - endif - endif - let content = s:get_text(s:region("'<", "'>")) - let next = s:find_next(content) - if s:cm.add(next[1], next) - call s:update_visual_markers(next) - else - call cursor(s:cm.get_current().position) - echohl WarningMsg | echo 'No more matches' | echohl None - endif - call s:wait_for_user_input('v') - endif - endif -endfunction - -" Quit out of multicursor mode, fixes #27. -function! multiple_cursors#quit() - call s:exit() -endfunction - -" Delete the current cursor. If there's no more cursors, stop the loop -function! multiple_cursors#prev() - call s:cm.delete_current() - if !s:cm.is_empty() - call s:update_visual_markers(s:cm.get_current().visual) - call cursor(s:cm.get_current().position) - call s:wait_for_user_input('v') - endif -endfunction - -" Skip the current cursor and move to the next cursor -function! multiple_cursors#skip() - call s:cm.delete_current() - let content = s:get_text(s:region("'<", "'>")) - let next = s:find_next(content) - call s:cm.add(next[1], next) - call s:update_visual_markers(next) - call s:wait_for_user_input('v') -endfunction - -" Search for pattern between the start and end line number. For each match, add -" a virtual cursor at the end and start multicursor mode -" This function is called from a command. User commands in Vim do not support -" passing in column ranges. If the user selects a block of text in visual mode, -" but not visual line mode, we only want to match patterns within the actual -" visual selection. We get around this by checking the last visual selection and -" see if its start and end lines match the input. If so, we assume that the user -" did a normal visual selection and we use the '< and '> marks to define the -" region instead of start and end from the method parameter. -function! multiple_cursors#find(start, end, pattern) - let s:cm.saved_winview = winsaveview() - let s:cm.start_from_find = 1 - if visualmode() ==# 'v' && a:start == line("'<") && a:end == line("'>") - let pos1 = s:pos("'<") - let pos2 = s:pos("'>") - else - let pos1 = [a:start, 1] - let pos2 = [a:end, col([a:end, '$'])] - endif - call cursor(pos1) - let first = 1 - while 1 - if first - " Set `virtualedit` to 'onemore' for the first search to consistently - " match patterns like '$' - let saved_virtualedit = &virtualedit - let &virtualedit = "onemore" - " First search starts from the current position - let match = search(a:pattern, 'cW') - else - let match = search(a:pattern, 'W') - endif - if !match - break - endif - let left = s:pos('.') - " Perform an intermediate backward search to correctly match patterns like - " '^' and '$' - let match = search(a:pattern, 'bceW') - let right = s:pos('.') - " Reset the cursor and perform a normal search if the intermediate search - " wasn't successful - if !match || s:compare_pos(right, left) != 0 - call cursor(left) - call search(a:pattern, 'ceW') - let right = s:pos('.') - endif - if first - let &virtualedit = saved_virtualedit - let first = 0 - endif - if s:compare_pos(right, pos2) > 0 - " Position the cursor at the end of the previous match so it'll be on a - " virtual cursor when multicursor mode is started. The `winrestview()` - " call below 'undoes' unnecessary repositionings - call search(a:pattern, 'be') - break - endif - call s:cm.add(right, [left, right]) - " Redraw here forces the cursor movement to be updated. This prevents the - " jerky behavior when doing any action once the cursors are added. But it - " also slows down adding the cursors dramatically. We need to a better - " solution here - " redraw - endwhile - if s:cm.is_empty() - call winrestview(s:cm.saved_winview) - echohl ErrorMsg | echo 'No match found' | echohl None - return - else - echohl Normal | echo 'Added '.s:cm.size().' cursor'.(s:cm.size()>1?'s':'') | echohl None - - " If we've created any cursors, we need to call the before function, end - " function will be called via normal routes - call s:fire_pre_triggers() - - call s:wait_for_user_input('v') - endif -endfunction - -"=============================================================================== -" Cursor class -"=============================================================================== -let s:Cursor = {} - -" Create a new cursor. Highlight it and save the current line length -function! s:Cursor.new(position) - let obj = copy(self) - let obj.position = copy(a:position) - let obj.visual = [] - let obj.saved_visual = [] - " Stores text that was yanked after any commands in Normal or Visual mode - let obj.paste_buffer_text = getreg('"') - let obj.paste_buffer_type = getregtype('"') - let obj.cursor_hi_id = s:highlight_cursor(a:position) - let obj.visual_hi_id = 0 - let obj.line_length = col([a:position[0], '$']) - if has('folding') - silent! execute a:position[0] . "foldopen!" - endif - return obj -endfunction - -" Return the line the cursor is on -function! s:Cursor.line() dict - return self.position[0] -endfunction - -" Return the column the cursor is on -function! s:Cursor.column() dict - return self.position[1] -endfunction - -" Move the cursor location by the number of lines and columns specified in the -" input. The input can be negative. -function! s:Cursor.move(line, column) dict - let self.position[0] += a:line - let self.position[1] += a:column - if !empty(self.visual) - let self.visual[0][0] += a:line - let self.visual[0][1] += a:column - let self.visual[1][0] += a:line - let self.visual[1][1] += a:column - endif - call self.update_highlight() -endfunction - -" Update the current position of the cursor -function! s:Cursor.update_position(pos) dict - let self.position[0] = a:pos[0] - let self.position[1] = a:pos[1] - call self.update_highlight() -endfunction - -" Reapply the highlight on the cursor -function! s:Cursor.update_highlight() dict - call s:cm.remove_highlight(self.cursor_hi_id) - let self.cursor_hi_id = s:highlight_cursor(self.position) -endfunction - -" Refresh the length of the line the cursor is on. This could change from -" underneath -function! s:Cursor.update_line_length() dict - let self.line_length = col([self.line(), '$']) -endfunction - -" Update the visual selection and its highlight -function! s:Cursor.update_visual_selection(region) dict - let self.visual = deepcopy(a:region) - call s:cm.remove_highlight(self.visual_hi_id) - let self.visual_hi_id = s:highlight_region(a:region) -endfunction - -" Remove the visual selection and its highlight -function! s:Cursor.remove_visual_selection() dict - let self.saved_visual = deepcopy(self.visual) - let self.visual = [] - " TODO(terryma): Move functionality into separate class - call s:cm.remove_highlight(self.visual_hi_id) - let self.visual_hi_id = 0 -endfunction - -" Restore unnamed register from paste buffer -function! s:Cursor.restore_unnamed_register() dict - call setreg('"', self.paste_buffer_text, self.paste_buffer_type) -endfunction - -" Save contents of the unnamed register into paste buffer -function! s:Cursor.save_unnamed_register() dict - let self.paste_buffer_text = getreg('"') - let self.paste_buffer_type = getregtype('"') -endfunction - -"=============================================================================== -" CursorManager class -"=============================================================================== -let s:CursorManager = {} - -" Constructor -function! s:CursorManager.new() - let obj = copy(self) - " List of Cursors we're managing - let obj.cursors = [] - " Current index into the s:cursors array - let obj.current_index = -1 - " This marks the starting cursor index into the s:cursors array - let obj.starting_index = -1 - " We save some user settings when the plugin loads initially - let obj.saved_settings = { - \ 'virtualedit': &virtualedit, - \ 'cursorline': &cursorline, - \ 'lazyredraw': &lazyredraw, - \ 'paste': &paste, - \ 'clipboard': &clipboard, - \ } - " We save the window view when multicursor mode is entered - let obj.saved_winview = [] - " Track whether we started multicursor mode from calling multiple_cursors#find - let obj.start_from_find = 0 - return obj -endfunction - -" Clear all cursors and their highlights -function! s:CursorManager.reset(restore_view, restore_setting, ...) dict - if a:restore_view - " Return the view back to the beginning - if !empty(self.saved_winview) - call winrestview(self.saved_winview) - endif - - " If the cursor moved, just restoring the view could get confusing, let's - " put the cursor at where the user left it. Only do this if we didn't start - " from find mode - if !self.is_empty() && !self.start_from_find - call cursor(self.get(0).position) - endif - endif - - " Delete all cursors and clear their highlights. Don't do clearmatches() as - " that will potentially interfere with other plugins - if !self.is_empty() - for i in range(self.size()) - call self.remove_highlight(self.get(i).cursor_hi_id) - call self.remove_highlight(self.get(i).visual_hi_id) - endfor - endif - - let self.cursors = [] - let self.current_index = -1 - let self.starting_index = -1 - let self.saved_winview = [] - let self.start_from_find = 0 - let s:char = '' - let s:saved_char = '' - if a:restore_setting - call self.restore_user_settings() - endif - " Call after function if exists and only if action is canceled () - if a:0 && s:before_function_called - if exists('*Multiple_cursors_after') - exe "call Multiple_cursors_after()" - endif - doautocmd User MultipleCursorsPost - let s:before_function_called = 0 - endif -endfunction - -" Returns 0 if it's not managing any cursors at the moment -function! s:CursorManager.is_empty() dict - return self.size() == 0 -endfunction - -" Returns the number of cursors it's managing -function! s:CursorManager.size() dict - return len(self.cursors) -endfunction - -" Returns the current cursor -function! s:CursorManager.get_current() dict - return self.cursors[self.current_index] -endfunction - -" Returns the cursor at index i -function! s:CursorManager.get(i) dict - return self.cursors[a:i] -endfunction - -" Removes the current cursor and all its associated highlighting. Also update -" the current index -function! s:CursorManager.delete_current() dict - call self.remove_highlight(self.get_current().cursor_hi_id) - call self.remove_highlight(self.get_current().visual_hi_id) - call remove(self.cursors, self.current_index) - let self.current_index -= 1 -endfunction - -" Remove the highlighting if its matchid exists -function! s:CursorManager.remove_highlight(hi_id) dict - if a:hi_id - " If the user did a matchdelete or a clearmatches, we don't want to barf if - " the matchid is no longer valid - silent! call matchdelete(a:hi_id) - endif -endfunction - -function! s:CursorManager.debug() dict - let i = 0 - for c in self.cursors - echom 'cursor #'.i.': pos='.string(c.position).' visual='.string(c.visual) - let i+=1 - endfor - echom 'input = '.s:char - echom 'index = '.self.current_index - echom 'pos = '.string(s:pos('.')) - echom '''< = '.string(s:pos("'<")) - echom '''> = '.string(s:pos("'>")) - echom 'to mode = '.s:to_mode - echom 'from mode = '.s:from_mode - " echom 'special keys = '.string(s:special_keys) - echom ' ' -endfunction - -" Sync the current cursor to the current Vim cursor. This includes updating its -" location, its highlight, and potentially its visual region. Return true if the -" position changed, false otherwise -function! s:CursorManager.update_current() dict - let cur = self.get_current() - if s:to_mode ==# 'v' || s:to_mode ==# 'V' - " If we're in visual line mode, we need to go to visual mode before we can - " update the visual region - if s:to_mode ==# 'V' - exec "normal! gvv\" - endif - - " Sets the cursor at the right place - exec "normal! gv\" - call cur.update_visual_selection(s:get_visual_region(s:pos('.'))) - elseif s:from_mode ==# 'v' || s:from_mode ==# 'V' - " Save contents of unnamed register after each operation in Visual mode. - " This should be executed after user input is processed, when unnamed - " register already contains the text. - call cur.save_unnamed_register() - - call cur.remove_visual_selection() - elseif s:from_mode ==# 'i' && s:to_mode ==# 'n' && self.current_index != self.size() - 1 - normal! h - elseif s:from_mode ==# 'n' - " Save contents of unnamed register after each operation in Normal mode. - call cur.save_unnamed_register() - endif - let vdelta = line('$') - s:saved_linecount - " If the total number of lines changed in the buffer, we need to potentially - " adjust other cursor locations - if vdelta != 0 - if self.current_index != self.size() - 1 - let cur_column_offset = (cur.column() - col('.')) * -1 - let new_line_length = len(getline('.')) - for i in range(self.current_index+1, self.size()-1) - let hdelta = 0 - " Note: some versions of Vim don't like chaining function calls like - " a.b().c(). For compatibility reasons, don't do it - let c = self.get(i) - " If there're other cursors on the same line, we need to adjust their - " columns. This needs to happen before we adjust their line! - if cur.line() == c.line() - if vdelta > 0 - " Added a line - let hdelta = cur_column_offset - else - " Removed a line - let hdelta = new_line_length - endif - endif - call c.move(vdelta, hdelta) - endfor - endif - else - " If the line length changes, for all the other cursors on the same line as - " the current one, update their cursor location as well - let hdelta = col('$') - cur.line_length - " Only do this if we're still on the same line as before - if hdelta != 0 && cur.line() == line('.') - " Update all the cursor's positions that occur after the current cursor on - " the same line - if self.current_index != self.size() - 1 - for i in range(self.current_index+1, self.size()-1) - let c = self.get(i) - " Only do it for cursors on the same line - if cur.line() == c.line() - call c.move(0, hdelta) - else - " Early exit, if we're not on the same line, neither will any cursor - " that come after this - break - endif - endfor - endif - endif - endif - - let pos = s:pos('.') - if cur.position == pos - return 0 - endif - call cur.update_position(pos) - return 1 -endfunction - -" Advance to the next cursor -function! s:CursorManager.next() dict - let self.current_index = (self.current_index + 1) % self.size() -endfunction - -" Start tracking cursor updates -function! s:CursorManager.start_loop() dict - let self.starting_index = self.current_index -endfunction - -" Returns true if we're cycled through all the cursors -function! s:CursorManager.loop_done() dict - return self.current_index == self.starting_index -endfunction - -" Tweak some user settings, and save our current window view. This is called -" every time multicursor mode is entered. -" virtualedit needs to be set to onemore for updates to work correctly -" cursorline needs to be turned off for the cursor highlight to work on the line -" where the real vim cursor is -" lazyredraw needs to be turned on to prevent jerky screen behavior with many -" cursors on screen -" paste mode needs to be switched off since it turns off a bunch of features -" that's critical for the plugin to function -" clipboard should not have unnamed and unnamedplus otherwise plugin cannot -" reliably use unnamed register ('"') -function! s:CursorManager.initialize() dict - let self.saved_settings['virtualedit'] = &virtualedit - let self.saved_settings['cursorline'] = &cursorline - let self.saved_settings['lazyredraw'] = &lazyredraw - let self.saved_settings['paste'] = &paste - let self.saved_settings['clipboard'] = &clipboard - let &virtualedit = "onemore" - let &cursorline = 0 - let &lazyredraw = 1 - let &paste = 0 - set clipboard-=unnamed clipboard-=unnamedplus - " We could have already saved the view from multiple_cursors#find - if !self.start_from_find - let self.saved_winview = winsaveview() - endif - - " Save contents and type of unnamed register upon entering multicursor mode - " to restore it later when leaving mode - let s:paste_buffer_temporary_text = getreg('"') - let s:paste_buffer_temporary_type = getregtype('"') -endfunction - -" Restore user settings. -function! s:CursorManager.restore_user_settings() dict - if !empty(self.saved_settings) - let &virtualedit = self.saved_settings['virtualedit'] - let &cursorline = self.saved_settings['cursorline'] - let &lazyredraw = self.saved_settings['lazyredraw'] - let &paste = self.saved_settings['paste'] - let &clipboard = self.saved_settings['clipboard'] - endif - - " Restore original contents and type of unnamed register. This method is - " called from reset, which calls us only when restore_setting argument is - " true, which happens only when we leave multicursor mode. This should be - " symmetrical to saving of unnamed register upon the start of multicursor - " mode. - call setreg('"', s:paste_buffer_temporary_text, s:paste_buffer_temporary_type) -endfunction - -" Reposition all cursors to the start or end of their region -function! s:CursorManager.reposition_all_within_region(start) dict - for c in self.cursors - call c.update_position(c.saved_visual[a:start ? 0 : 1]) - endfor -endfunction - -" Reselect the current cursor's region in visual mode -function! s:CursorManager.reapply_visual_selection() dict - call s:select_in_visual_mode(self.get_current().visual) -endfunction - -" Creates a new virtual cursor as 'pos' -" Optionally a 'region' object can be passed in as second argument. If set, the -" visual region of the cursor will be set to it -" Return true if the cursor has been successfully added, false otherwise -" Mode change: Normal -> Normal -" Cursor change: None (TODO Should we set Vim's cursor to pos?) -function! s:CursorManager.add(pos, ...) dict - " Lazy init - if self.is_empty() - call self.initialize() - endif - - " Don't add duplicates - let i = 0 - for c in self.cursors - if c.position == a:pos - return 0 - endif - let i+=1 - endfor - - let cursor = s:Cursor.new(a:pos) - - " Save the visual selection - if a:0 > 0 - call cursor.update_visual_selection(a:1) - endif - - call add(self.cursors, cursor) - let self.current_index += 1 - return 1 -endfunction - -"=============================================================================== -" Variables -"=============================================================================== - -" This is the last user input that we're going to replicate, in its string form -let s:char = '' -" This is either `I` or `A`, as input in Visual mode, that we're going to use -" to make the appropriate transition into Insert mode -let s:saved_char = '' -" This is the mode the user is in before s:char -let s:from_mode = '' -" This is the mode the user is in after s:char -let s:to_mode = '' -" This is the total number of lines in the buffer before processing s:char -let s:saved_linecount = -1 -" This is used to apply the highlight fix. See s:apply_highight_fix() -let s:saved_line = 0 -" This is the number of cursor locations where we detected an input that we -" cannot play back -let s:bad_input = 0 -" Singleton cursor manager instance -let s:cm = s:CursorManager.new() - -"=============================================================================== -" Utility functions -"=============================================================================== - -" Return the position of the input marker as a two element array. First element -" is the line number, second element is the column number -function! s:pos(mark) - let pos = getpos(a:mark) - return [pos[1], pos[2]] -endfunction - -" Return the region covered by the input markers as a two element array. First -" element is the position of the start marker, second element is the position of -" the end marker -function! s:region(start_mark, end_mark) - return [s:pos(a:start_mark), s:pos(a:end_mark)] -endfunction - -" Exit visual mode and go back to normal mode -" The reason for the additional gv\ is that it allows the cursor to stay -" on where it was before exiting -" Mode change: Normal -> Normal or Visual -> Normal -" Cursor change: If in visual mode, changed to exactly where it was on screen in -" visual mode. If in normal mode, changed to where the cursor was when the last -" visual selection ended -function! s:exit_visual_mode() - exec "normal! \gv\" - - " Call before function if exists only once until it is canceled () - if exists('*Multiple_cursors_before') && !s:before_function_called - exe "call Multiple_cursors_before()" - let s:before_function_called = 1 - endif -endfunction - -" Visually select input region, where region is an array containing the start -" and end position. If start is after end, the selection simply goes backwards. -" Typically m<, m>, and gv would be a simple way of accomplishing this, but on -" some systems, the m< and m> marks are not supported. Note that v`` has random -" behavior if `` is the same location as the cursor location. -" Mode change: Normal -> Visual -" Cursor change: Set to end of region -" TODO: Refactor this and s:update_visual_markers -" FIXME: By using m` we're destroying the user's jumplist. We should use a -" different mark and use :keepjump -function! s:select_in_visual_mode(region) - if a:region[0] == a:region[1] - normal! v - else - call cursor(a:region[1]) - normal! m` - call cursor(a:region[0]) - normal! v`` - endif - - " Unselect and reselect it again to properly set the '< and '> markers - exec "normal! \gv" -endfunction - -" Update '< and '> to the input region -" Mode change: Normal -> Normal -" Cursor change: Set to the end of the region -function! s:update_visual_markers(region) - if a:region[0] == a:region[1] - normal! v - else - call cursor(a:region[1]) - normal! m` - call cursor(a:region[0]) - normal! v`` - endif - call s:exit_visual_mode() -endfunction - -" Finds the next occurrence of the input text in the current buffer. -" Search is case sensitive -" Mode change: Normal -> Normal -" Cursor change: Set to the end of the match -function! s:find_next(text) - let pattern = substitute(escape(a:text, '\'), '\n', '\\n', 'g') - if s:use_word_boundary == 1 - let pattern = '\<'.pattern.'\>' - endif - let pattern = '\V\C'.pattern - call search(pattern) - let start = s:pos('.') - call search(pattern, 'ce') - let end = s:pos('.') - return [start, end] -endfunction - -" Highlight the position using the cursor highlight group -function! s:highlight_cursor(pos) - " Give cursor highlight high priority, to overrule visual selection - return matchadd(s:hi_group_cursor, '\%'.a:pos[0].'l\%'.a:pos[1].'c', 99999) -endfunction - -" Compare two position arrays. Return a negative value if lhs occurs before rhs, -" positive value if after, and 0 if they are the same. -function! s:compare_pos(l, r) - " If number lines are the same, compare columns - return a:l[0] ==# a:r[0] ? a:l[1] - a:r[1] : a:l[0] - a:r[0] -endfunction - -" Highlight the area bounded by the input region. The logic here really stinks, -" it's frustrating that Vim doesn't have a built in easier way to do this. None -" of the \%V or \%'m solutions work because we need the highlighting to stay for -" multiple places. -function! s:highlight_region(region) - let s = sort(copy(a:region), "s:compare_pos") - if s:to_mode ==# 'V' - let pattern = '\%>'.(s[0][0]-1).'l\%<'.(s[1][0]+1).'l.*\ze.\_$' - else - if (s[0][0] == s[1][0]) - " Same line - let pattern = '\%'.s[0][0].'l\%>'.(s[0][1]-1).'c.*\%<'.(s[1][1]+1).'c.' - else - " Two lines - let s1 = '\%'.s[0][0].'l.\%>'.s[0][1].'c.*' - let s2 = '\%'.s[1][0].'l.*\%<'.s[1][1].'c..' - let pattern = s1.'\|'.s2 - " More than two lines - if (s[1][0] - s[0][0] > 1) - let pattern = pattern.'\|\%>'.s[0][0].'l\%<'.s[1][0].'l.*\ze.\_$' - endif - endif - endif - return matchadd(s:hi_group_visual, pattern) -endfunction - -" Perform the operation that's necessary to revert us from one mode to another -function! s:revert_mode(from, to) - if a:to ==# 'v' - call s:cm.reapply_visual_selection() - elseif a:to ==# 'V' - call s:cm.reapply_visual_selection() - normal! V - elseif a:to ==# 'n' && a:from ==# 'i' - stopinsert - endif -endfunction - -" Consume all the additional character the user typed between the last -" getchar() and here, to avoid potential race condition. -let s:saved_keys = "" -function! s:feedkeys(keys) - while 1 - let c = getchar(0) - let char_type = type(c) - " Checking type is important, when strings are compared with integers, - " strings are always converted to ints, and all strings are equal to 0 - if char_type == 0 - if c == 0 - break - else - let s:saved_keys .= nr2char(c) - endif - elseif char_type == 1 " char with more than 8 bits (as string) - let s:saved_keys .= c - endif - endwhile - call feedkeys(a:keys) -endfunction - -" Take the user input and apply it at every cursor -function! s:process_user_input() - " Grr this is frustrating. In Insert mode, between the feedkey call and here, - " the current position could actually CHANGE for some odd reason. Forcing a - " position reset here - let cursor_position = s:cm.get_current() - call cursor(cursor_position.position) - - " Before applying the user input, we need to revert back to the mode the user - " was in when the input was entered - call s:revert_mode(s:to_mode, s:from_mode) - - " Update the line length BEFORE applying any actions. TODO(terryma): Is there - " a better place to do this? - " let cursor_position = s:cm.get_current() - call cursor_position.update_line_length() - let s:saved_linecount = line('$') - - " Restore unnamed register only in Normal mode. This should happen before user - " input is processed. - if s:from_mode ==# 'n' || s:from_mode ==# 'v' || s:from_mode ==# 'V' - call cursor_position.restore_unnamed_register() - endif - - " Apply the user input. Note that the above could potentially change mode, we - " use the mapping below to help us determine what the new mode is - " Note that it's possible that \(multiple-cursors-apply) never gets called, we have a - " detection mechanism using \(multiple-cursors-detect). See its documentation for more details - - " Assume that input is not valid - let s:valid_input = 0 - - " If we're coming from insert mode or going into insert mode, always chain the - " undos together. - " FIXME(terryma): Undo always places the cursor at the beginning of the line. - " Figure out why. - if s:from_mode ==# 'i' || s:to_mode ==# 'i' - silent! undojoin | call s:feedkeys(s:char."\(multiple-cursors-apply)") - else - call s:feedkeys(s:char."\(multiple-cursors-apply)") - endif - - " Even when s:char produces invalid input, this method is always called. The - " 't' here is important - call feedkeys("\(multiple-cursors-detect)", 't') -endfunction - -" This method is always called during fanout, even when a bad user input causes -" s:apply_user_input_next to not be called. We detect that and force the method -" to be called to continue the fanout process -function! s:detect_bad_input() - if !s:valid_input - " To invoke the appropriate `(multiple-cursors-apply)` mapping, we - " need to revert back to the mode the user was in when the input was entered - call s:revert_mode(s:to_mode, s:from_mode) - " We ignore the bad input and force invoke s:apply_user_input_next - call feedkeys("\(multiple-cursors-apply)") - let s:bad_input += 1 - endif -endfunction - -" Complete transition into Insert mode when `I` or `A` is input in Visual mode -function! s:handle_visual_IA_to_insert() - if !empty(s:saved_char) && s:char =~# 'v\|V' && s:to_mode ==# 'n' - if s:saved_char ==# 'I' - call s:cm.reposition_all_within_region(1) - endif - call feedkeys(tolower(s:saved_char)) - let s:saved_char = '' - endif -endfunction - -" Begin transition into Insert mode when `I` or `A` is input in Visual mode -function! s:handle_visual_IA_to_normal() - if s:char =~# 'I\|A' && s:from_mode =~# 'v\|V' - let s:saved_char = s:char - let s:char = s:from_mode " spoof a 'v' or 'V' input to transiton from Visual into Normal mode - endif -endfunction - -" Apply the user input at the next cursor location -function! s:apply_user_input_next(mode) - let s:valid_input = 1 - - " Save the current mode, only if we haven't already - if empty(s:to_mode) - let s:to_mode = a:mode - if s:to_mode ==# 'v' - if visualmode() ==# 'V' - let s:to_mode = 'V' - endif - endif - endif - - " Update the current cursor's information - let changed = s:cm.update_current() - - " Advance the cursor index - call s:cm.next() - - " We're done if we're made the full round - if s:cm.loop_done() - if s:to_mode ==# 'v' || s:to_mode ==# 'V' - " This is necessary to set the "'<" and "'>" markers properly - call s:update_visual_markers(s:cm.get_current().visual) - endif - call feedkeys("\(multiple-cursors-wait)") - call s:handle_visual_IA_to_insert() - else - " Continue to next - call feedkeys("\(multiple-cursors-input)") - endif -endfunction - -" If pos is equal to the left side of the visual selection, the region start -" from end to start -function! s:get_visual_region(pos) - let left = s:pos("'<") - let right = s:pos("'>") - if a:pos == left - let region = [right, left] - else - let region = [left, right] - endif - return region -endfunction - -function! s:strpart(s, i, l) - if a:l == 0 - return '' - endif - let [s, l] = ['', 0] - for c in split(a:s[a:i :], '\zs') - let s .= c - let l += len(c) - if l >= a:l - break - endif - endfor - return s -endfunction - -" Return the content of the buffer between the input region. This is used to -" find the next match in the buffer -" Mode change: Normal -> Normal -" Cursor change: None -function! s:get_text(region) - let lines = getline(a:region[0][0], a:region[1][0]) - let lines[-1] = s:strpart(lines[-1], 0, a:region[1][1]) - let lines[0] = lines[0][a:region[0][1] - 1:] - return join(lines, "\n") -endfunction - -" Wrapper around getchar() that returns the string representation of the user -" input -function! s:get_char() - let c = getchar() - " If the character is a number, then it's not a special key - if type(c) == 0 - let c = nr2char(c) - endif - return c -endfunction - -" Quits multicursor mode and clears all cursors. Return true if exited -" successfully. -function! s:exit() - if s:last_char() !=# g:multi_cursor_quit_key - return 0 - endif - let exit = 0 - if s:from_mode ==# 'n' - let exit = 1 - elseif (s:from_mode ==# 'v' || s:from_mode ==# 'V') && - \ g:multi_cursor_exit_from_visual_mode - let exit = 1 - elseif s:from_mode ==# 'i' && g:multi_cursor_exit_from_insert_mode - stopinsert - let exit = 1 - endif - if exit - call s:cm.reset(1, 1, 1) - return 1 - endif - return 0 -endfunction - -" These keys don't get faned out to all cursor locations. Instead, they're used -" to add new / remove existing cursors -" Precondition: The function is only called when the keys and mode respect the -" setting in s:special_keys -function! s:handle_special_key(key, mode) - " Use feedkeys here instead of calling the function directly to prevent - " increasing the call stack, since feedkeys execute after the current call - " finishes - if a:key == g:multi_cursor_next_key - if s:use_word_boundary == 1 - call s:feedkeys("\(multiple-cursors-new-word)") - else - call s:feedkeys("\(multiple-cursors-new)") - endif - elseif a:key == g:multi_cursor_prev_key - call s:feedkeys("\(multiple-cursors-prev)") - elseif a:key == g:multi_cursor_skip_key - call s:feedkeys("\(multiple-cursors-skip)") - endif -endfunction - -" The last line where the normal Vim cursor is always seems to highlighting -" issues if the cursor is on the last column. Vim's cursor seems to override the -" highlight of the virtual cursor. This won't happen if the virtual cursor isn't -" the last character on the line. This is a hack to add an empty space on the -" Vim cursor line right before we do the redraw, we'll revert the change -" immedidately after the redraw so the change should not be intrusive to the -" user's buffer content -function! s:apply_highlight_fix() - " Only do this if we're on the last character of the line - if col('.') == col('$') - let s:saved_line = getline('.') - if s:from_mode ==# 'i' - silent! undojoin | call setline('.', s:saved_line.' ') - else - call setline('.', s:saved_line.' ') - endif - endif -endfunction - -" Revert the fix if it was applied earlier -function! s:revert_highlight_fix() - if type(s:saved_line) == 1 - if s:from_mode ==# 'i' - silent! undojoin | call setline('.', s:saved_line) - else - call setline('.', s:saved_line) - endif - endif - let s:saved_line = 0 -endfunction - -let s:retry_keys = "" -function! s:display_error() - if s:bad_input == s:cm.size() - \ && ((s:from_mode ==# 'n' && has_key(g:multi_cursor_normal_maps, s:char[0])) - \ || (s:from_mode =~# 'v\|V' && has_key(g:multi_cursor_visual_maps, s:char[0]))) - " we couldn't replay it anywhere but we're told it's the beginning of a - " multi-character map like the `d` in `dw` - let s:retry_keys = s:char - else - let s:retry_keys = "" - if s:bad_input > 0 - echohl ErrorMsg | - \ echo "Key '".s:char."' cannot be replayed at ". - \ s:bad_input." cursor location".(s:bad_input == 1 ? '' : 's') | - \ echohl Normal - endif - endif - let s:bad_input = 0 -endfunction - -let s:latency_debug_file = '' -function! s:start_latency_measure() - if g:multi_cursor_debug_latency - let s:start_time = reltime() - endif -endfunction - -function! s:skip_latency_measure() - if g:multi_cursor_debug_latency - let s:skip_latency_measure = 1 - endif -endfunction - -function! s:end_latency_measure() - if g:multi_cursor_debug_latency && !empty(s:char) - if empty(s:latency_debug_file) - let s:latency_debug_file = tempname() - exec 'redir >> '.s:latency_debug_file - silent! echom "Starting latency debug at ".reltimestr(reltime()) - redir END - endif - - if !s:skip_latency_measure - exec 'redir >> '.s:latency_debug_file - silent! echom "Processing '".s:char."' took ".string(str2float(reltimestr(reltime(s:start_time)))*1000).' ms in '.s:cm.size().' cursors. mode = '.s:from_mode - redir END - endif - endif - let s:skip_latency_measure = 0 -endfunction - -function! s:last_char() - return s:char[len(s:char)-1] -endfunction - -function! s:wait_for_user_input(mode) - call s:display_error() - - let s:from_mode = a:mode - if empty(a:mode) - let s:from_mode = s:to_mode - endif - let s:to_mode = '' - - " Right before redraw, apply the highlighting bug fix - call s:apply_highlight_fix() - - redraw - - " Immediately revert the change to leave the user's buffer unchanged - call s:revert_highlight_fix() - - call s:end_latency_measure() - - let s:char = s:retry_keys . s:saved_keys - if len(s:saved_keys) == 0 - let s:char .= s:get_char() - call s:handle_visual_IA_to_normal() - else - let s:saved_keys = "" - endif - - if s:from_mode ==# 'i' && has_key(g:multi_cursor_insert_maps, s:last_char()) - let c = getchar(0) - let char_type = type(c) - let poll_count = 0 - while char_type == 0 && c == 0 && poll_count < &timeoutlen - sleep 1m - let c = getchar(0) - let char_type = type(c) - let poll_count += 1 - endwhile - - if char_type == 0 && c != 0 - let s:char .= nr2char(c) - elseif char_type == 1 " char with more than 8 bits (as string) - let s:char .= c - endif - elseif s:from_mode !=# 'i' && s:char[0] ==# ":" - call feedkeys(s:char) - call s:cm.reset(1, 1) - return - elseif s:from_mode ==# 'n' - while match(s:last_char(), "\\d") == 0 - let s:char .= s:get_char() - endwhile - endif - - call s:start_latency_measure() - - " Clears any echoes we might've added - normal! : - - if s:exit() - return - endif - - " If the key is a special key and we're in the right mode, handle it - if index(get(s:special_keys, s:from_mode, []), s:last_char()) != -1 - call s:handle_special_key(s:last_char(), s:from_mode) - call s:skip_latency_measure() - else - call s:cm.start_loop() - call s:feedkeys("\(multiple-cursors-input)") - endif -endfunction diff --git a/.vim/bundle/vim-multiple-cursors/doc/multiple_cursors.txt b/.vim/bundle/vim-multiple-cursors/doc/multiple_cursors.txt deleted file mode 100644 index 422d5cf..0000000 --- a/.vim/bundle/vim-multiple-cursors/doc/multiple_cursors.txt +++ /dev/null @@ -1,253 +0,0 @@ -*vim-multiple-cursors.txt* True Sublime Text multiple selection in Vim - - ____ _ __ - ____ ___ __ __/ / /_(_)___ / /__ _______ ________________ __________ - / __ `__ \/ / / / / __/ / __ \/ / _ \ / ___/ / / / ___/ ___/ __ \/ ___/ ___/ - / / / / / / /_/ / / /_/ / /_/ / / __/ / /__/ /_/ / / (__ ) /_/ / / (__ ) -/_/ /_/ /_/\__,_/_/\__/_/ .___/_/\___/ \___/\__,_/_/ /____/\____/_/ /____/ - /_/ - - - Reference Manual~ - - -============================================================================== - -CONTENTS *multiple-cursors-contents* - 1.Intro...................................|multiple-cursors-intro| - 2.Usage...................................|multiple-cursors-usage| - 3.Mappings................................|multiple-cursors-mappings| - 4.Global Options..........................|multiple-cursors-global-options| - 5.Issues..................................|multiple-cursors-issues| - 6.Contributing............................|multiple-cursors-contributing| - 7.License.................................|multiple-cursors-license| - 8.Credit..................................|multiple-cursors-credit| - 9.References..............................|multiple-cursors-references| - -============================================================================== -1. Intro *multiple-cursors-intro* - -There [1] have [2] been [3] many [4] attempts [5] at bringing Sublime Text's -awesome multiple selection [6] feature into Vim, but none so far have been in -my opinion a faithful port that is simplistic to use, yet powerful and -intuitive enough for an existing Vim user. *vim-multiple-cursors* is yet -another attempt at that. - -============================================================================== -2. Usage *multiple-cursors-usage* - -Out of the box, all you need to know is a single key CTRL-N. Pressing the key -in Normal mode highlights the current word under the cursor in Visual mode and -places a virtual cursor at the end of it. Pressing it again finds the next -ocurrence and places another virtual cursor at the end of the visual -selection. If you select multiple lines in Visual mode, pressing the key puts -a virtual cursor at every line and leaves you in Normal mode. - -After you've marked all your locations with CTRL-N, you can change the visual -selection with normal Vim motion commands in Visual mode. You could go to -Normal mode by pressing v and wield your motion commands there. Single key -command to switch to Insert mode such as `c` or `s` from Visual mode or `i`, -`a`, `I`, `A` in Normal mode should work without any issues. - -At any time, you can press to exit back to regular Vim. - -Two additional keys are also mapped: - -CTRL-P in Visual mode will remove the current virtual cursor and go back to -the previous virtual cursor location. This is useful if you are trigger happy -with Ctrl-n and accidentally went too far. - -CTRL-X in Visual mode will remove the current virtual cursor and skip to the -next virtual cursor location. This is useful if you don't want the current -selection to be a candidate to operate on later. - -You can also add multiple cursors using a regular expression. The command -*MultipleCursorsFind* accepts a range and a pattern, and it will create a -virtual cursor at the end of every match within the range. If no range is -passed in, then it defaults to the entire buffer. - -NOTE: If at any time you have lingering cursors on screen, you can press -CTRL-N in Normal mode and it will remove all prior cursors before starting a -new one. - -============================================================================== -3. Mappings *multiple-cursors-mappings* - -*g:multi_cursor_use_default_mapping* (Default: 1) - -Out of the box, only the single key CTRL-N is mapped in regular Vim's Normal -mode and Visual mode to provide the functionality mentioned above. CTRL-N, -CTRL-P, CTRL-X, and are mapped in the special multicursor mode once -you've added at least one virtual cursor to the buffer. If you don't like the -plugin taking over your favorite key bindings, you can turn off the default -with > - - let g:multi_cursor_use_default_mapping=0 -< - -*g:multi_cursor_next_key* (Default: '') -*g:multi_cursor_prev_key* (Default: '') -*g:multi_cursor_skip_key* (Default: '') -*g:multi_cursor_quit_key* (Default: '') -You can map the 'next', 'previous', 'skip', and 'exit' keys like the -following: > - - " Default mapping - let g:multi_cursor_next_key='' - let g:multi_cursor_prev_key='' - let g:multi_cursor_skip_key='' - let g:multi_cursor_quit_key='' -< - -*g:multi_cursor_start_key* (Default: 'g:multi_cursor_next_key') -By default, the same key is used to enter multicursor mode as to select the -next cursor location. If you want to use a different key to start multicursor -mode than for selecting the next location, do like the following: > - - " Map start key separately from next key - let g:multi_cursor_start_key='' -< - -*g:multi_cursor_start_word_key* -When multicursor mode is started, it selects current word without -boundaries, i.e. it behaves like `g*`. If you want to use word boundaries in -Normal mode (as `*` does) but still have old behaviour up your sleeve, you can -do the following: > - - let g:multi_cursor_start_key='g' - let g:multi_cursor_start_word_key='' -< - -In this configuration will start multicursor mode using word boundaries -(but only in Normal mode, as it does not make much sense to use it in Visual -mode). Old behaviour without word boundaries is still available using -g. - -IMPORTANT: Please note that currently only single keystrokes and special -keys can be mapped. This contraint is also the reason why multikey commands -such as `ciw` do not work and cause unexpected behavior in Normal mode. This -means that a mapping like `n` will NOT work correctly. For a list of -special keys that are supported, see |key-notation| - -NOTE: Please make sure to always map something to |g:multi_cursor_quit_key|, -otherwise you'll have a tough time quitting from multicursor mode. - -NOTE: Prior to version 1.3, the recommended way to map the keys is using the -expression quote syntax in Vim, using something like `"\"` or `"\"` -(see h: expr-quote). After 1.3, the recommended way is to use a raw string -like above. If your key mappings don't appear to work, give the new syntax a -try. - -============================================================================== -4. Global Options *multiple-cursors-global-options* - -Currently there are four additional global settings one can tweak: - -*g:multi_cursor_exit_from_visual_mode* (Default: 1) - -If set to 0, then pressing |g:multi_cursor_quit_key| in Visual mode will not -quit and delete all existing cursors. This is useful if you want to press -Escape and go back to Normal mode, and still be able to operate on all the -cursors. - -*g:multi_cursor_exit_from_insert_mode* (Default: 1) - -If set to 0, then pressing |g:multi_cursor_quit_key| in Insert mode will not -quit and delete all existing cursors. This is useful if you want to press -Escape and go back to Normal mode, and still be able to operate on all the -cursors. - -*g:multi_cursor_insert_maps* (Default: `{}`) - -Any key in this map (values are ignored) will cause multi-cursor _Insert_ mode -to pause for `timeoutlen` waiting for map completion just like normal vim. -Otherwise keys mapped in insert mode are ignored when multiple cursors are -active. For example, setting it to `{'\':1}` will make insert-mode mappings -beginning with the default leader key work in multi-cursor mode. You have to -manually set this because vim doesn't provide a way to see which keys _start_ -mappings. - -*g:multi_cursor_normal_maps* (Default: see below) - -Default value: `{'!':1, '@':1, '=':1, 'q':1, 'r':1, 't':1, 'T':1, 'y':1, '[':1, ']':1, '\':1, 'd':1, 'f':1, 'F':1, 'g':1, '"':1, 'z':1, 'c':1, 'm':1, '<':1, '>':1}` - -Any key in this map (values are ignored) will cause multi-cursor _Normal_ mode -to pause for map completion just like normal vim. Otherwise keys mapped in -normal mode will "fail to replay" when multiple cursors are active. For example, -changing it from `{}` to `{'d':1}` makes normal-mode mappings beginning with `d` -(such as `dw` to delete a word) work in multi-cursor mode. - -*g:multi_cursor_visual_maps* (Default: ) - -Default value: `{'i':1, 'a':1, 'f':1, 'F':1, 't':1, 'T':1}` - -Any key in this map (values are ignored) will cause multi-cursor _Visual_ mode -to pause for map completion just like normal vim. Otherwise keys mapped in -visual mode will "fail to replay" when multiple cursors are active. For example, -changing it from `{}` to `{'i':1}` makes visual-mode mappings beginning with `i` -(such as `it` to select an "inner tag block") work in multi-cursor mode. - -The default list contents should work for anybody, unless they have remapped a -key from an operator-pending command to a non-operator-pending command or -vice versa. - -These keys must be manually listed because vim doesn't provide a way to -automatically see which keys _start_ mappings, and trying to run motion commands -such as `j` as if they were operator-pending commands can break things. - - -The plugin uses the highlight group `multiple_cursors_cursor` and -`multiple_cursors_visual` to highlight the virtual cursors and their visual -selections respectively. You can customize them by putting something similar -like the following in your vimrc: > - - " Default highlighting (see help :highlight and help :highlight-link) - highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse - highlight link multiple_cursors_visual Visual - -< - -============================================================================== -5. Issues *multiple-cursors-issues* - -- Multi key commands like ciw do not work at the moment -- All user input typed before Vim is able to fan out the last operation to all - cursors is lost. This is a implementation decision to keep the input - perfectly synced in all locations, at the cost of potentially losing user - input. -- Select mode is not implemented - -============================================================================== -6. Contributing *multiple-cursors-contributing* - -The project is hosted on Github. Patches, feature requests and suggestions are -always welcome! - -Find the latest version of the plugin here: - http://github.com/terryma/vim-multiple-cursors - -============================================================================== -7. License *multiple-cursors-license* - -The project is licensed under the MIT license [7]. Copyrigth 2013 Terry Ma - -============================================================================== -8. Credit *multiple-cursors-credit* - -The plugin is obviously inspired by Sublime Text's awesome multiple selection -[6] feature. Some inspiration was also taken from Emac's multiple cursors [8] -implementation. - -============================================================================== -9. References *multiple-cursors-references* - -[1] https://github.com/paradigm/vim-multicursor -[2] https://github.com/felixr/vim-multiedit -[3] https://github.com/hlissner/vim-multiedit -[4] https://github.com/adinapoli/vim-markmultiple -[5] https://github.com/AndrewRadev/multichange.vim -[6] http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html -[7] http://opensource.org/licenses/MIT -[8] https://github.com/magnars/multiple-cursors.el - - vim:tw=78:sw=4:ft=help:norl: diff --git a/.vim/bundle/vim-multiple-cursors/doc/tags b/.vim/bundle/vim-multiple-cursors/doc/tags deleted file mode 100644 index 0a5893b..0000000 --- a/.vim/bundle/vim-multiple-cursors/doc/tags +++ /dev/null @@ -1,25 +0,0 @@ -MultipleCursorsFind multiple_cursors.txt /*MultipleCursorsFind* -g:multi_cursor_exit_from_insert_mode multiple_cursors.txt /*g:multi_cursor_exit_from_insert_mode* -g:multi_cursor_exit_from_visual_mode multiple_cursors.txt /*g:multi_cursor_exit_from_visual_mode* -g:multi_cursor_insert_maps multiple_cursors.txt /*g:multi_cursor_insert_maps* -g:multi_cursor_next_key multiple_cursors.txt /*g:multi_cursor_next_key* -g:multi_cursor_normal_maps multiple_cursors.txt /*g:multi_cursor_normal_maps* -g:multi_cursor_prev_key multiple_cursors.txt /*g:multi_cursor_prev_key* -g:multi_cursor_quit_key multiple_cursors.txt /*g:multi_cursor_quit_key* -g:multi_cursor_skip_key multiple_cursors.txt /*g:multi_cursor_skip_key* -g:multi_cursor_start_key multiple_cursors.txt /*g:multi_cursor_start_key* -g:multi_cursor_start_word_key multiple_cursors.txt /*g:multi_cursor_start_word_key* -g:multi_cursor_use_default_mapping multiple_cursors.txt /*g:multi_cursor_use_default_mapping* -g:multi_cursor_visual_maps multiple_cursors.txt /*g:multi_cursor_visual_maps* -multiple-cursors-contents multiple_cursors.txt /*multiple-cursors-contents* -multiple-cursors-contributing multiple_cursors.txt /*multiple-cursors-contributing* -multiple-cursors-credit multiple_cursors.txt /*multiple-cursors-credit* -multiple-cursors-global-options multiple_cursors.txt /*multiple-cursors-global-options* -multiple-cursors-intro multiple_cursors.txt /*multiple-cursors-intro* -multiple-cursors-issues multiple_cursors.txt /*multiple-cursors-issues* -multiple-cursors-license multiple_cursors.txt /*multiple-cursors-license* -multiple-cursors-mappings multiple_cursors.txt /*multiple-cursors-mappings* -multiple-cursors-references multiple_cursors.txt /*multiple-cursors-references* -multiple-cursors-usage multiple_cursors.txt /*multiple-cursors-usage* -vim-multiple-cursors multiple_cursors.txt /*vim-multiple-cursors* -vim-multiple-cursors.txt multiple_cursors.txt /*vim-multiple-cursors.txt* diff --git a/.vim/bundle/vim-multiple-cursors/plugin/multiple_cursors.vim b/.vim/bundle/vim-multiple-cursors/plugin/multiple_cursors.vim deleted file mode 100644 index 6595bc3..0000000 --- a/.vim/bundle/vim-multiple-cursors/plugin/multiple_cursors.vim +++ /dev/null @@ -1,89 +0,0 @@ -"=============================================================================== -" File: multiple_cursors.vim -" Author: Terry Ma -" Description: Emulate Sublime Text's multi selection feature -" Potential Features: -" - Create a blinking cursor effect? Good place to do it would be instead of -" waiting for user input, cycle through the highlight -" - Integrate with the status line? Maybe show a special multicursor mode? -" - Support mouse? Ctrl/Cmd click to set cursor? -"=============================================================================== -let s:save_cpo = &cpo -set cpo&vim - -function! s:init_settings(settings) - for [key, value] in items(a:settings) - let sub = '' - if type(value) == 0 - let sub = '%d' - elseif type(value) == 1 - let sub = '"%s"' - endif - let fmt = printf("let g:multi_cursor_%%s=get(g:, 'multi_cursor_%%s', %s)", - \ sub) - exec printf(fmt, key, key, value) - endfor -endfunction - -" Settings -let s:settings = { - \ 'exit_from_visual_mode': 1, - \ 'exit_from_insert_mode': 1, - \ 'use_default_mapping': 1, - \ 'debug_latency': 0, - \ } - -let s:settings_if_default = { - \ 'quit_key': '', - \ 'next_key': '', - \ 'prev_key': '', - \ 'skip_key': '', - \ } - -let s:default_insert_maps = {} -let s:default_normal_maps = {'!':1, '@':1, '=':1, 'q':1, 'r':1, 't':1, 'T':1, 'y':1, '[':1, ']':1, '\':1, 'd':1, 'f':1, 'F':1, 'g':1, '"':1, 'z':1, 'c':1, 'm':1, '<':1, '>':1} -let s:default_visual_maps = {'i':1, 'a':1, 'f':1, 'F':1, 't':1, 'T':1} - -let g:multi_cursor_insert_maps = - \ get(g:, 'multi_cursor_insert_maps', s:default_insert_maps) -let g:multi_cursor_normal_maps = - \ get(g:, 'multi_cursor_normal_maps', s:default_normal_maps) -let g:multi_cursor_visual_maps = - \ get(g:, 'multi_cursor_visual_maps', s:default_visual_maps) - -call s:init_settings(s:settings) - -if g:multi_cursor_use_default_mapping - call s:init_settings(s:settings_if_default) -endif - -if !exists('g:multi_cursor_start_word_key') - if exists('g:multi_cursor_start_key') - let g:multi_cursor_start_word_key = g:multi_cursor_start_key - elseif exists('g:multi_cursor_next_key') - let g:multi_cursor_start_word_key = g:multi_cursor_next_key - endif -endif - -" External mappings -if exists('g:multi_cursor_start_key') - exec 'nnoremap '.g:multi_cursor_start_key. - \' :call multiple_cursors#new("n", 0)' - exec 'xnoremap '.g:multi_cursor_start_key. - \' :call multiple_cursors#new("v", 0)' -endif - -if exists('g:multi_cursor_start_word_key') - exec 'nnoremap '.g:multi_cursor_start_word_key. - \' :call multiple_cursors#new("n", 1)' - " In Visual mode word boundary is not used - exec 'xnoremap '.g:multi_cursor_start_word_key. - \' :call multiple_cursors#new("v", 0)' -endif - -" Commands -command! -nargs=1 -range=% MultipleCursorsFind - \ call multiple_cursors#find(, , ) - -let &cpo = s:save_cpo -unlet s:save_cpo diff --git a/.vim/bundle/vim-multiple-cursors/spec/benchmark_spec.rb b/.vim/bundle/vim-multiple-cursors/spec/benchmark_spec.rb deleted file mode 100644 index 73c81c5..0000000 --- a/.vim/bundle/vim-multiple-cursors/spec/benchmark_spec.rb +++ /dev/null @@ -1,142 +0,0 @@ -require 'vimrunner' -require 'vimrunner/rspec' - -Vimrunner::RSpec.configure do |config| - - # Use a single Vim instance for the test suite. Set to false to use an - # instance per test (slower, but can be easier to manage). - config.reuse_server = false - - # Decide how to start a Vim instance. In this block, an instance should be - # spawned and set up with anything project-specific. - config.start_vim do - # vim = Vimrunner.start - # vim = Vimrunner::Server.new("/usr/local/bin/vim").start - - # Or, start a GUI instance: - vim = Vimrunner.start_gvim - - # Setup your plugin in the Vim instance - plugin_path = File.expand_path('../..', __FILE__) - vim.add_plugin(plugin_path, 'plugin/multiple_cursors.vim') - - # The returned value is the Client available in the tests. - vim - end -end - -def set_file_content(string) - string = normalize_string_indent(string) - File.open(filename, 'w'){ |f| f.write(string) } - vim.edit filename -end - -def get_file_content() - vim.write - IO.read(filename).strip -end - -def before(string) - set_file_content(string) -end - -def after(string) - get_file_content().should eq normalize_string_indent(string) - type ":q" -end - -def type(string) - string.scan(/<.*?>|./).each do |key| - if /<.*>/.match(key) - vim.feedkeys "\\#{key}" - else - vim.feedkeys key - end - end - sleep 0.2 -end - -describe "Multiple Cursors" do - let(:filename) { 'test.txt' } - let(:options) { [] } - - specify "#benchmark" do - before <<-EOF - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - hello - EOF - - # type ':profile start /tmp/test.result' - # type ':profile! file *multiple_cursors.vim' - type ':let g:multi_cursor_debug_latency=1' - - type 'VGVchellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello' - - type ':echo multiple_cursors#get_latency_debug_file()' - sleep 3 - latency_file = vim.command 'echo multiple_cursors#get_latency_debug_file()' - puts 'latency file = ' + latency_file - - after <<-EOF - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello - EOF - end - -end diff --git a/.vim/bundle/vim-multiple-cursors/spec/multiple_cursors_spec.rb b/.vim/bundle/vim-multiple-cursors/spec/multiple_cursors_spec.rb deleted file mode 100644 index 2d92e5a..0000000 --- a/.vim/bundle/vim-multiple-cursors/spec/multiple_cursors_spec.rb +++ /dev/null @@ -1,817 +0,0 @@ -# -*- encoding: utf-8 -*- -require 'spec_helper' - -def set_file_content(string) - string = normalize_string_indent(string) - File.open(filename, 'w'){ |f| f.write(string) } - vim.edit filename -end - -def get_file_content() - vim.write - IO.read(filename).strip -end - -def before(string) - options.each { |x| vim.command(x) } - set_file_content(string) -end - -def after(string) - expect(get_file_content()).to eq normalize_string_indent(string) -end - -def type(string) - string.scan(/<.*?>|./).each do |key| - if /<.*>/.match(key) - vim.feedkeys "\\#{key}" - else - vim.feedkeys key - end - end -end - -describe "Multiple Cursors op pending & exit from insert|visual mode" do - let(:filename) { 'test.txt' } - let(:options) { ['let g:multi_cursor_exit_from_insert_mode = 0', - 'let g:multi_cursor_exit_from_visual_mode = 0'] } - # the default value of g:multi_cursor_normal_maps already works - # for testing operator-pending - - specify "#paste from unnamed register to 3 cursors" do - before <<-EOF - yankme - a b c - a b c - a b c - EOF - - type 'yiwjvwwp' - - after <<-EOF - yankme - a b cyankme - a b cyankme - a b cyankme - EOF - end - - specify "#paste buffer normal caw then p" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwcawbP' - - after <<-EOF - jan hello world - feb hello world - mar hello world - EOF - end - - specify "#paste buffer normal C then ABC then p" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwCABC p' - - after <<-EOF - hello ABC jan world - hello ABC feb world - hello ABC mar world - EOF - end - - specify "#paste buffer normal daw then P" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwdawbP' - - after <<-EOF - jan hello world - feb hello world - mar hello world - EOF - end - - specify "#paste buffer normal D then P" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwwhDbhP' - - after <<-EOF - hello world jan - hello world feb - hello world mar - EOF - end - - specify "#paste buffer normal s then p" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vws1p' - - after <<-EOF - hello 1jan world - hello 1feb world - hello 1mar world - EOF - end - -end - -describe "Multiple Cursors when normal_maps is empty" do - let(:filename) { 'test.txt' } - let(:options) { ['let g:multi_cursor_normal_maps = {}'] } - - # Operator-pending commands are handled correctly thanks to their inclusion - # in `g:multi_cursor_normal_maps`. - # - # When an operator-pending command like 'd' is missing from that setting's - # value, then it should result in a no-op, but we should still remain in - # multicursor mode. - specify "#normal mode 'd'" do - before <<-EOF - hello - hello - EOF - - type 'vdx' - - after <<-EOF - hell - hell - EOF - end - -end - -describe "Multiple Cursors when visual_maps is empty" do - let(:filename) { 'test.txt' } - let(:options) { ['let g:multi_cursor_visual_maps = {}'] } - - # Operator-pending commands are handled correctly thanks to their inclusion - # in `g:multi_cursor_visual_maps`. - # - # When an operator-pending command like 'f' is missing from that setting's - # value, then it should result in a no-op, but we should still remain in - # multicursor mode. - specify "#visual mode 'i'" do - before <<-EOF - hello world x - hello world x - EOF - - type 'fwfx' - - after <<-EOF - hello x - hello x - EOF - end - -end - -describe "Multiple Cursors" do - let(:filename) { 'test.txt' } - let(:options) { ['set autoindent'] } - - specify "#paste buffer normal x then p" do - before <<-EOF - jan - feb - mar - EOF - - type 'jjxp' - - after <<-EOF - ajn - efb - amr - EOF - end - - specify "#paste buffer visual y then p" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwvelywhp' - - after <<-EOF - hello jan jan world - hello feb feb world - hello mar mar world - EOF - end - - specify "#paste buffer initial visual y then P" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'wywbp' - - after <<-EOF - jan jan world - jan feb world - jan mar world - EOF - end - - specify "#paste buffer visual y then P" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwvely^P' - - after <<-EOF - jan hello jan world - feb hello feb world - mar hello mar world - EOF - end - - specify "#paste buffer visual Y then P" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'vwvY^P' - - after <<-EOF - hello jan world - hello jan world - hello feb world - hello feb world - hello mar world - hello mar world - EOF - end - - specify "#multiline replacement" do - before <<-EOF - hello - hello - hello - EOF - - type 'cworld' - - after <<-EOF - world - world - world - EOF - end - - specify "#single line replacement" do - before <<-EOF - hello hello hello - EOF - - type 'cworld' - - after <<-EOF - world world world - EOF - end - - specify "#mixed line replacement" do - before <<-EOF - hello hello - hello - EOF - - type 'cworld' - - after <<-EOF - world world - world - EOF - end - - specify "#new line in insert mode" do - before <<-EOF - hello - hello - EOF - - type 'chelloworld' - - after <<-EOF - hello - world - hello - world - EOF - end - - specify "#new line in insert mode middle of line" do - before <<-EOF - hello world - hello world - EOF - - type 'vlxi' - - after <<-EOF - hello - world - hello - world - EOF - end - - specify "#multiple new lines on one line in insert mode" do - before <<-EOF - 'a','b','c','d','e' - EOF - - type 'f,vc' - - after <<-EOF - 'a' - 'b' - 'c' - 'd' - 'e' - EOF - end - - specify "#multiple new lines on one line in insert mode with indents" do - before <<-EOF - 'a','b','c','d','e' - EOF - - type '4if,vc:%s/^/^' - - after <<-EOF - ^ 'a' - ^ 'b' - ^ 'c' - ^ 'd' - ^ 'e' - EOF - end - - specify "#normal mode 'o'" do - before <<-EOF - hello - hello - EOF - - type 'voworld' - - after <<-EOF - hello - world - hello - world - EOF - end - - specify "#normal mode 'O'" do - before <<-EOF - hello - hello - EOF - - type 'vOworld' - - after <<-EOF - world - hello - world - hello - EOF - end - - specify "#find command basic" do - before <<-EOF - hello - hello - EOF - - vim.normal ':MultipleCursorsFind hello' - type 'cworld' - - after <<-EOF - world - world - EOF - end - - specify "#find command start-of-line" do - before <<-EOF - hello - world - - hello - world - EOF - - vim.normal ':MultipleCursorsFind ^' - type 'Ibegin' - - after <<-EOF - beginhello - beginworld - begin - beginhello - beginworld - EOF - end - - specify "#find command end-of-line" do - before <<-EOF - hello - world - - hello - world - EOF - - vim.normal ':MultipleCursorsFind $' - type 'Iend' - - after <<-EOF - helloend - worldend - end - helloend - worldend - EOF - end - - specify "#visual line mode replacement" do - before <<-EOF - hello world - hello world - EOF - - type 'Vchi!' - - after <<-EOF - hi! - hi! - EOF - end - - specify "#skip key" do - before <<-EOF - hello - hello - hello - EOF - - type 'cworld' - - after <<-EOF - world - hello - world - EOF - end - - specify "#prev key" do - before <<-EOF - hello - hello - hello - EOF - - type 'cworld' - - after <<-EOF - world - world - hello - EOF - end - - specify "#visual mode 'i'" do - before <<-EOF - hi (hello world jan) bye - hi (hello world feb) bye - hi (hello world mar) bye - EOF - - type 'fwibcone' - - after <<-EOF - hi (one) bye - hi (one) bye - hi (one) bye - EOF - end - - specify "#visual mode 'a'" do - before <<-EOF - hi (hello world jan) bye - hi (hello world feb) bye - hi (hello world mar) bye - EOF - - type 'fwabcone' - - after <<-EOF - hi one bye - hi one bye - hi one bye - EOF - end - - specify "#visual mode 'f'" do - before <<-EOF - hi (hello world jan) bye - hi (hello world feb) bye - hi (hello world mar) bye - EOF - - type 'fwf)cone' - - after <<-EOF - hi (hello one bye - hi (hello one bye - hi (hello one bye - EOF - end - - specify "#visual mode 'F'" do - before <<-EOF - hi (hello world jan) bye - hi (hello world feb) bye - hi (hello world mar) bye - EOF - - type 'fwF(cbefore' - - after <<-EOF - hi beforeorld jan) bye - hi beforeorld feb) bye - hi beforeorld mar) bye - EOF - end - - specify "#visual mode 't'" do - before <<-EOF - hello.jan - hello hi.feb - hello hi bye.mar - EOF - - type 't.cone' - - after <<-EOF - one.jan - one.feb - one.mar - EOF - end - - specify "#visual mode 'T'" do - before <<-EOF - jan.world - feb.hi world - mar.bye hi world - EOF - - type 'fwT.cbefore' - - after <<-EOF - jan.beforeorld - feb.beforeorld - mar.beforeorld - EOF - end - - specify "#visual line mode 'f'" do - before <<-EOF - hello jan world - hello feb world - hello mar world - EOF - - type 'VfwvAafter' - - after <<-EOF - hello jan wafterorld - hello feb wafterorld - hello mar wafterorld - EOF - end - - specify "#visual mode 'I'" do - before <<-EOF - hello world jan - hello world feb - hello world mar - EOF - - type 'wIbefore' - - after <<-EOF - hello beforeworld jan - hello beforeworld feb - hello beforeworld mar - EOF - end - - specify "#visual mode 'A'" do - before <<-EOF - hello world jan - hello world feb - hello world mar - EOF - - type 'wAafter' - - after <<-EOF - hello worldafter jan - hello worldafter feb - hello worldafter mar - EOF - end - - specify "#resize regions visual mode 'I'" do - before <<-EOF - hello world jan - hello world feb - hello world mar - EOF - - type 'whhhIbefore' - - after <<-EOF - hello beforeworld jan - hello beforeworld feb - hello beforeworld mar - EOF - end - - specify "#resize regions visual mode 'A'" do - before <<-EOF - hello world jan - hello world feb - hello world mar - EOF - - type 'whhhAbefore' - - after <<-EOF - hello wobeforerld jan - hello wobeforerld feb - hello wobeforerld mar - EOF - end - - specify "#no word boundries visual mode 'I'" do - before <<-EOF - hello hibye world - hello hibye world - hello hibye world - EOF - - vim.normal ':MultipleCursorsFind bye' - type 'Ibefore' - - after <<-EOF - hello hibeforebye world - hello hibeforebye world - hello hibeforebye world - EOF - end - - specify "#variable-length regions visual mode 'I'" do - before <<-EOF - hello hii world - hello hiiii world - hello hiiiiii world - EOF - - vim.normal ':MultipleCursorsFind \' - type 'Ibefore' - - after <<-EOF - hello beforehii world - hello beforehiiii world - hello beforehiiiiii world - EOF - end - - specify "#normal mode 'I'" do - before <<-EOF - hello - hello - EOF - - type 'vIworld ' - - after <<-EOF - world hello - world hello - EOF - end - - specify "#normal mode 'A'" do - before <<-EOF - hello - hello - EOF - - type 'vA world' - - after <<-EOF - hello world - hello world - EOF - end - - specify "#undo" do - before <<-EOF - hello - hello - EOF - - type 'cworldu' - - after <<-EOF - hello - hello - EOF - end - - specify "#multiline visual mode" do - before <<-EOF - hello - hello - EOF - - type 'VjA world' - - after <<-EOF - hello world - hello world - EOF - end - - specify "#set paste mode" do - before <<-EOF - hello - hello - EOF - - type ':set pastecworld:set nopaste' - - after <<-EOF - world - world - EOF - end - - specify "#multi-byte strings" do - before <<-EOF - こんにちわビム - 世界の中心でビムを叫ぶ - ビム大好き - EOF - - type '/ビムcヴィム' - - after <<-EOF - こんにちわヴィム - 世界の中心でヴィムを叫ぶ - ヴィム大好き - EOF - end - -end diff --git a/.vim/bundle/vim-multiple-cursors/spec/spec_helper.rb b/.vim/bundle/vim-multiple-cursors/spec/spec_helper.rb deleted file mode 100644 index 4e0ad99..0000000 --- a/.vim/bundle/vim-multiple-cursors/spec/spec_helper.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'vimrunner' -require 'vimrunner/rspec' - -Vimrunner::RSpec.configure do |config| - - # Use a single Vim instance for the test suite. Set to false to use an - # instance per test (slower, but can be easier to manage). - config.reuse_server = false - - # Decide how to start a Vim instance. In this block, an instance should be - # spawned and set up with anything project-specific. - config.start_vim do - # vim = Vimrunner.start - - # Or, start a GUI instance: - vim = Vimrunner.start_gvim - - # Setup your plugin in the Vim instance - plugin_path = File.expand_path('../..', __FILE__) - vim.add_plugin(plugin_path, 'plugin/multiple_cursors.vim') - - # The returned value is the Client available in the tests. - vim - end -end diff --git a/.vim/bundle/vim-surround/README.markdown b/.vim/bundle/vim-surround/README.markdown deleted file mode 100644 index fef61a8..0000000 --- a/.vim/bundle/vim-surround/README.markdown +++ /dev/null @@ -1,97 +0,0 @@ -surround.vim -============ - -Surround.vim is all about "surroundings": parentheses, brackets, quotes, -XML tags, and more. The plugin provides mappings to easily delete, -change and add such surroundings in pairs. - -It's easiest to explain with examples. Press `cs"'` inside - - "Hello world!" - -to change it to - - 'Hello world!' - -Now press `cs'` to change it to - - Hello world! - -To go full circle, press `cst"` to get - - "Hello world!" - -To remove the delimiters entirely, press `ds"`. - - Hello world! - -Now with the cursor on "Hello", press `ysiw]` (`iw` is a text object). - - [Hello] world! - -Let's make that braces and add some space (use `}` instead of `{` for no -space): `cs]{` - - { Hello } world! - -Now wrap the entire line in parentheses with `yssb` or `yss)`. - - ({ Hello } world!) - -Revert to the original text: `ds{ds)` - - Hello world! - -Emphasize hello: `ysiw` - - Hello world! - -Finally, let's try out visual mode. Press a capital V (for linewise -visual mode) followed by `S

`. - -

- Hello world! -

- -This plugin is very powerful for HTML and XML editing, a niche which -currently seems underfilled in Vim land. (As opposed to HTML/XML -*inserting*, for which many plugins are available). Adding, changing, -and removing pairs of tags simultaneously is a breeze. - -The `.` command will work with `ds`, `cs`, and `yss` if you install -[repeat.vim](https://github.com/tpope/vim-repeat). - -Installation ------------- - -If you don't have a preferred installation method, I recommend -installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and -then simply copy and paste: - - cd ~/.vim/bundle - git clone git://github.com/tpope/vim-surround.git - -Once help tags have been generated, you can view the manual with -`:help surround`. - -Contributing ------------- - -See the contribution guidelines for -[pathogen.vim](https://github.com/tpope/vim-pathogen#readme). - -Self-Promotion --------------- - -Like surround.vim? Follow the repository on -[GitHub](https://github.com/tpope/vim-surround) and vote for it on -[vim.org](http://www.vim.org/scripts/script.php?script_id=1697). And if -you're feeling especially charitable, follow [tpope](http://tpo.pe/) on -[Twitter](http://twitter.com/tpope) and -[GitHub](https://github.com/tpope). - -License -------- - -Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. -See `:help license`. diff --git a/.vim/bundle/vim-surround/doc/surround.txt b/.vim/bundle/vim-surround/doc/surround.txt deleted file mode 100644 index 674b6a9..0000000 --- a/.vim/bundle/vim-surround/doc/surround.txt +++ /dev/null @@ -1,207 +0,0 @@ -*surround.txt* Plugin for deleting, changing, and adding "surroundings" - -Author: Tim Pope -License: Same terms as Vim itself (see |license|) - -This plugin is only available if 'compatible' is not set. - -INTRODUCTION *surround* - -This plugin is a tool for dealing with pairs of "surroundings." Examples -of surroundings include parentheses, quotes, and HTML tags. They are -closely related to what Vim refers to as |text-objects|. Provided -are mappings to allow for removing, changing, and adding surroundings. - -Details follow on the exact semantics, but first, consider the following -examples. An asterisk (*) is used to denote the cursor position. - - Old text Command New text ~ - "Hello *world!" ds" Hello world! - [123+4*56]/2 cs]) (123+456)/2 - "Look ma, I'm *HTML!" cs" Look ma, I'm HTML! - if *x>3 { ysW( if ( x>3 ) { - my $str = *whee!; vllllS' my $str = 'whee!'; - -While a few features of this plugin will work in older versions of Vim, -Vim 7 is recommended for full functionality. - -MAPPINGS *surround-mappings* - -Delete surroundings is *ds* . The next character given determines the target -to delete. The exact nature of the target is explained in |surround-targets| -but essentially it is the last character of a |text-object|. This mapping -deletes the difference between the "i"nner object and "a"n object. This is -easiest to understand with some examples: - - Old text Command New text ~ - "Hello *world!" ds" Hello world! - (123+4*56)/2 ds) 123+456/2 -
Yo!*
dst Yo! - -Change surroundings is *cs* . It takes two arguments, a target like with -|ds|, and a replacement. *cS* changes surroundings, placing the surrounded -text on its own line(s) like |yS|. Details about the second argument can be -found below in |surround-replacements|. Once again, examples are in order. - - Old text Command New text ~ - "Hello *world!" cs"' 'Hello world!' - "Hello *world!" cs" Hello world! - (123+4*56)/2 cs)] [123+456]/2 - (123+4*56)/2 cs)[ [ 123+456 ]/2 -
Yo!*
cst

Yo!

- -*ys* takes a valid Vim motion or text object as the first object, and wraps -it using the second argument as with |cs|. (It's a stretch, but a good -mnemonic for "ys" is "you surround".) - - Old text Command New text ~ - Hello w*orld! ysiw) Hello (world)! - -As a special case, *yss* operates on the current line, ignoring leading -whitespace. - - Old text Command New text ~ - Hello w*orld! yssB {Hello world!} - -There is also *yS* and *ySS* which indent the surrounded text and place it -on a line of its own. - -In visual mode, a simple "S" with an argument wraps the selection. This is -referred to as the *vS* mapping, although ordinarily there will be -additional keystrokes between the v and S. In linewise visual mode, the -surroundings are placed on separate lines and indented. In blockwise visual -mode, each line is surrounded. - -A "gS" in visual mode, known as *vgS* , behaves similarly. In linewise visual -mode, the automatic indenting is suppressed. In blockwise visual mode, this -enables surrounding past the end of the line with 'virtualedit' set (there -seems to be no way in Vim Script to differentiate between a jagged end of line -selection and a virtual block selected past the end of the line, so two maps -were needed). - - *i_CTRL-G_s* *i_CTRL-G_S* -Finally, there is an experimental insert mode mapping on s and . -Beware that the latter won't work on terminals with flow control (if you -accidentally freeze your terminal, use to unfreeze it). The mapping -inserts the specified surroundings and puts the cursor between them. If, -immediately after the mapping and before the replacement, a second or -carriage return is pressed, the prefix, cursor, and suffix will be placed on -three separate lines. S (not s) also exhibits this behavior. - -TARGETS *surround-targets* - -The |ds| and |cs| commands both take a target as their first argument. The -possible targets are based closely on the |text-objects| provided by Vim. -All targets are currently just one character. - -Eight punctuation marks, (, ), {, }, [, ], <, and >, represent themselves -and their counterparts. If the opening mark is used, contained whitespace is -also trimmed. The targets b, B, r, and a are aliases for ), }, ], and > -(the first two mirror Vim; the second two are completely arbitrary and -subject to change). - -Three quote marks, ', ", `, represent themselves, in pairs. They are only -searched for on the current line. - -A t is a pair of HTML or XML tags. See |tag-blocks| for details. Remember -that you can specify a numerical argument if you want to get to a tag other -than the innermost one. - -The letters w, W, and s correspond to a |word|, a |WORD|, and a |sentence|, -respectively. These are special in that they have nothing to delete, and -used with |ds| they are a no-op. With |cs|, one could consider them a -slight shortcut for ysi (cswb == ysiwb, more or less). - -A p represents a |paragraph|. This behaves similarly to w, W, and s above; -however, newlines are sometimes added and/or removed. - -REPLACEMENTS *surround-replacements* - -A replacement argument is a single character, and is required by |cs|, |ys|, -and |vS|. Undefined replacement characters (with the exception of alphabetic -characters) default to placing themselves at the beginning and end of the -destination, which can be useful for characters like / and |. - -If either ), }, ], or > is used, the text is wrapped in the appropriate pair -of characters. Similar behavior can be found with (, {, and [ (but not <), -which append an additional space to the inside. Like with the targets above, -b, B, r, and a are aliases for ), }, ], and >. To fulfill the common need for -code blocks in C-style languages, (which is really ) adds braces on -lines separate from the content. - -If t or < is used, Vim prompts for an HTML/XML tag to insert. You may specify -attributes here and they will be stripped from the closing tag. If replacing a -tag, its attributes are kept in the new tag. End your input with > to discard -the those attributes. If is used, the tags will appear on lines by -themselves. - -If s is used, a leading but not trailing space is added. This is useful for -removing parentheses from a function call with csbs. - -CUSTOMIZING *surround-customizing* - -The following adds a potential replacement on "-" (ASCII 45) in PHP files. -(To determine the ASCII code to use, :echo char2nr("-")). The carriage -return will be replaced by the original text. -> - autocmd FileType php let b:surround_45 = "" -< -This can be used in a PHP file as in the following example. - - Old text Command New text ~ - print "Hello *world!" yss- - -Additionally, one can use a global variable for globally available -replacements. -> - let g:surround_45 = "<% \r %>" - let g:surround_61 = "<%= \r %>" -< -Advanced, experimental, and subject to change: One can also prompt for -replacement text. The syntax for this is to surround the replacement in pairs -of low numbered control characters. If this sounds confusing, that's because -it is (but it makes the parsing easy). Consider the following example for a -LaTeX environment on the "l" replacement. -> - let g:surround_108 = "\\begin{\1environment: \1}\r\\end{\1\1}" -< -When this replacement is used, the user is prompted with an "environment: " -prompt for input. This input is inserted between each set of \1's. -Additional inputs up to \7 can be used. - -Furthermore, one can specify a regular expression substitution to apply. -> - let g:surround_108 = "\\begin{\1environment: \1}\r\\end{\1\r}.*\r\1}" -< -This will remove anything after the first } in the input when the text is -placed within the \end{} slot. The first \r marks where the pattern begins, -and the second where the replacement text begins. - -Here's a second example for creating an HTML
. The substitution cleverly -prompts for an id, but only adds id="" if it is non-blank. You may have to -read this one a few times slowly before you understand it. -> - let g:surround_{char2nr("d")} = "\r
" -< -Inputting text replacements is a proof of concept at this point. The ugly, -unintuitive interface and the brevity of the documentation reflect this. - -Finally, It is possible to always append a string to surroundings in insert -mode (and only insert mode). This is useful with certain plugins and mappings -that allow you to jump to such markings. -> - let g:surround_insert_tail = "<++>" -< -ISSUES *surround-issues* - -Vim could potentially get confused when deleting/changing occurs at the very -end of the line. Please report any repeatable instances of this. - -Do we need to use |inputsave()|/|inputrestore()| with the tag replacement? - -Indenting is handled haphazardly. Need to decide the most appropriate -behavior and implement it. Right now one can do :let b:surround_indent = 1 -(or the global equivalent) to enable automatic re-indenting by Vim via |=|; -should this be the default? - - vim:tw=78:ts=8:ft=help:norl: diff --git a/.vim/bundle/vim-surround/doc/tags b/.vim/bundle/vim-surround/doc/tags deleted file mode 100644 index 6935d68..0000000 --- a/.vim/bundle/vim-surround/doc/tags +++ /dev/null @@ -1,18 +0,0 @@ -cS surround.txt /*cS* -cs surround.txt /*cs* -ds surround.txt /*ds* -i_CTRL-G_S surround.txt /*i_CTRL-G_S* -i_CTRL-G_s surround.txt /*i_CTRL-G_s* -surround surround.txt /*surround* -surround-customizing surround.txt /*surround-customizing* -surround-issues surround.txt /*surround-issues* -surround-mappings surround.txt /*surround-mappings* -surround-replacements surround.txt /*surround-replacements* -surround-targets surround.txt /*surround-targets* -surround.txt surround.txt /*surround.txt* -vS surround.txt /*vS* -vgS surround.txt /*vgS* -yS surround.txt /*yS* -ySS surround.txt /*ySS* -ys surround.txt /*ys* -yss surround.txt /*yss* diff --git a/.vim/bundle/vim-surround/plugin/surround.vim b/.vim/bundle/vim-surround/plugin/surround.vim deleted file mode 100644 index 46f3252..0000000 --- a/.vim/bundle/vim-surround/plugin/surround.vim +++ /dev/null @@ -1,598 +0,0 @@ -" surround.vim - Surroundings -" Author: Tim Pope -" Version: 2.1 -" GetLatestVimScripts: 1697 1 :AutoInstall: surround.vim - -if exists("g:loaded_surround") || &cp || v:version < 700 - finish -endif -let g:loaded_surround = 1 - -" Input functions {{{1 - -function! s:getchar() - let c = getchar() - if c =~ '^\d\+$' - let c = nr2char(c) - endif - return c -endfunction - -function! s:inputtarget() - let c = s:getchar() - while c =~ '^\d\+$' - let c .= s:getchar() - endwhile - if c == " " - let c .= s:getchar() - endif - if c =~ "\\|\\|\0" - return "" - else - return c - endif -endfunction - -function! s:inputreplacement() - let c = s:getchar() - if c == " " - let c .= s:getchar() - endif - if c =~ "\" || c =~ "\" - return "" - else - return c - endif -endfunction - -function! s:beep() - exe "norm! \" - return "" -endfunction - -function! s:redraw() - redraw - return "" -endfunction - -" }}}1 - -" Wrapping functions {{{1 - -function! s:extractbefore(str) - if a:str =~ '\r' - return matchstr(a:str,'.*\ze\r') - else - return matchstr(a:str,'.*\ze\n') - endif -endfunction - -function! s:extractafter(str) - if a:str =~ '\r' - return matchstr(a:str,'\r\zs.*') - else - return matchstr(a:str,'\n\zs.*') - endif -endfunction - -function! s:fixindent(str,spc) - let str = substitute(a:str,'\t',repeat(' ',&sw),'g') - let spc = substitute(a:spc,'\t',repeat(' ',&sw),'g') - let str = substitute(str,'\(\n\|\%^\).\@=','\1'.spc,'g') - if ! &et - let str = substitute(str,'\s\{'.&ts.'\}',"\t",'g') - endif - return str -endfunction - -function! s:process(string) - let i = 0 - for i in range(7) - let repl_{i} = '' - let m = matchstr(a:string,nr2char(i).'.\{-\}\ze'.nr2char(i)) - if m != '' - let m = substitute(strpart(m,1),'\r.*','','') - let repl_{i} = input(match(m,'\w\+$') >= 0 ? m.': ' : m) - endif - endfor - let s = "" - let i = 0 - while i < strlen(a:string) - let char = strpart(a:string,i,1) - if char2nr(char) < 8 - let next = stridx(a:string,char,i+1) - if next == -1 - let s .= char - else - let insertion = repl_{char2nr(char)} - let subs = strpart(a:string,i+1,next-i-1) - let subs = matchstr(subs,'\r.*') - while subs =~ '^\r.*\r' - let sub = matchstr(subs,"^\r\\zs[^\r]*\r[^\r]*") - let subs = strpart(subs,strlen(sub)+1) - let r = stridx(sub,"\r") - let insertion = substitute(insertion,strpart(sub,0,r),strpart(sub,r+1),'') - endwhile - let s .= insertion - let i = next - endif - else - let s .= char - endif - let i += 1 - endwhile - return s -endfunction - -function! s:wrap(string,char,type,removed,special) - let keeper = a:string - let newchar = a:char - let s:input = "" - let type = a:type - let linemode = type ==# 'V' ? 1 : 0 - let before = "" - let after = "" - if type ==# "V" - let initspaces = matchstr(keeper,'\%^\s*') - else - let initspaces = matchstr(getline('.'),'\%^\s*') - endif - let pairs = "b()B{}r[]a<>" - let extraspace = "" - if newchar =~ '^ ' - let newchar = strpart(newchar,1) - let extraspace = ' ' - endif - let idx = stridx(pairs,newchar) - if newchar == ' ' - let before = '' - let after = '' - elseif exists("b:surround_".char2nr(newchar)) - let all = s:process(b:surround_{char2nr(newchar)}) - let before = s:extractbefore(all) - let after = s:extractafter(all) - elseif exists("g:surround_".char2nr(newchar)) - let all = s:process(g:surround_{char2nr(newchar)}) - let before = s:extractbefore(all) - let after = s:extractafter(all) - elseif newchar ==# "p" - let before = "\n" - let after = "\n\n" - elseif newchar ==# 's' - let before = ' ' - let after = '' - elseif newchar ==# ':' - let before = ':' - let after = '' - elseif newchar =~# "[tT\<]" - let dounmapp = 0 - let dounmapb = 0 - if !maparg(">","c") - let dounmapb = 1 - " Hide from AsNeeded - exe "cn"."oremap > >" - endif - let default = "" - if newchar ==# "T" - if !exists("s:lastdel") - let s:lastdel = "" - endif - let default = matchstr(s:lastdel,'<\zs.\{-\}\ze>') - endif - let tag = input("<",default) - if dounmapb - silent! cunmap > - endif - let s:input = tag - if tag != "" - let keepAttributes = ( match(tag, ">$") == -1 ) - let tag = substitute(tag,'>*$','','') - let attributes = "" - if keepAttributes - let attributes = matchstr(a:removed, '<[^ \t\n]\+\zs\_.\{-\}\ze>') - endif - let s:input = tag . '>' - if tag =~ '/$' - let tag = substitute(tag, '/$', '', '') - let before = '<'.tag.attributes.' />' - let after = '' - else - let before = '<'.tag.attributes.'>' - let after = '' - endif - if newchar == "\" - if type ==# "v" || type ==# "V" - let before .= "\n\t" - endif - if type ==# "v" - let after = "\n". after - endif - endif - endif - elseif newchar ==# 'l' || newchar == '\' - " LaTeX - let env = input('\begin{') - if env != "" - let s:input = env."\" - let env = '{' . env - let env .= s:closematch(env) - echo '\begin'.env - let before = '\begin'.env - let after = '\end'.matchstr(env,'[^}]*').'}' - endif - elseif newchar ==# 'f' || newchar ==# 'F' - let fnc = input('function: ') - if fnc != "" - let s:input = fnc."\" - let before = substitute(fnc,'($','','').'(' - let after = ')' - if newchar ==# 'F' - let before .= ' ' - let after = ' ' . after - endif - endif - elseif newchar ==# "\" - let fnc = input('function: ') - let s:input = fnc."\" - let before = '('.fnc.' ' - let after = ')' - elseif idx >= 0 - let spc = (idx % 3) == 1 ? " " : "" - let idx = idx / 3 * 3 - let before = strpart(pairs,idx+1,1) . spc - let after = spc . strpart(pairs,idx+2,1) - elseif newchar == "\" || newchar == "\" - let before = "{\n\t" - let after = "\n}" - elseif newchar !~ '\a' - let before = newchar - let after = newchar - else - let before = '' - let after = '' - endif - let after = substitute(after ,'\n','\n'.initspaces,'g') - if type ==# 'V' || (a:special && type ==# "v") - let before = substitute(before,' \+$','','') - let after = substitute(after ,'^ \+','','') - if after !~ '^\n' - let after = initspaces.after - endif - if keeper !~ '\n$' && after !~ '^\n' - let keeper .= "\n" - elseif keeper =~ '\n$' && after =~ '^\n' - let after = strpart(after,1) - endif - if before !~ '\n\s*$' - let before .= "\n" - if a:special - let before .= "\t" - endif - endif - endif - if type ==# 'V' - let before = initspaces.before - endif - if before =~ '\n\s*\%$' - if type ==# 'v' - let keeper = initspaces.keeper - endif - let padding = matchstr(before,'\n\zs\s\+\%$') - let before = substitute(before,'\n\s\+\%$','\n','') - let keeper = s:fixindent(keeper,padding) - endif - if type ==# 'V' - let keeper = before.keeper.after - elseif type =~ "^\" - " Really we should be iterating over the buffer - let repl = substitute(before,'[\\~]','\\&','g').'\1'.substitute(after,'[\\~]','\\&','g') - let repl = substitute(repl,'\n',' ','g') - let keeper = substitute(keeper."\n",'\(.\{-\}\)\(\n\)',repl.'\n','g') - let keeper = substitute(keeper,'\n\%$','','') - else - let keeper = before.extraspace.keeper.extraspace.after - endif - return keeper -endfunction - -function! s:wrapreg(reg,char,removed,special) - let orig = getreg(a:reg) - let type = substitute(getregtype(a:reg),'\d\+$','','') - let new = s:wrap(orig,a:char,type,a:removed,a:special) - call setreg(a:reg,new,type) -endfunction -" }}}1 - -function! s:insert(...) " {{{1 - " Optional argument causes the result to appear on 3 lines, not 1 - let linemode = a:0 ? a:1 : 0 - let char = s:inputreplacement() - while char == "\" || char == "\" - " TODO: use total count for additional blank lines - let linemode += 1 - let char = s:inputreplacement() - endwhile - if char == "" - return "" - endif - let cb_save = &clipboard - set clipboard-=unnamed clipboard-=unnamedplus - let reg_save = @@ - call setreg('"',"\r",'v') - call s:wrapreg('"',char,"",linemode) - " If line mode is used and the surrounding consists solely of a suffix, - " remove the initial newline. This fits a use case of mine but is a - " little inconsistent. Is there anyone that would prefer the simpler - " behavior of just inserting the newline? - if linemode && match(getreg('"'),'^\n\s*\zs.*') == 0 - call setreg('"',matchstr(getreg('"'),'^\n\s*\zs.*'),getregtype('"')) - endif - " This can be used to append a placeholder to the end - if exists("g:surround_insert_tail") - call setreg('"',g:surround_insert_tail,"a".getregtype('"')) - endif - if col('.') >= col('$') - norm! ""p - else - norm! ""P - endif - if linemode - call s:reindent() - endif - norm! `] - call search('\r','bW') - let @@ = reg_save - let &clipboard = cb_save - return "\" -endfunction " }}}1 - -function! s:reindent() " {{{1 - if exists("b:surround_indent") ? b:surround_indent : (!exists("g:surround_indent") || g:surround_indent) - silent norm! '[='] - endif -endfunction " }}}1 - -function! s:dosurround(...) " {{{1 - let scount = v:count1 - let char = (a:0 ? a:1 : s:inputtarget()) - let spc = "" - if char =~ '^\d\+' - let scount = scount * matchstr(char,'^\d\+') - let char = substitute(char,'^\d\+','','') - endif - if char =~ '^ ' - let char = strpart(char,1) - let spc = 1 - endif - if char == 'a' - let char = '>' - endif - if char == 'r' - let char = ']' - endif - let newchar = "" - if a:0 > 1 - let newchar = a:2 - if newchar == "\" || newchar == "\" || newchar == "" - return s:beep() - endif - endif - let cb_save = &clipboard - set clipboard-=unnamed clipboard-=unnamedplus - let append = "" - let original = getreg('"') - let otype = getregtype('"') - call setreg('"',"") - let strcount = (scount == 1 ? "" : scount) - if char == '/' - exe 'norm! '.strcount.'[/d'.strcount.']/' - elseif char =~# '[[:punct:][:space:]]' && char !~# '[][(){}<>"''`]' - exe 'norm! T'.char - if getline('.')[col('.')-1] == char - exe 'norm! l' - endif - exe 'norm! dt'.char - else - exe 'norm! d'.strcount.'i'.char - endif - let keeper = getreg('"') - let okeeper = keeper " for reindent below - if keeper == "" - call setreg('"',original,otype) - let &clipboard = cb_save - return "" - endif - let oldline = getline('.') - let oldlnum = line('.') - if char ==# "p" - call setreg('"','','V') - elseif char ==# "s" || char ==# "w" || char ==# "W" - " Do nothing - call setreg('"','') - elseif char =~ "[\"'`]" - exe "norm! i \d2i".char - call setreg('"',substitute(getreg('"'),' ','','')) - elseif char == '/' - norm! "_x - call setreg('"','/**/',"c") - let keeper = substitute(substitute(keeper,'^/\*\s\=','',''),'\s\=\*$','','') - elseif char =~# '[[:punct:][:space:]]' && char !~# '[][(){}<>]' - exe 'norm! F'.char - exe 'norm! df'.char - else - " One character backwards - call search('\m.', 'bW') - exe "norm! da".char - endif - let removed = getreg('"') - let rem2 = substitute(removed,'\n.*','','') - let oldhead = strpart(oldline,0,strlen(oldline)-strlen(rem2)) - let oldtail = strpart(oldline, strlen(oldline)-strlen(rem2)) - let regtype = getregtype('"') - if char =~# '[\[({ 2 ? a:3 : 0 - call s:wrapreg('"',newchar,removed,special) - endif - silent exe 'norm! ""'.pcmd.'`[' - if removed =~ '\n' || okeeper =~ '\n' || getreg('"') =~ '\n' - call s:reindent() - endif - if getline('.') =~ '^\s\+$' && keeper =~ '^\s*\n' - silent norm! cc - endif - call setreg('"',original,otype) - let s:lastdel = removed - let &clipboard = cb_save - if newchar == "" - silent! call repeat#set("\Dsurround".char,scount) - else - silent! call repeat#set("\C".(a:0 > 2 && a:3 ? "S" : "s")."urround".char.newchar.s:input,scount) - endif -endfunction " }}}1 - -function! s:changesurround(...) " {{{1 - let a = s:inputtarget() - if a == "" - return s:beep() - endif - let b = s:inputreplacement() - if b == "" - return s:beep() - endif - call s:dosurround(a,b,a:0 && a:1) -endfunction " }}}1 - -function! s:opfunc(type,...) " {{{1 - let char = s:inputreplacement() - if char == "" - return s:beep() - endif - let reg = '"' - let sel_save = &selection - let &selection = "inclusive" - let cb_save = &clipboard - set clipboard-=unnamed clipboard-=unnamedplus - let reg_save = getreg(reg) - let reg_type = getregtype(reg) - let type = a:type - if a:type == "char" - silent exe 'norm! v`[o`]"'.reg.'y' - let type = 'v' - elseif a:type == "line" - silent exe 'norm! `[V`]"'.reg.'y' - let type = 'V' - elseif a:type ==# "v" || a:type ==# "V" || a:type ==# "\" - let &selection = sel_save - let ve = &virtualedit - if !(a:0 && a:1) - set virtualedit= - endif - silent exe 'norm! gv"'.reg.'y' - let &virtualedit = ve - elseif a:type =~ '^\d\+$' - let type = 'v' - silent exe 'norm! ^v'.a:type.'$h"'.reg.'y' - if mode() ==# 'v' - norm! v - return s:beep() - endif - else - let &selection = sel_save - let &clipboard = cb_save - return s:beep() - endif - let keeper = getreg(reg) - if type ==# "v" && a:type !=# "v" - let append = matchstr(keeper,'\_s\@Y".(a:0 && a:1 ? "S" : "s")."surround".char.s:input,a:type) - else - silent! call repeat#set("\SurroundRepeat".char.s:input) - endif -endfunction - -function! s:opfunc2(arg) - call s:opfunc(a:arg,1) -endfunction " }}}1 - -function! s:closematch(str) " {{{1 - " Close an open (, {, [, or < on the command line. - let tail = matchstr(a:str,'.[^\[\](){}<>]*$') - if tail =~ '^\[.\+' - return "]" - elseif tail =~ '^(.\+' - return ")" - elseif tail =~ '^{.\+' - return "}" - elseif tail =~ '^<.+' - return ">" - else - return "" - endif -endfunction " }}}1 - -nnoremap SurroundRepeat . -nnoremap Dsurround :call dosurround(inputtarget()) -nnoremap Csurround :call changesurround() -nnoremap CSurround :call changesurround(1) -nnoremap Yssurround :call opfunc(v:count1) -nnoremap YSsurround :call opfunc2(v:count1) -" discards the numerical argument but there's not much we can do with it -nnoremap Ysurround :set opfunc=opfuncg@ -nnoremap YSurround :set opfunc=opfunc2g@ -vnoremap VSurround :call opfunc(visualmode(),visualmode() ==# 'V' ? 1 : 0) -vnoremap VgSurround :call opfunc(visualmode(),visualmode() ==# 'V' ? 0 : 1) -inoremap Isurround =insert() -inoremap ISurround =insert(1) - -if !exists("g:surround_no_mappings") || ! g:surround_no_mappings - nmap ds Dsurround - nmap cs Csurround - nmap cS CSurround - nmap ys Ysurround - nmap yS YSurround - nmap yss Yssurround - nmap ySs YSsurround - nmap ySS YSsurround - xmap S VSurround - xmap gS VgSurround - if !exists("g:surround_no_insert_mappings") || ! g:surround_no_insert_mappings - if !hasmapto("Isurround","i") && "" == mapcheck("","i") - imap Isurround - endif - imap s Isurround - imap S ISurround - endif -endif - -" vim:set ft=vim sw=2 sts=2 et: diff --git a/.vim/bundle/wal.vim/LICENSE.md b/.vim/bundle/wal.vim/LICENSE.md deleted file mode 100755 index e17de65..0000000 --- a/.vim/bundle/wal.vim/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-2017 Dylan Araps - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.vim/bundle/wal.vim/README.md b/.vim/bundle/wal.vim/README.md deleted file mode 100644 index d4c8278..0000000 --- a/.vim/bundle/wal.vim/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# wal.vim - -[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.md) - -A vim colorscheme for use with **[pywal](https://github.com/dylanaraps/pywal)**. - - -## Installation - -```vim -! Using plug -Plug 'dylanaraps/wal.vim' - -colorscheme wal -``` diff --git a/.vim/bundle/wal.vim/autoload/airline/themes/wal.vim b/.vim/bundle/wal.vim/autoload/airline/themes/wal.vim deleted file mode 100644 index c334ee5..0000000 --- a/.vim/bundle/wal.vim/autoload/airline/themes/wal.vim +++ /dev/null @@ -1,62 +0,0 @@ -" wal Airline -let g:airline#themes#wal#palette = {} - -" Normal mode -let s:N = [ '', '', 232, 4, 'BOLD' ] -let s:N2 = [ '', '', 4, 0, 'BOLD' ] - -" Insert mode -let s:I = [ '', '', 232, 2, 'BOLD' ] -let s:I2 = [ '', '', 2, 0, 'BOLD' ] - -" Visual mode -let s:V = [ '', '', 232, 1, 'BOLD' ] -let s:V2 = [ '', '', 1, 0, 'BOLD' ] - -" Replace mode -let s:R = [ '', '', 232, 5, 'BOLD' ] -let s:R2 = [ '', '', 5, 0, 'BOLD' ] - -let g:airline#themes#wal#palette.normal = airline#themes#generate_color_map(s:N, s:N2, s:N2) -let g:airline#themes#wal#palette.insert = airline#themes#generate_color_map(s:I, s:I2, s:I2) -let g:airline#themes#wal#palette.visual = airline#themes#generate_color_map(s:V, s:V2, s:V2) -let g:airline#themes#wal#palette.replace = airline#themes#generate_color_map(s:R, s:R2, s:R2) - -let g:airline#themes#wal#palette.accents = { 'red': [ '', '', 0, 2, 'BOLD' ] } - -" Inactive mode -let s:IN1 = [ '', '', 0, 8 ] -let s:IN2 = [ '', '', 0, 0 ] - -let s:IA = [ s:IN1[1], s:IN2[1], s:IN1[3], s:IN2[3], '' ] -let g:airline#themes#wal#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) - -" Warnings -let s:WI = [ '', '', 232, 1, 'BOLD' ] -let g:airline#themes#wal#palette.normal.airline_warning = s:WI -let g:airline#themes#wal#palette.insert.airline_warning = s:WI -let g:airline#themes#wal#palette.visual.airline_warning = s:WI -let g:airline#themes#wal#palette.replace.airline_warning = s:WI - -let g:airline#themes#wal#palette.normal.airline_error = s:WI -let g:airline#themes#wal#palette.insert.airline_error = s:WI -let g:airline#themes#wal#palette.visual.airline_error = s:WI -let g:airline#themes#wal#palette.replace.airline_error = s:WI - -" Tabline -let g:airline#themes#wal#palette.tabline = { - \ 'airline_tab': [ '', '', 4, 0, 'BOLD' ], - \ 'airline_tabsel': [ '', '', 232, 4, 'BOLD' ], - \ 'airline_tabtype': [ '', '', 232, 4, 'BOLD' ], - \ 'airline_tabfill': [ '', '', 4, 0, 'BOLD' ], - \ 'airline_tabmod': [ '', '', 232, 4, 'BOLD' ] -\ } - -if !get(g:, 'loaded_ctrlp', 0) - finish -endif - -let g:airline#themes#wal#palette.ctrlp = airline#extensions#ctrlp#generate_color_map( - \ [ '', '', 0, 0, 'BOLD' ], - \ [ '', '', 0, 0, 'BOLD' ], - \ [ '', '', 0, 0, 'BOLD' ] ) diff --git a/.vim/bundle/wal.vim/colors/wal.vim b/.vim/bundle/wal.vim/colors/wal.vim deleted file mode 100755 index 44935a9..0000000 --- a/.vim/bundle/wal.vim/colors/wal.vim +++ /dev/null @@ -1,193 +0,0 @@ -" wal.vim -- Vim color scheme. -" Author: Dylan Araps -" Webpage: https://github.com/dylanaraps/wal -" Description: A colorscheme that uses your terminal colors, made to work with 'wal'. - -hi clear -set background=dark - -if exists('syntax_on') - syntax reset -endif - -" Colorscheme name -let g:colors_name = 'wal' - -" highlight groups {{{ - -" set t_Co=16 -hi Normal ctermbg=NONE ctermfg=7 cterm=NONE -hi NonText ctermbg=NONE ctermfg=0 cterm=NONE -hi Comment ctermbg=NONE ctermfg=8 cterm=NONE -hi Constant ctermbg=NONE ctermfg=3 cterm=NONE -hi Error ctermbg=1 ctermfg=7 cterm=NONE -hi Identifier ctermbg=NONE ctermfg=1 cterm=NONE -hi Ignore ctermbg=8 ctermfg=0 cterm=NONE -hi PreProc ctermbg=NONE ctermfg=3 cterm=NONE -hi Special ctermbg=NONE ctermfg=6 cterm=NONE -hi Statement ctermbg=NONE ctermfg=1 cterm=NONE -hi String ctermbg=NONE ctermfg=2 cterm=NONE -hi Number ctermbg=NONE ctermfg=3 cterm=NONE -hi Todo ctermbg=2 ctermfg=0 cterm=NONE -hi Type ctermbg=NONE ctermfg=3 cterm=NONE -hi Underlined ctermbg=NONE ctermfg=1 cterm=underline -hi StatusLine ctermbg=7 ctermfg=0 cterm=NONE -hi StatusLineNC ctermbg=NONE ctermfg=NONE cterm=NONE -hi TabLine ctermbg=NONE ctermfg=8 cterm=NONE -hi TabLineFill ctermbg=NONE ctermfg=8 cterm=NONE -hi TabLineSel ctermbg=4 ctermfg=0 cterm=NONE -hi TermCursorNC ctermbg=3 ctermfg=0 cterm=NONE -hi VertSplit ctermbg=NONE ctermfg=NONE cterm=NONE -hi Title ctermbg=NONE ctermfg=4 cterm=NONE -hi CursorLine ctermbg=8 ctermfg=0 cterm=NONE -hi LineNr ctermbg=NONE ctermfg=8 cterm=NONE -hi CursorLineNr ctermbg=NONE ctermfg=8 cterm=NONE -hi helpLeadBlank ctermbg=NONE ctermfg=7 cterm=NONE -hi helpNormal ctermbg=NONE ctermfg=7 cterm=NONE -hi Visual ctermbg=8 ctermfg=0 cterm=NONE -hi VisualNOS ctermbg=NONE ctermfg=1 cterm=NONE -hi Pmenu ctermbg=8 ctermfg=7 cterm=NONE -hi PmenuSbar ctermbg=6 ctermfg=7 cterm=NONE -hi PmenuSel ctermbg=4 ctermfg=0 cterm=NONE -hi PmenuThumb ctermbg=8 ctermfg=8 cterm=NONE -hi FoldColumn ctermbg=NONE ctermfg=7 cterm=NONE -hi Folded ctermbg=NONE ctermfg=8 cterm=NONE -hi WildMenu ctermbg=2 ctermfg=0 cterm=NONE -hi SpecialKey ctermbg=NONE ctermfg=8 cterm=NONE -hi DiffAdd ctermbg=NONE ctermfg=2 cterm=NONE -hi DiffChange ctermbg=NONE ctermfg=8 cterm=NONE -hi DiffDelete ctermbg=NONE ctermfg=1 cterm=NONE -hi DiffText ctermbg=NONE ctermfg=4 cterm=NONE -hi IncSearch ctermbg=3 ctermfg=0 cterm=NONE -hi Search ctermbg=3 ctermfg=0 cterm=NONE -hi Directory ctermbg=NONE ctermfg=4 cterm=NONE -hi MatchParen ctermbg=8 ctermfg=0 cterm=NONE -hi ColorColumn ctermbg=4 ctermfg=0 cterm=NONE -hi signColumn ctermbg=NONE ctermfg=4 cterm=NONE -hi ErrorMsg ctermbg=NONE ctermfg=8 cterm=NONE -hi ModeMsg ctermbg=NONE ctermfg=2 cterm=NONE -hi MoreMsg ctermbg=NONE ctermfg=2 cterm=NONE -hi Question ctermbg=NONE ctermfg=4 cterm=NONE -hi WarningMsg ctermbg=1 ctermfg=0 cterm=NONE -hi Cursor ctermbg=NONE ctermfg=8 cterm=NONE -hi Structure ctermbg=NONE ctermfg=5 cterm=NONE -hi CursorColumn ctermbg=8 ctermfg=7 cterm=NONE -hi ModeMsg ctermbg=NONE ctermfg=7 cterm=NONE -hi SpellBad ctermbg=1 ctermfg=0 cterm=NONE -hi SpellCap ctermbg=NONE ctermfg=4 cterm=underline -hi SpellLocal ctermbg=NONE ctermfg=5 cterm=underline -hi SpellRare ctermbg=NONE ctermfg=6 cterm=underline -hi Boolean ctermbg=NONE ctermfg=5 cterm=NONE -hi Character ctermbg=NONE ctermfg=1 cterm=NONE -hi Conditional ctermbg=NONE ctermfg=5 cterm=NONE -hi Define ctermbg=NONE ctermfg=5 cterm=NONE -hi Delimiter ctermbg=NONE ctermfg=5 cterm=NONE -hi Float ctermbg=NONE ctermfg=5 cterm=NONE -hi Include ctermbg=NONE ctermfg=4 cterm=NONE -hi Keyword ctermbg=NONE ctermfg=5 cterm=NONE -hi Label ctermbg=NONE ctermfg=3 cterm=NONE -hi Operator ctermbg=NONE ctermfg=7 cterm=NONE -hi Repeat ctermbg=NONE ctermfg=3 cterm=NONE -hi SpecialChar ctermbg=NONE ctermfg=5 cterm=NONE -hi Tag ctermbg=NONE ctermfg=3 cterm=NONE -hi Typedef ctermbg=NONE ctermfg=3 cterm=NONE -hi vimUserCommand ctermbg=NONE ctermfg=1 cterm=BOLD - hi link vimMap vimUserCommand - hi link vimLet vimUserCommand - hi link vimCommand vimUserCommand - hi link vimFTCmd vimUserCommand - hi link vimAutoCmd vimUserCommand - hi link vimNotFunc vimUserCommand -hi vimNotation ctermbg=NONE ctermfg=4 cterm=NONE -hi vimMapModKey ctermbg=NONE ctermfg=4 cterm=NONE -hi vimBracket ctermbg=NONE ctermfg=7 cterm=NONE -hi vimCommentString ctermbg=NONE ctermfg=8 cterm=NONE -hi htmlLink ctermbg=NONE ctermfg=1 cterm=underline -hi htmlBold ctermbg=NONE ctermfg=3 cterm=NONE -hi htmlItalic ctermbg=NONE ctermfg=5 cterm=NONE -hi htmlEndTag ctermbg=NONE ctermfg=7 cterm=NONE -hi htmlTag ctermbg=NONE ctermfg=7 cterm=NONE -hi htmlTagName ctermbg=NONE ctermfg=1 cterm=BOLD -hi htmlH1 ctermbg=NONE ctermfg=7 cterm=NONE - hi link htmlH2 htmlH1 - hi link htmlH3 htmlH1 - hi link htmlH4 htmlH1 - hi link htmlH5 htmlH1 - hi link htmlH6 htmlH1 -hi cssMultiColumnAttr ctermbg=NONE ctermfg=2 cterm=NONE - hi link cssFontAttr cssMultiColumnAttr - hi link cssFlexibleBoxAttr cssMultiColumnAttr -hi cssBraces ctermbg=NONE ctermfg=7 cterm=NONE - hi link cssAttrComma cssBraces -hi cssValueLength ctermbg=NONE ctermfg=7 cterm=NONE -hi cssUnitDecorators ctermbg=NONE ctermfg=7 cterm=NONE -hi cssValueNumber ctermbg=NONE ctermfg=7 cterm=NONE - hi link cssValueLength cssValueNumber -hi cssNoise ctermbg=NONE ctermfg=8 cterm=NONE -hi cssTagName ctermbg=NONE ctermfg=1 cterm=NONE -hi cssFunctionName ctermbg=NONE ctermfg=4 cterm=NONE -hi scssSelectorChar ctermbg=NONE ctermfg=7 cterm=NONE -hi scssAttribute ctermbg=NONE ctermfg=7 cterm=NONE - hi link scssDefinition cssNoise -hi sassidChar ctermbg=NONE ctermfg=1 cterm=NONE -hi sassClassChar ctermbg=NONE ctermfg=5 cterm=NONE -hi sassInclude ctermbg=NONE ctermfg=5 cterm=NONE -hi sassMixing ctermbg=NONE ctermfg=5 cterm=NONE -hi sassMixinName ctermbg=NONE ctermfg=4 cterm=NONE -hi javaScript ctermbg=NONE ctermfg=7 cterm=NONE -hi javaScriptBraces ctermbg=NONE ctermfg=7 cterm=NONE -hi javaScriptNumber ctermbg=NONE ctermfg=5 cterm=NONE -hi markdownH1 ctermbg=NONE ctermfg=7 cterm=NONE - hi link markdownH2 markdownH1 - hi link markdownH3 markdownH1 - hi link markdownH4 markdownH1 - hi link markdownH5 markdownH1 - hi link markdownH6 markdownH1 -hi markdownAutomaticLink ctermbg=NONE ctermfg=1 cterm=underline - hi link markdownUrl markdownAutomaticLink -hi markdownError ctermbg=NONE ctermfg=7 cterm=NONE -hi markdownCode ctermbg=NONE ctermfg=3 cterm=NONE -hi markdownCodeBlock ctermbg=NONE ctermfg=3 cterm=NONE -hi markdownCodeDelimiter ctermbg=NONE ctermfg=5 cterm=NONE -hi xdefaultsValue ctermbg=NONE ctermfg=7 cterm=NONE -hi rubyInclude ctermbg=NONE ctermfg=4 cterm=NONE -hi rubyDefine ctermbg=NONE ctermfg=5 cterm=NONE -hi rubyFunction ctermbg=NONE ctermfg=4 cterm=NONE -hi rubyStringDelimiter ctermbg=NONE ctermfg=2 cterm=NONE -hi rubyInteger ctermbg=NONE ctermfg=3 cterm=NONE -hi rubyAttribute ctermbg=NONE ctermfg=4 cterm=NONE -hi rubyConstant ctermbg=NONE ctermfg=3 cterm=NONE -hi rubyInterpolation ctermbg=NONE ctermfg=2 cterm=NONE -hi rubyInterpolationDelimiter ctermbg=NONE ctermfg=3 cterm=NONE -hi rubyRegexp ctermbg=NONE ctermfg=6 cterm=NONE -hi rubySymbol ctermbg=NONE ctermfg=2 cterm=NONE -hi rubyTodo ctermbg=NONE ctermfg=8 cterm=NONE -hi rubyRegexpAnchor ctermbg=NONE ctermfg=7 cterm=NONE - hi link rubyRegexpQuantifier rubyRegexpAnchor -hi pythonOperator ctermbg=NONE ctermfg=5 cterm=NONE -hi pythonFunction ctermbg=NONE ctermfg=4 cterm=NONE -hi pythonRepeat ctermbg=NONE ctermfg=5 cterm=NONE -hi pythonStatement ctermbg=NONE ctermfg=1 cterm=Bold -hi pythonBuiltIn ctermbg=NONE ctermfg=4 cterm=NONE -hi phpMemberSelector ctermbg=NONE ctermfg=7 cterm=NONE -hi phpComparison ctermbg=NONE ctermfg=7 cterm=NONE -hi phpParent ctermbg=NONE ctermfg=7 cterm=NONE -hi cOperator ctermbg=NONE ctermfg=6 cterm=NONE -hi cPreCondit ctermbg=NONE ctermfg=5 cterm=NONE -hi SignifySignAdd ctermbg=NONE ctermfg=2 cterm=NONE -hi SignifySignChange ctermbg=NONE ctermfg=4 cterm=NONE -hi SignifySignDelete ctermbg=NONE ctermfg=1 cterm=NONE -hi NERDTreeDirSlash ctermbg=NONE ctermfg=4 cterm=NONE -hi NERDTreeExecFile ctermbg=NONE ctermfg=7 cterm=NONE -hi ALEErrorSign ctermbg=NONE ctermfg=1 cterm=NONE -hi ALEWarningSign ctermbg=NONE ctermfg=3 cterm=NONE -hi ALEError ctermbg=NONE ctermfg=1 cterm=NONE -hi ALEWarning ctermbg=NONE ctermfg=3 cterm=NONE - -" }}} - -" Plugin options {{{ - -let g:limelight_conceal_ctermfg = 8 - -" }}} diff --git a/.vim/luke/deadkeys.vim b/.vim/luke/deadkeys.vim deleted file mode 100644 index a419b3f..0000000 --- a/.vim/luke/deadkeys.vim +++ /dev/null @@ -1,260 +0,0 @@ - -" Installation -" Source the file wherever you put it: -" so ~/.vim/luke/deadkeys.vim -" Map ToggleDeadKeys to whatever you want: -" nm :call ToggleDeadKeys() - -let g:DeadKeysOn=0 - -function! ToggleDeadKeys() - if !g:DeadKeysOn - call DeadKeys() - else - call DeadKeysOff() - endif -endfunction - -function! DeadKeys() - echo "Dead Keys: On" - let g:DeadKeysOn=1 - " grave accents - imap `a à - imap `e è - imap `i ì - imap `o ò - imap `u ù - imap `A À - imap `E È - imap `I Ì - imap `O Ò - imap `U Ù - imap ` ` - - " umlaut - imap "a ä - imap "e ë - imap "i ï - imap "o ö - imap "u ü - imap "A Ä - imap "E Ë - imap "I Ï - imap "O Ö - imap "U Ü - imap " " - - " macrons - imap :a ā - imap :e ē - imap :i ī - imap :o ō - imap :u ū - imap :A Ā - imap :E Ē - imap :I Ī - imap :O Ō - imap :U Ū - - " acute accents - imap 'a á - imap 'A Á - imap 'C Ć - imap 'c ć - imap 'e é - imap 'E É - imap 'i í - imap 'I Í - imap 'N Ń - imap 'n ń - imap 'o ó - imap 'R Ŕ - imap 'r ŕ - imap 'S Ś - imap 's ś - imap 'O Ó - imap 'u ú - imap 'U Ú - imap ' ' - - " under dot - imap .D Ḍ - imap .d ḍ - imap .H Ḥ - imap .h ḥ - imap .L Ḹ - imap .l ḹ - imap .M Ṃ - imap .m ṃ - imap .N Ṇ - imap .n ṇ - imap .R Ṛ - imap .r ṛ - imap .G Ṝ - imap .g ṝ - imap .S Ṣ - imap .s ṣ - imap .T Ṭ - imap .t ṭ - - " tilde - imap ~a ã - imap ~A à - imap ~e ẽ - imap ~E Ẽ - imap ~i ĩ - imap ~I Ĩ - imap ~o õ - imap ~O Õ - imap ~u ũ - imap ~U Ũ - imap ~n ñ - imap ~N Ñ - - " caron - imap >A Ǎ - imap >a ǎ - imap >C Č - imap >c č - imap >E Ě - imap >e ě - imap >G Ǧ - imap >g ǧ - imap >I Ǐ - imap >i ǐ - imap >O Ǒ - imap >o ǒ - imap >R Ř - imap >r ř - imap >S Ṧ - imap >s ṧ - imap >U Ǔ - imap >u ǔ - imap >V Ǚ - imap >v ǚ - imap >Z Ž - imap >z ž - -endfunction "deadkeys() - - -function! DeadKeysOff() - echo "Dead Keys: Off" - let g:DeadKeysOn=0 - - " unmapping graves - iunmap `a - iunmap `e - iunmap `i - iunmap `o - iunmap `u - iunmap `A - iunmap `E - iunmap `I - iunmap `O - iunmap `U - iunmap ` - - " unmapping umlauts - iunmap "a - iunmap "e - iunmap "i - iunmap "o - iunmap "u - iunmap "A - iunmap "E - iunmap "I - iunmap "O - iunmap "U - iunmap " - - " unmapping macrons - iunmap :a - iunmap :e - iunmap :i - iunmap :o - iunmap :u - iunmap :A - iunmap :E - iunmap :I - iunmap :O - iunmap :U - - " unmapping acutes - iunmap 'a - iunmap 'A - iunmap 'C - iunmap 'c - iunmap 'e - iunmap 'E - iunmap 'i - iunmap 'I - iunmap 'N - iunmap 'n - iunmap 'o - iunmap 'R - iunmap 'r - iunmap 'S - iunmap 's - iunmap 'O - iunmap 'u - iunmap 'U - iunmap ' - " under dot - iunmap .D - iunmap .d - iunmap .H - iunmap .h - iunmap .L - iunmap .l - iunmap .M - iunmap .m - iunmap .N - iunmap .n - iunmap .R - iunmap .r - iunmap .G - iunmap .g - iunmap .S - iunmap .s - iunmap .T - iunmap .t - - "tilde - iunmap ~a - iunmap ~A - iunmap ~e - iunmap ~E - iunmap ~i - iunmap ~I - iunmap ~o - iunmap ~O - iunmap ~u - iunmap ~U - iunmap ~n - - " caron - iunmap >A - iunmap >a - iunmap >C - iunmap >c - iunmap >E - iunmap >e - iunmap >G - iunmap >g - iunmap >I - iunmap >i - iunmap >O - iunmap >o - iunmap >R - iunmap >r - iunmap >S - iunmap >s - iunmap >U - iunmap >u - iunmap >V - iunmap >v - iunmap >Z - iunmap >z - -endfunction diff --git a/.vim/luke/ipa.vim b/.vim/luke/ipa.vim deleted file mode 100644 index 038d574..0000000 --- a/.vim/luke/ipa.vim +++ /dev/null @@ -1,186 +0,0 @@ -let g:IPAOn=0 - -function! ToggleIPA() - if !g:IPAOn - call IPA() - else - cal IPAOff() - endif -endfunction - -function! IPA() - echo "IPA macros activated" - let g:IPAOn=1 - imap ;nn ɲ̊ - imap ;gn ɲ - imap ;ng ŋ - imap ;' ʔ - imap ;sh ʃ - imap ;zh ʒ - imap ;xi ɕ - imap ;zi ʑ - imap ;ph ɸ - imap ;bh β - imap ;th θ - imap ;dh ð - imap ;cc ç - imap ;jj ʝ - imap ;gh ɣ - imap ;xx χ - imap ;fr ʁ - imap ;HH ħ - imap ;hh ɦ - imap ;vv ʋ - imap ;er ɹ - imap ;fl ɾ - imap ;bb ʙ - imap ;ih ɨ - imap ;ii ɪ - imap ;eu ɯ̽ - imap ;uu ʊ - imap ;uh ə - imap ;eh ɛ - imap ;oe œ - imap ;au ɔ - imap ;ae æ - imap ;aa ɐ - imap ;OE ɶ - imap ;ah ɑ - imap ;ba ɒ -endfunction - -function! IPAOff() - echo "IPA macros off." - let g:IPAOn=0 - iunmap ;nn - iunmap ;gn - iunmap ;ng - iunmap ;' - iunmap ;sh - iunmap ;zh - iunmap ;xi - iunmap ;zi - iunmap ;ph - iunmap ;bh - iunmap ;th - iunmap ;dh - iunmap ;cc - iunmap ;jj - iunmap ;gh - iunmap ;xx - iunmap ;fr - iunmap ;HH - iunmap ;hh - iunmap ;vv - iunmap ;er - iunmap ;fl - iunmap ;bb - iunmap ;ih - iunmap ;ii - iunmap ;eu - iunmap ;uu - iunmap ;uh - iunmap ;eh - iunmap ;oe - iunmap ;au - iunmap ;ae - iunmap ;aa - iunmap ;OE - iunmap ;ah - iunmap ;ba -endfunction - -" As of yet unimplemented: -"b̪ -"t̼ -"d̼ -"ʈ -"ɖ -"ɟ -"ɡ -"ɢ -"ʡ -"ʂ -"ʐ -"θ̼ -"ð̼ -"θ̠ -"ð̠ -"ɹ̠̊ -"ɹ̠ -"ɻ -"ʕ -"ʢ -"ʋ̥ -"ɹ̥ -"ɻ̊ -"ɻ -"j̊ -"ɰ̊ -"ɰ -"ʔ̞ -"ⱱ̟ -"ⱱ -"ɾ̼ -"ɾ̥ -"ɽ̊ -"ɽ -"ɢ̆ -"ʡ̮ -"ʙ̥ -"r̼ -"r̥ -"ɽ̊ -"ɽ -"ʀ̥ -"ʀ -"ʜ -"ʢ -"ɬ -"ɮ -"ɭ̊ -"ʎ̥ -"ʎ̝ -"ʟ̝̊ -"ʟ̝ -"l̥ -"ɭ̊ -"ɭ -"ʎ̥ -"ʎ -"ʟ̥ -"ʟ -"ʟ̠ -"ɺ -"ɺ̢ -"ʎ̮ -"ʟ̆ -"ʉ -"ɯ -"ʏ -"ɪ̈ -"ʊ̈ -"ø -"ɘ -"ɵ -"ɤ -"e̞ -"ø̞ -"ɵ̞ -"ɤ̞ -"o̞ -"ɜ -"ɞ -"ʌ -"ɞ̞ -"ä -"ɒ̈ -"m̥ -"ɱ -"n̼ -"n̥ -"ɳ̊ -"ɳ -"ŋ̊ -"ɴ -"p̪ diff --git a/.vim/luke/prose.vim b/.vim/luke/prose.vim deleted file mode 100644 index cf9470e..0000000 --- a/.vim/luke/prose.vim +++ /dev/null @@ -1,38 +0,0 @@ -let g:ProseOn=0 - -function! ToggleProse() - if !g:ProseOn - call Prose() - else - call ProseOff() - endif -endfunction - -function! Prose() - echo "Prose: On" - let g:ProseOn=1 - - noremap j gj - noremap k gk - noremap 0 g0 - noremap $ g$ - noremap A g$a - noremap I g0i - setlocal linebreak nonumber norelativenumber t_Co=0 foldcolumn=2 - hi! link FoldColumn Normal - -endfunction - -function! ProseOff() - echo "Prose: Off" - let g:ProseOn=0 - - noremap j j - noremap k k - noremap 0 0 - noremap $ $ - noremap A A - noremap I I - setlocal nolinebreak number relativenumber t_Co=256 foldcolumn=0 - -endfunction diff --git a/.vim/plugin/dragvisuals.vim b/.vim/plugin/dragvisuals.vim deleted file mode 100644 index 12c4f5d..0000000 --- a/.vim/plugin/dragvisuals.vim +++ /dev/null @@ -1,345 +0,0 @@ -" 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 DVB_Drag('left') ## -"## vmap DVB_Drag('right') ## -"## vmap DVB_Drag('down') ## -"## vmap DVB_Drag('up') ## -"## vmap 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 h DVB_Drag('left') ## -"## vmap l DVB_Drag('right') ## -"## vmap j DVB_Drag('down') ## -"## vmap k DVB_Drag('up') ## -"## ## -"## Or: ## -"## ## -"## vmap DVB_Drag('left') ## -"## vmap DVB_Drag('right') ## -"## vmap DVB_Drag('down') ## -"## vmap DVB_Drag('up') ## -"## ## -"## Or even: ## -"## ## -"## vmap DVB_Drag('left') ## -"## vmap DVB_Drag('right') ## -"## vmap DVB_Drag('down') ## -"## vmap 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 "\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 M \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 M \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 M \DuplicateBlock()" - return '"vyM' -endfunction - -function! s:DuplicateBlock () - nunmap 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\gv" - \. (dollar_block ? 'o$' : '') -endfunction - - -" Kludge to hide change reporting inside implementation... -let s:NO_REPORT = ":let b:DVB_report=&report\:let &report=1000000000\" -let s:PREV_REPORT = ":let &report = b:DVB_report\" - - -" Drag in specified direction in Visual Line mode... -function! s:Drag_Lines (dir) - " Clean up the temporary convenience... - nunmap 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/^ //\" - \ . 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/^/ /\:nohlsearch\" - \ . 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\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 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*$//\gv\" - \ . ':set virtualedit=' . prev_ve . "\" - \ . s:PREV_REPORT - \ . ":nohlsearch\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*$//\gv\" - \ . ':set virtualedit=' . prev_ve . "\" - \ . s:PREV_REPORT - \ . (dollar_block ? 'gv$' : 'gv') - else - return 'gv'.square_up.'xp:set virtualedit=' . prev_ve . "\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*$//' - \ . "\:nohlsearch\:set virtualedit=" - \ . prev_ve - \ . "\gv" - \ . (dollar_block ? '$' : '') - - " Otherwise just move and reselect... - else - return 'gv'.square_up.'xkPgvkoko"vy:set virtualedit=' - \ . prev_ve - \ . "\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*$//' - \ . "\:nohlsearch\:set virtualedit=" - \ . prev_ve - \ . "\gv" - \ . (dollar_block ? '$' : '') - - " Otherwise just move and reselect... - else - return 'gv'.square_up.'xjPgvjojo"vy' - \ . "\:set virtualedit=" - \ . prev_ve - \ . "\gv" - \ . (dollar_block ? '$' : '') - endif - endif -endfunction - - -" Restore previous external compatibility options -let &cpo = s:save_cpo - diff --git a/.vim/plugin/vmath.vim b/.vim/plugin/vmath.vim deleted file mode 100644 index 0e10044..0000000 --- a/.vim/plugin/vmath.vim +++ /dev/null @@ -1,152 +0,0 @@ -" Vim global plugin for math on visual regions -" Maintainer: Damian Conway -" License: This file is placed in the public domain. - -"###################################################################### -"## ## -"## To use: ## -"## ## -"## vmap ++ VMATH_YankAndAnalyse() ## -"## nmap ++ vip++ ## -"## ## -"## (or whatever keys you prefer to remap these actions to) ## -"## ## -"###################################################################### - - -" If already loaded, we're done... -if exists("loaded_vmath") - finish -endif -let loaded_vmath = 1 - -" Preserve external compatibility options, then enable full vim compatibility... -let s:save_cpo = &cpo -set cpo&vim - -" Grab visual selection and do simple math on it... -function! VMATH_YankAndAnalyse () - if &showmode - " Don't reselect the visual region if showmode is enabled - " because it will clobber the sum/avg/etc report with the - " "-- VISUAL --" message. - return "y:call VMATH_Analyse()\" - else - return "y:call VMATH_Analyse()\gv" - endif -endfunction - -" What to consider a number... -let s:NUM_PAT = '^[+-]\?\d\+\%([.]\d\+\)\?\([eE][+-]\?\d\+\)\?$' - -" How widely to space the report components... -let s:REPORT_GAP = 3 "spaces between components - -" Do simple math on current yank buffer... -function! VMATH_Analyse () - " Extract data from selection... - let selection = getreg('') - let raw_numbers = filter(split(selection), 'v:val =~ s:NUM_PAT') - let numbers = map(copy(raw_numbers), 'str2float(v:val)') - - " Results include a newline if original selection did... - let newline = selection =~ "\n" ? "\n" : "" - - " Calculate and en-register various interesting metrics... - let summation = len(numbers) ? join( numbers, ' + ') : '0' - call setreg('s', s:tidy( eval( summation ) )) " Sum --> register s - call setreg('a', s:average(raw_numbers) ) " Average --> register a - call setreg('x', s:tidy( s:max(numbers) )) " Max --> register x - call setreg('n', s:tidy( s:min(numbers) )) " Min --> register n - call setreg('r', @n . ' to ' . @x ) " Range --> register r - call setreg('c', len(numbers) ) " Count --> register c - - " Default paste buffer should depend on original contents (TODO) - call setreg('', @s ) - - " Report... - let gap = repeat(" ", s:REPORT_GAP) - highlight NormalUnderlined term=underline cterm=underline gui=underline - echohl NormalUnderlined - echo 's' - echohl NONE - echon 'um: ' . @s . gap - echohl NormalUnderlined - echon 'a' - echohl NONE - echon 'vg: ' . @a . gap - echon 'mi' - echohl NormalUnderlined - echon 'n' - echohl NONE - echon ': ' . @n . gap - echon 'ma' - echohl NormalUnderlined - echon 'x' - echohl NONE - echon ': ' . @x . gap - echohl NormalUnderlined - echon 'c' - echohl NONE - echon 'ount: ' . @c - -endfunction - -" Prettify numbers... -function! s:tidy (number) - let tidied = printf('%g', a:number) - return substitute(tidied, '[.]0\+$', '', '') -endfunction - -" Compute average with meaningful number of decimal places... -function! s:average (numbers) - " Compute average... - let summation = eval( len(a:numbers) ? join( a:numbers, ' + ') : '0' ) - let avg = 1.0 * summation / s:max([len(a:numbers), 1]) - - " Determine significant figures... - let min_decimals = 15 - for num in a:numbers - let decimals = strlen(matchstr(num, '[.]\d\+$')) - 1 - if decimals < min_decimals - let min_decimals = decimals - endif - endfor - - " Adjust answer... - return min_decimals > 0 ? printf('%0.'.min_decimals.'f', avg) - \ : string(avg) -endfunction - -" Reimplement these because the builtins don't handle floats (!!!) -function! s:max (numbers) - if !len(a:numbers) - return 0 - endif - let numbers = copy(a:numbers) - let maxnum = numbers[0] - for nextnum in numbers[1:] - if nextnum > maxnum - let maxnum = nextnum - endif - endfor - return maxnum -endfunction - -function! s:min (numbers) - if !len(a:numbers) - return 0 - endif - let numbers = copy(a:numbers) - let minnum = numbers[0] - for nextnum in numbers[1:] - if nextnum < minnum - let minnum = nextnum - endif - endfor - return minnum -endfunction - - -" Restore previous external compatibility options -let &cpo = s:save_cpo diff --git a/.vimrc b/.vimrc index 6d7bd94..fcc4742 100644 --- a/.vimrc +++ b/.vimrc @@ -5,9 +5,15 @@ " \_/ |_|_| |_| |_|_| \___| let mapleader =" " -" Load Pathogen for plugins: - execute pathogen#infect() - execute pathogen#helptags() + +call plug#begin('~/.vim/plugged') +Plug 'junegunn/goyo.vim' +Plug 'PotatoesMaster/i3-vim-syntax' +Plug 'jreybert/vimagit' +Plug 'LukeSmithxyz/vimling' +Plug 'vimwiki/vimwiki' +Plug 'dylanaraps/wal.vim' +call plug#end() " Some basics: set nocompatible @@ -61,28 +67,24 @@ let mapleader =" " " Make calcurse notes markdown compatible: autocmd BufRead,BufNewFile /tmp/calcurse*,~/.calcurse/notes/* set filetype=markdown +" groff files automatically detected + autocmd BufRead,BufNewFile *.ms,*.me,*.mom set filetype=groff + +" .tex files automatically detected + autocmd BufRead,BufNewFile *.tex set filetype=tex + " Readmes autowrap text: - autocmd BufRead,BufNewFile *.md,*.tex set tw=79 + autocmd BufRead,BufNewFile *.md set tw=79 " Get line, word and character counts with F3: - map :!wc % + map :!wc % " Spell-check set to F6: map :setlocal spell! spelllang=en_us -" Toggle DeadKeys set (for accent marks): - so ~/.vim/luke/deadkeys.vim - nm d :call ToggleDeadKeys() - imap d :call ToggleDeadKeys()a - -" Source my IPA shorcuts: - so ~/.vim/luke/ipa.vim - nm i :call ToggleIPA() - imap i :call ToggleIPA()a - " Use urlview to choose and open a url: - :noremap u :wsilent !urlview - :noremap ,, :wsilent !urlview + :noremap u :wsilent !urlscan + :noremap ,, :wsilent !urlscan " Copy selected text to system clipboard (requires gvim installed): vnoremap "*Y :let @+=@* @@ -93,10 +95,6 @@ let mapleader =" " map f :Goyo \| set linebreak inoremap :Goyoa -" Toggle Prose Mode with F8: - so ~/.vim/luke/prose.vim - nm :call ToggleProse() - " Enable Goyo by default for mutt writting " Goyo's width will be the line limit in mutt. autocmd BufRead,BufNewFile /tmp/neomutt* let g:goyo_width=80