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 =~# '' ? '' : '