diff --git a/.vim/pack/plugins/start/vim-fugitive/CONTRIBUTING.markdown b/.vim/pack/plugins/start/vim-fugitive/CONTRIBUTING.markdown new file mode 100644 index 0000000..843bbe6 --- /dev/null +++ b/.vim/pack/plugins/start/vim-fugitive/CONTRIBUTING.markdown @@ -0,0 +1,24 @@ +Before reporting a bug, you should try stripping down your Vim configuration +and removing other plugins. The sad truth about VimScript is that it is +fraught with incompatibilities waiting to happen. I'm happy to work around +them where I can, but it's up to you to isolate the conflict. + +Fugitive is particularly prone to regressions due to Git version issues, +platform issues, and interactions with other plugins. I end up bisecting a +lot more than other projects, and thus I'm especially meticulous here about +maintaining a clean, readable, history. Squash and force push any requested +changes to a pull request. And if your [commit message +sucks](https://commit.style), I'm not going to accept it. Period. + +If your contribution involves adding a configuration option, you are going to +need a very compelling justification for it. Options add a maintenance +burden, support burden, and documentation bloat, and oftentimes can be +achieved much more simply with a custom map or autocommand. If your option +controls an underlying Git command, ask yourself why Git itself does not offer +such configuration. + +Beyond that, don't be shy about asking before patching. What takes you hours +might take me minutes simply because I have both domain knowledge and a +perverse knowledge of VimScript so vast that many would consider it a symptom +of mental illness. On the flip side, some ideas I'll reject no matter how +good the implementation is. "Send a patch" is an edge case answer in my book. diff --git a/.vim/pack/plugins/start/vim-fugitive/README.markdown b/.vim/pack/plugins/start/vim-fugitive/README.markdown new file mode 100644 index 0000000..3dc4e6c --- /dev/null +++ b/.vim/pack/plugins/start/vim-fugitive/README.markdown @@ -0,0 +1,137 @@ +# fugitive.vim + +Fugitive is the premier Vim plugin for Git. Or maybe it's the premier Git +plugin for Vim? Either way, it's "so awesome, it should be illegal". That's +why it's called Fugitive. + +The crown jewel of Fugitive is `:Git` (or just `:G`), which calls any +arbitrary Git command. If you know how to use Git at the command line, you +know how to use `:Git`. It's vaguely akin to `:!git` but with numerous +improvements: + +* The default behavior is to directly echo the command's output. Quiet + commands like `:Git add` avoid the dreaded "Press ENTER or type command to + continue" prompt. +* `:Git commit`, `:Git rebase -i`, and other commands that invoke an editor do + their editing in the current Vim instance. +* `:Git diff`, `:Git log`, and other verbose, paginated commands have their + output loaded into a temporary buffer. Force this behavior for any command + with `:Git --paginate` or `:Git -p`. +* `:Git blame` uses a temporary buffer with maps for additional triage. Press + enter on a line to view the commit where the line changed, or `g?` to see + other available maps. Omit the filename argument and the currently edited + file will be blamed in a vertical, scroll-bound split. +* `:Git mergetool` and `:Git difftool` load their changesets into the quickfix + list. +* Called with no arguments, `:Git` opens a summary window with dirty files and + unpushed and unpulled commits. Press `g?` to bring up a list of maps for + numerous operations including diffing, staging, committing, rebasing, and + stashing. (This is the successor to the old `:Gstatus`.) +* This command (along with all other commands) always uses the current + buffer's repository, so you don't need to worry about the current working + directory. + +Additional commands are provided for higher level operations: + +* View any blob, tree, commit, or tag in the repository with `:Gedit` (and + `:Gsplit`, etc.). For example, `:Gedit HEAD~3:%` loads the current file as + it existed 3 commits ago. +* `:Gdiffsplit` (or `:Gvdiffsplit`) brings up the staged version of the file + side by side with the working tree version. Use Vim's diff handling + capabilities to apply changes to the staged version, and write that buffer + to stage the changes. You can also give an arbitrary `:Gedit` argument to + diff against older versions of the file. +* `:Gread` is a variant of `git checkout -- filename` that operates on the + buffer rather than the file itself. This means you can use `u` to undo it + and you never get any warnings about the file changing outside Vim. +* `:Gwrite` writes to both the work tree and index versions of a file, making + it like `git add` when called from a work tree file and like `git checkout` + when called from the index or a blob in history. +* `:Ggrep` is `:grep` for `git grep`. `:Glgrep` is `:lgrep` for the same. +* `:GMove` does a `git mv` on the current file and changes the buffer name to + match. `:GRename` does the same with a destination filename relative to the + current file's directory. +* `:GDelete` does a `git rm` on the current file and simultaneously deletes + the buffer. `:GRemove` does the same but leaves the (now empty) buffer + open. +* `:GBrowse` to open the current file on the web front-end of your favorite + hosting provider, with optional line range (try it in visual mode). Plugins + are available for popular providers such as [GitHub][rhubarb.vim], + [GitLab][fugitive-gitlab.vim], [Bitbucket][fubitive.vim], + [Gitee][fugitive-gitee.vim], [Pagure][pagure], + [Phabricator][vim-phabricator], [Azure DevOps][fugitive-azure-devops.vim], + and [sourcehut][srht.vim]. + +[rhubarb.vim]: https://github.com/tpope/vim-rhubarb +[fugitive-gitlab.vim]: https://github.com/shumphrey/fugitive-gitlab.vim +[fubitive.vim]: https://github.com/tommcdo/vim-fubitive +[fugitive-gitee.vim]: https://github.com/linuxsuren/fugitive-gitee.vim +[pagure]: https://github.com/FrostyX/vim-fugitive-pagure +[vim-phabricator]: https://github.com/jparise/vim-phabricator +[fugitive-azure-devops.vim]: https://github.com/cedarbaum/fugitive-azure-devops.vim +[srht.vim]: https://git.sr.ht/~willdurand/srht.vim + +Add `%{FugitiveStatusline()}` to `'statusline'` to get an indicator +with the current branch in your statusline. + +For more information, see `:help fugitive`. + +## Screencasts + +* [A complement to command line git](http://vimcasts.org/e/31) +* [Working with the git index](http://vimcasts.org/e/32) +* [Resolving merge conflicts with vimdiff](http://vimcasts.org/e/33) +* [Browsing the git object database](http://vimcasts.org/e/34) +* [Exploring the history of a git repository](http://vimcasts.org/e/35) + +## Installation + +Install using your favorite package manager, or use Vim's built-in package +support: + + mkdir -p ~/.vim/pack/tpope/start + cd ~/.vim/pack/tpope/start + git clone https://tpope.io/vim/fugitive.git + vim -u NONE -c "helptags fugitive/doc" -c q + +## FAQ + +> What happened to the dispatch.vim backed asynchronous `:Gpush` and +> `:Gfetch`? + +This behavior was divisive, confusing, and complicated inputting passwords, so +it was removed. Use `:Git! push` to use Fugitive's own asynchronous +execution, or retroactively make `:Git push` asynchronous by pressing +`CTRL-D`. + +> Why am I getting `core.worktree is required when using an external Git dir`? + +Git generally sets `core.worktree` for you automatically when necessary, but +if you're doing something weird, or using a third-party tool that does +something weird, you may need to set it manually: + + git config core.worktree "$PWD" + +This may be necessary even when simple `git` commands seem to work fine +without it. + +> So I have a symlink and... + +Stop. Just stop. If Git won't deal with your symlink, then Fugitive won't +either. Consider using a [plugin that resolves +symlinks](https://github.com/aymericbeaumet/symlink.vim), or even better, +using fewer symlinks. + +## Self-Promotion + +Like fugitive.vim? Follow the repository on +[GitHub](https://github.com/tpope/vim-fugitive) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=2975). 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/pack/plugins/start/vim-fugitive/autoload/fugitive.vim b/.vim/pack/plugins/start/vim-fugitive/autoload/fugitive.vim new file mode 100644 index 0000000..2073b36 --- /dev/null +++ b/.vim/pack/plugins/start/vim-fugitive/autoload/fugitive.vim @@ -0,0 +1,8430 @@ +" Location: autoload/fugitive.vim +" Maintainer: Tim Pope + +" The functions contained within this file are for internal use only. For the +" official API, see the commented functions in plugin/fugitive.vim. + +if exists('g:autoloaded_fugitive') + finish +endif +let g:autoloaded_fugitive = 1 + +" Section: Utility + +function! s:function(name) abort + return function(substitute(a:name,'^s:',matchstr(expand(''), '.*\zs\d\+_'),'')) +endfunction + +function! s:sub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'') +endfunction + +function! s:gsub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'g') +endfunction + +function! s:Uniq(list) abort + let i = 0 + let seen = {} + while i < len(a:list) + let str = string(a:list[i]) + if has_key(seen, str) + call remove(a:list, i) + else + let seen[str] = 1 + let i += 1 + endif + endwhile + return a:list +endfunction + +function! s:JoinChomp(list) abort + if empty(a:list[-1]) + return join(a:list[0:-2], "\n") + else + return join(a:list, "\n") + endif +endfunction + +function! s:winshell() abort + return has('win32') && &shellcmdflag !~# '^-' +endfunction + +function! s:WinShellEsc(arg) abort + if type(a:arg) == type([]) + return join(map(copy(a:arg), 's:WinShellEsc(v:val)')) + elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + else + return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"' + endif +endfunction + +function! s:shellesc(arg) abort + if type(a:arg) == type([]) + return join(map(copy(a:arg), 's:shellesc(v:val)')) + elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + elseif s:winshell() + return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"' + else + return shellescape(a:arg) + endif +endfunction + +function! s:fnameescape(file) abort + if type(a:file) == type([]) + return join(map(copy(a:file), 's:fnameescape(v:val)')) + else + return fnameescape(a:file) + endif +endfunction + +function! fugitive#UrlDecode(str) abort + return substitute(a:str, '%\(\x\x\)', '\=iconv(nr2char("0x".submatch(1)), "utf-8", "latin1")', 'g') +endfunction + +function! s:UrlEncode(str) abort + return substitute(a:str, '[%#?&;+=\<> [:cntrl:]]', '\=printf("%%%02X", char2nr(submatch(0)))', 'g') +endfunction + +function! s:PathUrlEncode(str) abort + return substitute(a:str, '[%#?[:cntrl:]]', '\=printf("%%%02X", char2nr(submatch(0)))', 'g') +endfunction + +function! s:PathJoin(prefix, str) abort + if a:prefix =~# '://' + return a:prefix . s:PathUrlEncode(a:str) + else + return a:prefix . a:str + endif +endfunction + +function! s:throw(string) abort + throw 'fugitive: '.a:string +endfunction + +function! s:VersionCheck() abort + if v:version < 704 + return 'return ' . string('echoerr "fugitive: Vim 7.4 or newer required"') + elseif empty(fugitive#GitVersion()) + let exe = get(s:GitCmd(), 0, '') + if len(exe) && !executable(exe) + return 'return ' . string('echoerr "fugitive: cannot find ' . string(exe) . ' in PATH"') + endif + return 'return ' . string('echoerr "fugitive: cannot execute Git"') + elseif !fugitive#GitVersion(1, 8, 5) + return 'return ' . string('echoerr "fugitive: Git 1.8.5 or newer required"') + else + if exists('b:git_dir') && empty(b:git_dir) + unlet! b:git_dir + endif + return '' + endif +endfunction + +let s:worktree_error = "core.worktree is required when using an external Git dir" +function! s:DirCheck(...) abort + let dir = call('FugitiveGitDir', a:000) + if !empty(dir) && FugitiveWorkTree(dir, 1) is# 0 + return 'return ' . string('echoerr "fugitive: ' . s:worktree_error . '"') + elseif !empty(dir) + return '' + elseif empty(bufname('')) + return 'return ' . string('echoerr "fugitive: working directory does not belong to a Git repository"') + else + return 'return ' . string('echoerr "fugitive: file does not belong to a Git repository"') + endif +endfunction + +function! s:Mods(mods, ...) abort + let mods = substitute(a:mods, '\C', '', '') + let mods = mods =~# '\S$' ? mods . ' ' : mods + if a:0 && mods !~# '\<\d*\%(aboveleft\|belowright\|leftabove\|rightbelow\|topleft\|botright\|tab\)\>' + let default = a:1 + if default ==# 'SpanOrigin' + if s:OriginBufnr() > 0 && (mods =~# '\' ? &winfixheight : &winfixwidth) + let default = 'Edge' + else + let default = '' + endif + endif + if default ==# 'Edge' + if mods =~# '\' ? &splitright : &splitbelow + let mods = 'botright ' . mods + else + let mods = 'topleft ' . mods + endif + else + let mods = default . ' ' . mods + endif + endif + return substitute(mods, '\s\+', ' ', 'g') +endfunction + +if exists('+shellslash') + + let s:dir_commit_file = '\c^fugitive://\%(/[^/]\@=\)\=\([^?#]\{-1,\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/[^?#]*\)\=\)\=$' + + function! s:Slash(path) abort + return tr(a:path, '\', '/') + endfunction + + function! s:VimSlash(path) abort + return tr(a:path, '\/', &shellslash ? '//' : '\\') + endfunction + +else + + let s:dir_commit_file = '\c^fugitive://\([^?#]\{-\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/[^?#]*\)\=\)\=$' + + function! s:Slash(path) abort + return a:path + endfunction + + function! s:VimSlash(path) abort + return a:path + endfunction + +endif + +function! s:AbsoluteVimPath(...) abort + if a:0 && type(a:1) == type('') + let path = a:1 + else + let path = bufname(a:0 && a:1 > 0 ? a:1 : '') + if getbufvar(a:0 && a:1 > 0 ? a:1 : '', '&buftype') !~# '^\%(nowrite\|acwrite\)\=$' + return path + endif + endif + if s:Slash(path) =~# '^/\|^\a\+:' + return path + else + return getcwd() . matchstr(getcwd(), '[\\/]') . path + endif +endfunction + +function! s:Resolve(path) abort + let path = resolve(a:path) + if has('win32') + let path = s:VimSlash(fnamemodify(fnamemodify(path, ':h'), ':p') . fnamemodify(path, ':t')) + endif + return path +endfunction + +function! s:FileIgnoreCase(for_completion) abort + return (exists('+fileignorecase') && &fileignorecase) + \ || (a:for_completion && exists('+wildignorecase') && &wildignorecase) +endfunction + +function! s:cpath(path, ...) abort + if s:FileIgnoreCase(0) + let path = s:VimSlash(tolower(a:path)) + else + let path = s:VimSlash(a:path) + endif + return a:0 ? path ==# s:cpath(a:1) : path +endfunction + +let s:quote_chars = { + \ "\007": 'a', "\010": 'b', "\011": 't', "\012": 'n', "\013": 'v', "\014": 'f', "\015": 'r', + \ '"': '"', '\': '\'} + +let s:unquote_chars = { + \ 'a': "\007", 'b': "\010", 't': "\011", 'n': "\012", 'v': "\013", 'f': "\014", 'r': "\015", + \ '"': '"', '\': '\'} + +function! s:Quote(string) abort + let string = substitute(a:string, "[\001-\037\"\\\177]", '\="\\" . get(s:quote_chars, submatch(0), printf("%03o", char2nr(submatch(0))))', 'g') + if string !=# a:string + return '"' . string . '"' + else + return string + endif +endfunction + +function! fugitive#Unquote(string) abort + let string = substitute(a:string, "\t*$", '', '') + if string =~# '^".*"$' + return substitute(string[1:-2], '\\\(\o\o\o\|.\)', '\=get(s:unquote_chars, submatch(1), iconv(nr2char("0" . submatch(1)), "utf-8", "latin1"))', 'g') + else + return string + endif +endfunction + +let s:executables = {} + +function! s:executable(binary) abort + if !has_key(s:executables, a:binary) + let s:executables[a:binary] = executable(a:binary) + endif + return s:executables[a:binary] +endfunction + +if !exists('s:temp_scripts') + let s:temp_scripts = {} +endif +function! s:TempScript(...) abort + let body = join(a:000, "\n") + if !has_key(s:temp_scripts, body) + let s:temp_scripts[body] = tempname() . '.sh' + endif + let temp = s:temp_scripts[body] + if !filereadable(temp) + call writefile(['#!/bin/sh'] + a:000, temp) + endif + let temp = FugitiveGitPath(temp) + if temp =~# '\s' + let temp = '"' . temp . '"' + endif + return temp +endfunction + +function! s:DoAutocmd(...) abort + return join(map(copy(a:000), "'doautocmd ' . v:val"), '|') +endfunction + +function! s:Map(mode, lhs, rhs, ...) abort + let maps = [] + let flags = a:0 && type(a:1) == type('') ? a:1 : '' + let defer = flags =~# '' + let flags = substitute(flags, '', '', '') . (a:rhs =~# '' ? '' : '