1 Commits

Author SHA1 Message Date
Tim Pope
ef87434b87 Provide :Git difftool and :Git mergetool
References https://github.com/tpope/vim-fugitive/issues/132
2020-01-05 16:36:11 -05:00
6 changed files with 1449 additions and 2168 deletions

View File

@@ -1,66 +1,51 @@
# fugitive.vim # fugitive.vim
Fugitive is the premier Vim plugin for Git. Or maybe it's the premier Git I'm not going to lie to you; fugitive.vim may very well be the best
plugin for Vim? Either way, it's "so awesome, it should be illegal". That's Git wrapper of all time. Check out these features:
why it's called Fugitive.
The crown jewel of Fugitive is `:Git` (or just `:G`), which calls any Bring up an enhanced version of `git status` with `:G` (also known as
arbitrary Git command. If you know how to use Git at the command line, you `:Gstatus`). Press `g?` to bring up a list of maps for numerous operations
know how to use `:Git`. It's vaguely akin to `:!git` but with numerous including diffing, staging, committing, rebasing, and stashing.
improvements:
* The default behavior is to directly echo the command's output. Quiet View any blob, tree, commit, or tag in the repository with `:Gedit` (and
commands like `:Git add` avoid the dreaded "Press ENTER or type command to `:Gsplit`, `:Gvsplit`, `:Gtabedit`, ...). Edit a file in the index and
continue" prompt. write to it to stage the changes. Use `:Gdiffsplit` to bring up the staged
* `:Git commit`, `:Git rebase -i`, and other commands that invoke an editor do version of the file side by side with the working tree version and use
their editing in the current Vim instance. Vim's diff handling capabilities to stage a subset of the file's
* `:Git diff`, `:Git log`, and other verbose, paginated commands have their changes.
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: Commit, merge, and rebase with `:Gcommit`, `:Gmerge`, and `:Grebase`, using
the current Vim instance to edit commit messages and the rebase todo list.
Use `:Gpush`, `:Gfetch`, and `:Gpull` to send and retrieve upstream changes.
* View any blob, tree, commit, or tag in the repository with `:Gedit` (and `:Gblame` brings up an interactive vertical split with `git blame`
`:Gsplit`, etc.). For example, `:Gedit HEAD~3:%` loads the current file as output. Press enter on a line to edit the commit where the line
it existed 3 commits ago. changed, or `o` to open it in a split. When you're done, use `:Gedit`
* `:Gdiffsplit` brings up the staged version of the file side by side with the in the historic buffer to go back to the work tree version.
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 `:Gmove` does a `git mv` on a file and simultaneously renames the
also give an arbitrary `:Gedit` argument to diff against older versions of buffer. `:Gdelete` does a `git rm` on a file and simultaneously deletes
the file. the buffer.
* `: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 Use `:Ggrep` to search the work tree (or any arbitrary commit) with
`git grep`, skipping over that which is not tracked in the repository.
`:Gclog` and `:Gllog` load all previous commits into the quickfix or location
list. Give them a range (e.g., using visual mode and `:'<,'>Gclog`) to
iterate over every change to that portion of the current file.
`:Gread` is a variant of `git checkout -- filename` that operates on the
buffer rather than the filename. This means you can use `u` to undo it
and you never get any warnings about the file changing outside Vim. 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 `:Gwrite` writes to both the work tree and index versions of a file,
it like `git add` when called from a work tree file and like `git checkout` making it like `git add` when called from a work tree file and like
when called from the index or a blob in history. `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 Use `:Gbrowse` to open the current file on the web front-end of your favorite
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 hosting provider, with optional line range (try it in visual mode). Plugins
are available for popular providers such as [GitHub][rhubarb.vim], are available for popular providers such as [GitHub][rhubarb.vim],
[GitLab][fugitive-gitlab.vim], [Bitbucket][fubitive.vim], [GitLab][fugitive-gitlab.vim], [Bitbucket][fubitive.vim],
[Gitee][fugitive-gitee.vim], [Pagure][pagure], [Gitee][fugitive-gitee.vim], [Pagure][pagure], and
[Phabricator][vim-phabricator], [Azure DevOps][fugitive-azure-devops.vim], [Phabricator][vim-phabricator].
and [sourcehut][srht.vim].
[rhubarb.vim]: https://github.com/tpope/vim-rhubarb [rhubarb.vim]: https://github.com/tpope/vim-rhubarb
[fugitive-gitlab.vim]: https://github.com/shumphrey/fugitive-gitlab.vim [fugitive-gitlab.vim]: https://github.com/shumphrey/fugitive-gitlab.vim
@@ -68,12 +53,12 @@ Additional commands are provided for higher level operations:
[fugitive-gitee.vim]: https://github.com/linuxsuren/fugitive-gitee.vim [fugitive-gitee.vim]: https://github.com/linuxsuren/fugitive-gitee.vim
[pagure]: https://github.com/FrostyX/vim-fugitive-pagure [pagure]: https://github.com/FrostyX/vim-fugitive-pagure
[vim-phabricator]: https://github.com/jparise/vim-phabricator [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 Add `%{FugitiveStatusline()}` to `'statusline'` to get an indicator
with the current branch in your statusline. with the current branch in your statusline.
Last but not least, there's `:Git` for running any arbitrary command.
For more information, see `:help fugitive`. For more information, see `:help fugitive`.
## Screencasts ## Screencasts
@@ -95,25 +80,20 @@ Install using your favorite package manager, or use Vim's built-in package suppo
## FAQ ## FAQ
> What happened to the dispatch.vim backed asynchronous `:Gpush` and > Why can't I enter my password when I `:Gpush`?
> `:Gfetch`?
This behavior was divisive, confusing, and complicated inputting passwords, so It is highly recommended to use SSH keys or [credentials caching][] to avoid
it was removed. Use `:Dispatch git push` for effectively the same behavior, entering your password on every upstream interaction. If this isn't an
or provide your own asynchronous `:Gpush` and `:Gfetch` by adding the option, the official solution is to use the `core.askPass` Git option to
following to your vimrc: request the password via a GUI. Fugitive will configure this for you
automatically if you have `ssh-askpass` or `git-gui` installed; otherwise it's
your responsibility to set this up.
command! -bang -bar -nargs=* Gpush execute 'Dispatch<bang> -dir=' . As an absolute last resort, you can invoke `:Git --paginate push`. Fugitive
\ fnameescape(FugitiveGitDir()) 'git push' <q-args> recognizes the pagination request and fires up a `:terminal`, which allows for
command! -bang -bar -nargs=* Gfetch execute 'Dispatch<bang> -dir=' . interactive password entry.
\ fnameescape(FugitiveGitDir()) 'git fetch' <q-args>
> So I have a symlink and... [credentials caching]: https://help.github.com/en/articles/caching-your-github-password-in-git
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 ## Self-Promotion

File diff suppressed because it is too large Load Diff

View File

@@ -16,31 +16,62 @@ These commands are local to the buffers in which they work (generally, buffers
that are part of Git repositories). that are part of Git repositories).
*:Git* *fugitive-:G* *:Git* *fugitive-:G*
:Git {args} Run an arbitrary git command and display any output. :Git {args} Run an arbitrary git command. Similar to :!git [args]
:G {args} On UNIX this uses a pty and on other platforms it uses :G {args} but chdir to the repository tree first. For some
a pipe, which will cause some behavior differences subcommands, a Fugitive command is called instead.
such as the absence of progress bars. Any file the
command edits (for example, a commit message) will be
loaded into a split window. Closing that window will
resume running the command. A few Git subcommands
have different behavior; these are documented below.
*:Git_--paginate* *:Git_-p* *:Git!*
:Git --paginate {args} Run an arbitrary git command, capture output to a temp :Git! {args} Like |:Git|, but capture the output into a temp file,
:Git -p {args} file, and |:split| that temp file. Use :0Git to :Git --no-pager {args} and |:split| that temp file. Use :0Git to
:G --paginate {args} |:edit| the temp file instead. A temp file is always :Git -P {args} |:edit| the temp file instead. A temp file is always
:G -p {args} used for commands like diff and log that typically used for diff and log commands.
user a pager, and for any command that has the
pager.<cmd> Git configuration option set.
*fugitive-summary* *:Gstatus*
:Git With no arguments, bring up a summary window vaguely :Git Bring up a summary window vaguely akin to git-status.
:G akin to git-status. Press g? or see |fugitive-maps| :G Press g? or see |fugitive-maps| for usage.
for usage. :Gstatus
*:Git_blame* *:Git-commit* *:Gcommit*
:Git commit [args] A wrapper around git-commit. Unless the arguments
:Gcommit [args] given would skip the invocation of an editor (e.g.,
-m), a split window will be used to obtain a commit
message, or a new tab if -v is given. Write and close
the window (:wq) to finish the commit. To cancel, use
an empty message.
*:Git-revert* *:Grevert*
:Git revert [args] A wrapper around git-revert. Similar to |:Gcommit|.
:Grevert [args]
*:Git-merge* *:Gmerge*
:Git merge [args] Calls git-merge and loads errors and conflicted files
:Gmerge [args] into the |quickfix| list. Opens a |:Gcommit| style
split window for the commit message if the merge
succeeds. If called during a merge conflict, the
conflicted files from the current index are loaded
into the |quickfix| list.
*:Git-pull* *:Gpull*
:Git pull [args] Like |:Gmerge|, but for git-pull.
:Gpull [args]
*:Git-rebase* *:Grebase*
:Git rebase [args] Like |:Gmerge|, but for git-rebase. Interactive
:Grebase [args] rebase is experimentally supported.
*:Git-push* *:Gpush*
:Git push [args] Invoke git-push, load the results into the |quickfix|
:Gpush [args] list, and invoke |:cwindow| to reveal any errors.
|:Dispatch| is used if available for asynchronous
invocation.
*:Git-fetch* *:Gfetch*
:Git fetch [args] Like |:Gpush|, but for git-fetch.
:Gfetch [args]
*:Git-blame* *:Gblame*
:Git blame [flags] Run git-blame [flags] on the current file and open the :Git blame [flags] Run git-blame [flags] on the current file and open the
results in a scroll-bound vertical split. The :Gblame [flags] results in a scroll-bound vertical split. The
following maps, which work on the cursor line commit following maps, which work on the cursor line commit
where sensible, are provided: where sensible, are provided:
@@ -59,32 +90,12 @@ that are part of Git repositories).
~ reblame at [count]th first grandparent ~ reblame at [count]th first grandparent
P reblame at [count]th parent (like HEAD^[count]) P reblame at [count]th parent (like HEAD^[count])
*g:fugitive_dynamic_colors* :[range]Gblame [flags] If a range is given, just that part of the file will
In the GUI or a 256 color terminal, commit hashes will :Gblame [flags] {file} be blamed, and a horizontal split without
highlighted in different colors. To disable this: :Git blame ... scrollbinding is used. You can also give an arbitrary
>
let g:fugitive_dynamic_colors = 0
<
:[range]Git blame [...] If a range is given, just that part of the file will
:Git blame [...] {file} be blamed, and a horizontal split without
scrollbinding is used. You can also give an arbitrary
filename. filename.
*:Git_difftool* *:Ggrep* *:Gcgrep* *:Git-grep*
:Git[!] difftool [args] Invoke `git diff [args]` and load the changes into the
quickfix list. Each changed hunk gets a separate
quickfix entry unless you pass an option like
--name-only or --name-status. Jumps to the first
change unless [!] is given.
:Git difftool -y [args] Invoke `git diff [args]`, open each changed file in a
new tab, and invoke |:Gdiffsplit!| against the
appropriate commit.
*:Git_mergetool*
:Git mergetool [args] Like |:Git_difftool|, but target merge conflicts.
*:Ggrep* *:Gcgrep* *:Git_grep*
:Ggrep[!] [args] |:grep|[!] with git-grep as 'grepprg'. :Ggrep[!] [args] |:grep|[!] with git-grep as 'grepprg'.
:Git[!] grep [args] :Git[!] grep [args]
@@ -92,14 +103,24 @@ that are part of Git repositories).
:Glgrep[!] [args] |:lgrep|[!] with git-grep as 'grepprg'. :Glgrep[!] [args] |:lgrep|[!] with git-grep as 'grepprg'.
:0Git[!] grep [args] :0Git[!] grep [args]
*:Gclog* *:Git-difftool*
:Gclog[!] [args] Use git-log [args] to load the commit history into the :Git[!] difftool [args] Invoke `git diff [args]` and load the changes into the
|quickfix| list. Jumps to the first commit unless [!] quickfix list. Each changed hunk gets a separate
is given. quickfix entry unless you pass an option like
--name-only or --name-status. Jumps to the first
change unless [!] is given.
The quickfix list can be awkward for many use cases :Git difftool -y [args] Invoke `git diff [args]`, open each changed file in a
and exhibits extremely poor performance with larger new tab, and invoke `:Gdiffsplit` against the
data sets. Consider using |:Git| log instead. appropriate commit.
*:Git-mergetool*
:Git mergetool [args] Like |:Git-difftool|, but target merge conflicts.
*:Gclog* *:Glog*
:Gclog[!] [args] Use git-log [args] to load the commit history into the
:Glog[!] [args] |quickfix| list. Jumps to the first commit unless [!]
is given.
:{range}Gclog[!] [args] Use git-log -L to load previous revisions of the given :{range}Gclog[!] [args] Use git-log -L to load previous revisions of the given
range of the current file into the |quickfix| list. range of the current file into the |quickfix| list.
@@ -132,6 +153,13 @@ that are part of Git repositories).
*:Gpedit* *:Gpedit*
:Gpedit [object] |:pedit| a |fugitive-object|. :Gpedit [object] |:pedit| a |fugitive-object|.
:Gsplit! [args] *:Gsplit!* *:Gvsplit!*
:Gvsplit! [args] *:Gtabedit!* *:Gpedit!*
:Gtabedit! [args] Capture the output of `git [args]` to a temp file and
:Gpedit! [args] open it in a split, tab, or preview window. Use
:0Gsplit! to suppress the split and open it in the
current window.
*:Gread* *fugitive-:Gr* *:Gread* *fugitive-:Gr*
:Gread [object] Empty the buffer and |:read| a |fugitive-object|. :Gread [object] Empty the buffer and |:read| a |fugitive-object|.
When the argument is omitted, this is similar to When the argument is omitted, this is similar to
@@ -180,7 +208,7 @@ that are part of Git repositories).
focus on the current window. During a merge conflict, focus on the current window. During a merge conflict,
this is a three-way diff against the "ours" and this is a three-way diff against the "ours" and
"theirs" ancestors. Additional d2o and d3o maps are "theirs" ancestors. Additional d2o and d3o maps are
provided to obtain the hunk from the "ours" or provided to to obtain the hunk from the "ours" or
"theirs" ancestor, respectively. "theirs" ancestor, respectively.
:Gdiffsplit! {object} Like |:Gdiffsplit|, but retain focus on the current :Gdiffsplit! {object} Like |:Gdiffsplit|, but retain focus on the current
@@ -189,57 +217,58 @@ that are part of Git repositories).
*:Gvdiffsplit* *:Gvdiffsplit*
:Gvdiffsplit [object] Like |:Gdiffsplit|, but always split vertically. :Gvdiffsplit [object] Like |:Gdiffsplit|, but always split vertically.
*:Ghdiffsplit* *:Ghdiffsplit* *:Gsdiff*
:Ghdiffsplit [object] Like |:Gdiffsplit|, but always split horizontally. :Ghdiffsplit [object] Like |:Gdiffsplit|, but always split horizontally.
*:GMove* *:Gmove*
:GMove {destination} Wrapper around git-mv that renames the buffer :Gmove {destination} Wrapper around git-mv that renames the buffer
afterward. Add a ! to pass -f. afterward. Add a ! to pass -f.
*:GRename* *:Grename*
:GRename {destination} Like |:GMove| but operates relative to the parent :Grename {destination} Like |:Gmove| but operates relative to the parent
directory of the current file. directory of the current file.
*:GDelete* *:Gdelete*
:GDelete Wrapper around git-rm that deletes the buffer :Gdelete Wrapper around git-rm that deletes the buffer
afterward. When invoked in an index file, --cached is afterward. When invoked in an index file, --cached is
passed. Add a ! to pass -f and forcefully discard the passed. Add a ! to pass -f and forcefully discard the
buffer. buffer.
*:GRemove* *:Gremove*
:GRemove Like |:GDelete|, but keep the (now empty) buffer around. :Gremove Like :Gdelete, but keep the (now empty) buffer around.
*:GBrowse* *:Gbrowse*
:GBrowse Open the current file, blob, tree, commit, or tag :Gbrowse Open the current file, blob, tree, commit, or tag
in your browser at the upstream hosting provider. in your browser at the upstream hosting provider.
If a range is given, it is appropriately appended to
the URL as an anchor.
Upstream providers can be added by installing an Upstream providers can be added by installing an
appropriate Vim plugin. For example, GitHub can be appropriate Vim plugin. For example, GitHub can be
supported by installing rhubarb.vim, available at supported by installing rhubarb.vim, available at
<https://github.com/tpope/vim-rhubarb>. <https://github.com/tpope/vim-rhubarb>.
:GBrowse {object} Like :GBrowse, but for a given |fugitive-object|. :Gbrowse {object} Like :Gbrowse, but for a given |fugitive-object|.
:{range}GBrowse [args] Appends an anchor to the URL that emphasizes the :Gbrowse [...]@{remote} Force using the given remote rather than the remote
for the current branch. The remote is used to
determine which upstream repository to link to.
:{range}Gbrowse [args] Appends an anchor to the URL that emphasizes the
selected lines. This also forces the URL to include a selected lines. This also forces the URL to include a
commit rather than a branch name so it remains valid commit rather than a branch name so it remains valid
if the file changes. You can give a range of "0" to if the file changes. You can give a range of "0" to
force this behavior without including an anchor. force this behavior without including an anchor.
:GBrowse [...]@{remote} Force using the given remote rather than the remote :[range]Gbrowse! [args] Like :Gbrowse, but put the URL on the clipboard rather
for the current branch. The remote is used to
determine which upstream repository to link to.
:GBrowse {url} Open an arbitrary URL in your browser.
:[range]GBrowse! [args] Like :GBrowse, but put the URL on the clipboard rather
than opening it. than opening it.
MAPS *fugitive-maps* MAPS *fugitive-maps*
These maps are available in both the |fugitive-summary| buffer and Fugitive These maps are available in both the |:Gstatus| buffer and Fugitive object
object buffers, although not all maps make sense in all buffers. Mappings buffers, although not all maps make sense in all buffers. Mappings that
that operate on the file or hunk under the cursor are generally available in operate on the file or hunk under the cursor are generally available in visual
visual mode to operate on multiple files or partial hunks. mode to operate on multiple files or partial hunks.
*fugitive-staging-maps* *fugitive-staging-maps*
Staging/unstaging maps ~ Staging/unstaging maps ~
@@ -260,9 +289,10 @@ U Unstage everything.
X Discard the change under the cursor. This uses X Discard the change under the cursor. This uses
`checkout` or `clean` under the hood. A command is `checkout` or `clean` under the hood. A command is
echoed that shows how to undo the change. Consult echoed that shows how to undo the change. Consult
`:messages` to see it again. During a merge conflict, `:messages` to see it again. You can use this during
use 2X to call `checkout --ours` or 3X to call a merge conflict do discard "our" changes (--theirs)
`checkout --theirs` . in the "Unstaged" section or discard "their" changes
(--ours) in the "Staged" section.
*fugitive_=* *fugitive_=*
= Toggle an inline diff of the file under the cursor. = Toggle an inline diff of the file under the cursor.
@@ -285,7 +315,7 @@ P under the cursor. On untracked files, this instead
*fugitive_d* *fugitive_d*
Diff maps ~ Diff maps ~
*fugitive_dp* *fugitive_dp*
dp Invoke |:Git| diff on the file under the cursor. dp Invoke |:Git!| diff on the file under the cursor.
Deprecated in favor of inline diffs. Deprecated in favor of inline diffs.
*fugitive_dd* *fugitive_dd*
@@ -384,7 +414,7 @@ i Jump to the next file or hunk, expanding inline diffs
][ Jump [count] section ends forward. ][ Jump [count] section ends forward.
*fugitive_star* *fugitive_star*
* On the first column of a + or - diff line, search for * One the first column of a + or - diff line, search for
the corresponding - or + line. Otherwise, defer to the corresponding - or + line. Otherwise, defer to
built-in |star|. built-in |star|.
@@ -479,7 +509,7 @@ czz Push stash. Pass a [count] of 1 to add
`--include-untracked` or 2 to add `--all`. `--include-untracked` or 2 to add `--all`.
czw Push stash of worktree. Like `czz` with czw Push stash of worktree. Like `czz` with
`--keep-index`. `--include-index`.
czA Apply topmost stash, or stash@{count}. czA Apply topmost stash, or stash@{count}.
@@ -588,9 +618,7 @@ Makefile The file named Makefile in the work tree
!:Makefile The file named Makefile in the commit owning the current file !:Makefile The file named Makefile in the commit owning the current file
!3^2 The second parent of the commit owning buffer #3 !3^2 The second parent of the commit owning buffer #3
.git/config The repo config file .git/config The repo config file
: The |fugitive-summary| buffer : Same as |:Gstatus|
- A temp file containing the last |:Git| invocation's output
<cfile> The file or commit under the cursor
STATUSLINE *fugitive-statusline* STATUSLINE *fugitive-statusline*
@@ -607,39 +635,6 @@ HEAD is detached, FugitiveHead() will return the empty string, unless the
optional argument is given, in which case the hash of the current commit will optional argument is given, in which case the hash of the current commit will
be truncated to the given number of characters. be truncated to the given number of characters.
DEPRECATIONS *fugitive-deprecated*
The following commands are softly deprecated in favor of replacements that
adhere to a new naming scheme. They will eventually be removed, but probably
not in the near future.
Remember that |:Git| can be shortened to |:G|, so replacements using it are
just one space character longer than the legacy version.
*:Gremove* Superseded by |:GRemove|.
*:Gdelete* Superseded by |:GDelete|.
*:Gmove* Superseded by |:GMove|.
*:Grename* Superseded by |:GRename|.
*:Gbrowse* Superseded by |:GBrowse|.
*:Gdiff* Superseded by |:Gdiffsplit|
*:Gsdiff* Superseded by |:Ghdiffsplit|
*:Gvdiff* Superseded by |:Gvdiffsplit| or |:vert| |:Gdiffsplit|.
*:Gblame* Superseded by |:Git_blame|.
*:Gcommit* Superseded by |:Git| commit.
*:Gmerge* Superseded by |:Git| merge and |:Git_mergetool|.
*:Gpull* Superseded by |:Git| pull.
*:Grebase* Superseded by |:Git| rebase.
*:Grevert* Superseded by |:Git| revert.
*:Gpush* Superseded by |:Git| push.
*:Gfetch* Superseded by |:Git| fetch.
*:Glog* Superseded by |:Gclog|.
*:Gstatus* Superseded by |:Git| (with no arguments).
*:Git!* Superseded by |:Git_--paginate|.
*:Gsplit!* Superseded by |:Git_--paginate|.
*:Gvsplit!* Superseded by :vert Git --paginate.
*:Gtabsplit!* Superseded by :tab Git --paginate.
*:Gpedit!* Superseded by :Git! --paginate.
ABOUT *fugitive-about* ABOUT *fugitive-about*
Grab the latest version or report a bug on GitHub: Grab the latest version or report a bug on GitHub:

View File

@@ -1,6 +0,0 @@
if exists("b:did_ftplugin") || !exists('*fugitive#BlameFileType')
finish
endif
let b:did_ftplugin = 1
call fugitive#BlameFileType()

View File

@@ -1,6 +1,6 @@
" fugitive.vim - A Git wrapper so awesome, it should be illegal " fugitive.vim - A Git wrapper so awesome, it should be illegal
" Maintainer: Tim Pope <http://tpo.pe/> " Maintainer: Tim Pope <http://tpo.pe/>
" Version: 3.3 " Version: 3.1
" GetLatestVimScripts: 2975 1 :AutoInstall: fugitive.vim " GetLatestVimScripts: 2975 1 :AutoInstall: fugitive.vim
if exists('g:loaded_fugitive') if exists('g:loaded_fugitive')
@@ -8,8 +8,6 @@ if exists('g:loaded_fugitive')
endif endif
let g:loaded_fugitive = 1 let g:loaded_fugitive = 1
let s:bad_git_dir = '/$\|^fugitive:'
function! FugitiveGitDir(...) abort function! FugitiveGitDir(...) abort
if !a:0 || type(a:1) == type(0) && a:1 < 0 if !a:0 || type(a:1) == type(0) && a:1 < 0
if exists('g:fugitive_event') if exists('g:fugitive_event')
@@ -18,21 +16,12 @@ function! FugitiveGitDir(...) abort
let dir = get(b:, 'git_dir', '') let dir = get(b:, 'git_dir', '')
if empty(dir) && (empty(bufname('')) || &buftype =~# '^\%(nofile\|acwrite\|quickfix\|prompt\)$') if empty(dir) && (empty(bufname('')) || &buftype =~# '^\%(nofile\|acwrite\|quickfix\|prompt\)$')
return FugitiveExtractGitDir(getcwd()) return FugitiveExtractGitDir(getcwd())
elseif (!exists('b:git_dir') || b:git_dir =~# s:bad_git_dir) && empty(&buftype)
let b:git_dir = FugitiveExtractGitDir(expand('%:p'))
return b:git_dir
endif endif
return dir =~# s:bad_git_dir ? '' : dir return dir
elseif type(a:1) == type(0) elseif type(a:1) == type(0)
if a:1 == bufnr('') && (!exists('b:git_dir') || b:git_dir =~# s:bad_git_dir) && empty(&buftype) return getbufvar(a:1, 'git_dir')
let b:git_dir = FugitiveExtractGitDir(expand('%:p'))
endif
let dir = getbufvar(a:1, 'git_dir')
return dir =~# s:bad_git_dir ? '' : dir
elseif type(a:1) == type('') elseif type(a:1) == type('')
return substitute(s:Slash(a:1), '/$', '', '') return substitute(s:Slash(a:1), '/$', '', '')
elseif type(a:1) == type({})
return get(a:1, 'git_dir', '')
else else
return '' return ''
endif endif
@@ -77,8 +66,8 @@ function! FugitivePath(...) abort
endfunction endfunction
" FugitiveParse() takes a fugitive:// URL and returns a 2 element list " FugitiveParse() takes a fugitive:// URL and returns a 2 element list
" containing an object name ("commit:file") and the Git dir. It's effectively " containing the Git dir and an object name ("commit:file"). It's effectively
" the inverse of FugitiveFind(). " then inverse of FugitiveFind().
function! FugitiveParse(...) abort function! FugitiveParse(...) abort
let path = s:Slash(a:0 ? a:1 : @%) let path = s:Slash(a:0 ? a:1 : @%)
if path !~# '^fugitive:' if path !~# '^fugitive:'
@@ -92,22 +81,6 @@ function! FugitiveParse(...) abort
throw v:errmsg throw v:errmsg
endfunction endfunction
" FugitiveResult() returns an object encapsulating the result of the most
" recend :Git command. Will be empty if no result is available. Pass in the
" name of a temp buffer to get the result object for that command instead.
" Contains the following keys:
"
" * "args": List of command arguments, starting with the subcommand. Will be
" empty for usages like :Git --help.
" * "dir": Git dir of the relevant repository.
" * "exit_status": The integer exit code of the process.
" * "flags": Flags passed directly to Git, like -c and --help.
" * "file": Path to file containing command output. Not guaranteed to exist,
" so verify with filereadable() before trying to access it.
function! FugitiveResult(...) abort
return call('fugitive#Result', a:000)
endfunction
" FugitivePrepare() constructs a Git command string which can be executed with " FugitivePrepare() constructs a Git command string which can be executed with
" functions like system() and commands like :!. Integer arguments will be " functions like system() and commands like :!. Integer arguments will be
" treated as buffer numbers, and the appropriate relative path inserted in " treated as buffer numbers, and the appropriate relative path inserted in
@@ -120,66 +93,18 @@ function! FugitivePrepare(...) abort
return call('fugitive#Prepare', a:000) return call('fugitive#Prepare', a:000)
endfunction endfunction
" FugitiveConfig() get returns an opaque structure that can be passed to other
" FugitiveConfig functions in lieu of a Git directory. This can be faster
" when performing multiple config queries. Do not rely on the internal
" structure of the return value as it is not guaranteed. If you want a full
" dictionary of every config value, use FugitiveConfigGetRegexp('.*').
function! FugitiveConfig(...) abort function! FugitiveConfig(...) abort
if a:0 == 2 && (type(a:2) != type({}) || has_key(a:2, 'git_dir')) if a:0 == 2 && type(a:2) != type({})
return fugitive#Config(a:1, FugitiveGitDir(a:2)) return fugitive#Config(a:1, FugitiveGitDir(a:2))
elseif a:0 == 1 && (type(a:1) !=# type('') || a:1 !~# '^[[:alnum:]-]\+\.') elseif a:0 == 1 && a:1 !~# '^[[:alnum:]-]\+\.'
return fugitive#Config(FugitiveGitDir(a:1)) return fugitive#Config(FugitiveGitDir(a:1))
else else
return call('fugitive#Config', a:000) return call('fugitive#Config', a:000)
endif endif
endfunction endfunction
" FugitiveConfigGet() retrieves a Git configuration value. An optional second
" argument provides the Git dir as with FugitiveFind(). Pass a blank string
" to limit to the global config.
function! FugitiveConfigGet(name, ...) abort
return call('FugitiveConfig', [a:name] + a:000)
endfunction
" FugitiveConfigGetAll() is like FugitiveConfigGet() but returns a list of
" all values.
function! FugitiveConfigGetAll(name, ...) abort
if a:0 && type(a:1) ==# type({}) && !has_key(a:1, 'git_dir')
let config = a:1
else
let config = fugitive#Config(FugitiveGitDir(a:0 ? a:1 : -1))
endif
let name = substitute(a:name, '^[^.]\+\|[^.]\+$', '\L&', 'g')
return copy(get(config, name, []))
endfunction
" FugitiveConfigGetRegexp() retrieves a dictionary of all configuration values
" with a key matching the given pattern. Like git config --get-regexp, but
" using a Vim regexp. Second argument has same semantics as
" FugitiveConfigGet().
function! FugitiveConfigGetRegexp(pattern, ...) abort
if a:0 && type(a:1) ==# type({}) && !has_key(a:2, 'git_dir')
let config = a:1
else
let config = fugitive#Config(FugitiveGitDir(a:0 ? a:1 : -1))
endif
let filtered = map(filter(copy(config), 'v:key =~# "\\." && v:key =~# a:pattern'), 'copy(v:val)')
if a:pattern !~# '\\\@<!\%(\\\\\)*\\z[se]'
return filtered
endif
let transformed = {}
for [k, v] in items(filtered)
let k = matchstr(k, a:pattern)
if len(k)
let transformed[k] = v
endif
endfor
return transformed
endfunction
function! FugitiveRemoteUrl(...) abort function! FugitiveRemoteUrl(...) abort
return fugitive#RemoteUrl(a:0 ? a:1 : '', FugitiveGitDir(a:0 > 1 ? a:2 : -1), a:0 > 2 ? a:3 : 0) return fugitive#RemoteUrl(a:0 ? a:1 : '', FugitiveGitDir(a:0 > 1 ? a:2 : -1))
endfunction endfunction
function! FugitiveHead(...) abort function! FugitiveHead(...) abort
@@ -191,7 +116,7 @@ function! FugitiveHead(...) abort
endfunction endfunction
function! FugitiveStatusline(...) abort function! FugitiveStatusline(...) abort
if empty(get(b:, 'git_dir', '')) if !exists('b:git_dir')
return '' return ''
endif endif
return fugitive#Statusline() return fugitive#Statusline()
@@ -327,29 +252,18 @@ function! FugitiveExtractGitDir(path) abort
endfunction endfunction
function! FugitiveDetect(path) abort function! FugitiveDetect(path) abort
if exists('b:git_dir') && b:git_dir =~# '^$\|' . s:bad_git_dir if exists('b:git_dir') && b:git_dir =~# '^$\|/$\|^fugitive:'
unlet b:git_dir unlet b:git_dir
endif endif
if !exists('b:git_dir') if !exists('b:git_dir')
let b:git_dir = FugitiveExtractGitDir(a:path) let dir = FugitiveExtractGitDir(a:path)
if dir !=# ''
let b:git_dir = dir
endif endif
if empty(b:git_dir) || !exists('#User#Fugitive')
return ''
endif endif
if v:version >= 704 || (v:version == 703 && has('patch442')) if exists('b:git_dir')
doautocmd <nomodeline> User Fugitive return fugitive#Init()
elseif &modelines > 0
let modelines = &modelines
try
set modelines=0
doautocmd User Fugitive
finally
let &modelines = modelines
endtry
else
doautocmd User Fugitive
endif endif
return ''
endfunction endfunction
function! FugitiveVimPath(path) abort function! FugitiveVimPath(path) abort
@@ -364,15 +278,13 @@ function! FugitiveGitPath(path) abort
return s:Slash(a:path) return s:Slash(a:path)
endfunction endfunction
function! s:Slash(path) abort
if exists('+shellslash') if exists('+shellslash')
function! s:Slash(path) abort
return tr(a:path, '\', '/') return tr(a:path, '\', '/')
endfunction
else else
function! s:Slash(path) abort
return a:path return a:path
endfunction
endif endif
endfunction
function! s:ProjectionistDetect() abort function! s:ProjectionistDetect() abort
let file = s:Slash(get(g:, 'projectionist_file', '')) let file = s:Slash(get(g:, 'projectionist_file', ''))
@@ -419,19 +331,22 @@ augroup fugitive
autocmd FileType netrw call FugitiveDetect(fnamemodify(get(b:, 'netrw_curdir', expand('<amatch>')), ':p')) autocmd FileType netrw call FugitiveDetect(fnamemodify(get(b:, 'netrw_curdir', expand('<amatch>')), ':p'))
autocmd FileType git autocmd FileType git
\ call fugitive#MapCfile() \ if len(FugitiveGitDir()) |
\ call fugitive#MapJumps() |
\ call fugitive#MapCfile() |
\ endif
autocmd FileType gitcommit autocmd FileType gitcommit
\ call fugitive#MapCfile('fugitive#MessageCfile()') \ if len(FugitiveGitDir()) |
autocmd FileType git,gitcommit \ call fugitive#MapCfile('fugitive#MessageCfile()') |
\ if &foldtext ==# 'foldtext()' |
\ setlocal foldtext=fugitive#Foldtext() |
\ endif \ endif
autocmd FileType fugitive autocmd FileType fugitive
\ call fugitive#MapCfile('fugitive#StatusCfile()') \ if len(FugitiveGitDir()) |
\ call fugitive#MapCfile('fugitive#StatusCfile()') |
\ endif
autocmd FileType gitrebase autocmd FileType gitrebase
\ let &l:include = '^\%(pick\|squash\|edit\|reword\|fixup\|drop\|[pserfd]\)\>' | \ let &l:include = '^\%(pick\|squash\|edit\|reword\|fixup\|drop\|[pserfd]\)\>' |
\ if &l:includeexpr !~# 'Fugitive' | \ if len(FugitiveGitDir()) |
\ let &l:includeexpr = 'v:fname =~# ''^\x\{4,\}$'' && len(FugitiveGitDir()) ? FugitiveFind(v:fname) : ' . \ let &l:includeexpr = 'v:fname =~# ''^\x\{4,\}$'' ? FugitiveFind(v:fname) : ' .
\ (len(&l:includeexpr) ? &l:includeexpr : 'v:fname') | \ (len(&l:includeexpr) ? &l:includeexpr : 'v:fname') |
\ endif | \ endif |
\ let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'exe') . '|setl inex= inc=' \ let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'exe') . '|setl inex= inc='
@@ -469,40 +384,30 @@ let s:addr_other = has('patch-8.1.560') ? '-addr=other' : ''
let s:addr_tabs = has('patch-7.4.542') ? '-addr=tabs' : '' let s:addr_tabs = has('patch-7.4.542') ? '-addr=tabs' : ''
let s:addr_wins = has('patch-7.4.542') ? '-addr=windows' : '' let s:addr_wins = has('patch-7.4.542') ? '-addr=windows' : ''
if exists(':G') != 2 exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#Complete G exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)'
command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#Complete G exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>) exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#Complete Git exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)'
endif
command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#Complete Git exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)
if exists(':Gstatus') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bang -bar -range=-1' s:addr_other 'Gstatus exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bang -bar -range=-1' s:addr_other 'Gstatus exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)'
\ '|echohl WarningMSG|echo ":Gstatus is deprecated in favor of :Git (with no arguments)"|echohl NONE'
endif
for s:cmd in ['Commit', 'Revert', 'Merge', 'Rebase', 'Pull', 'Push', 'Fetch', 'Blame'] exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#CommitComplete Gcommit exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "commit " . <q-args>)'
if exists(':G' . tolower(s:cmd)) != 2 && get(g:, 'fugitive_legacy_commands', 1) exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#RevertComplete Grevert exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "revert " . <q-args>)'
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#' . s:cmd . 'Complete G' . tolower(s:cmd) exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#MergeComplete Gmerge exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "merge " . <q-args>)'
\ 'echohl WarningMSG|echo ":G' . tolower(s:cmd) . ' is deprecated in favor of :Git ' . tolower(s:cmd) . '"|echohl NONE|' exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#RebaseComplete Grebase exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "rebase " . <q-args>)'
\ 'exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "' . tolower(s:cmd) . ' " . <q-args>)' exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#PullComplete Gpull exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "pull " . <q-args>)'
endif exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#PushComplete Gpush exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "push " . <q-args>)'
endfor exe 'command! -bang -nargs=? -range=-1' s:addr_other '-complete=customlist,fugitive#FetchComplete Gfetch exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "fetch " . <q-args>)'
unlet s:cmd exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#BlameComplete Gblame exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "blame " . <q-args>)'
exe "command! -bar -bang -nargs=? -complete=customlist,fugitive#CdComplete Gcd exe fugitive#Cd(<q-args>, 0)" exe "command! -bar -bang -nargs=? -complete=customlist,fugitive#CdComplete Gcd exe fugitive#Cd(<q-args>, 0)"
exe "command! -bar -bang -nargs=? -complete=customlist,fugitive#CdComplete Glcd exe fugitive#Cd(<q-args>, 1)" exe "command! -bar -bang -nargs=? -complete=customlist,fugitive#CdComplete Glcd exe fugitive#Cd(<q-args>, 1)"
exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Ggrep exe fugitive#GrepCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Ggrep exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "grep " . <q-args>)'
exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Gcgrep exe fugitive#GrepCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Gcgrep exe fugitive#Command(<line1>, <count>, +"<range>", <bang>0, "<mods>", "grep " . <q-args>)'
exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Glgrep exe fugitive#GrepCommand(0, <count> > 0 ? <count> : 0, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bang -nargs=? -range=-1' s:addr_wins '-complete=customlist,fugitive#GrepComplete Glgrep exe fugitive#Command(0, <count> > 0 ? <count> : 0, +"<range>", <bang>0, "<mods>", "grep " . <q-args>)'
if exists(':Glog') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Glog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "")' exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Glog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "")'
\ '|echohl WarningMSG|echo ":Glog is deprecated in favor of :Gclog"|echohl NONE'
endif
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Gclog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "c")' exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Gclog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "c")'
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete GcLog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "c")'
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Gllog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "l")' exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete Gllog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "l")'
exe 'command! -bang -nargs=? -range=-1 -complete=customlist,fugitive#LogComplete GlLog :exe fugitive#LogCommand(<line1>,<count>,+"<range>",<bang>0,"<mods>",<q-args>, "l")'
exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Ge exe fugitive#Open("edit<bang>", 0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Ge exe fugitive#Open("edit<bang>", 0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gedit exe fugitive#Open("edit<bang>", 0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gedit exe fugitive#Open("edit<bang>", 0, "<mods>", <q-args>, [<f-args>])'
@@ -524,32 +429,12 @@ exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gw
exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gwrite exe fugitive#WriteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gwrite exe fugitive#WriteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gwq exe fugitive#WqCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=* -complete=customlist,fugitive#EditComplete Gwq exe fugitive#WqCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject GRemove exe fugitive#RemoveCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject GDelete exe fugitive#DeleteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#CompleteObject GMove exe fugitive#MoveCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#RenameComplete GRename exe fugitive#RenameCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
if exists(':Gremove') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject Gremove exe fugitive#RemoveCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject Gremove exe fugitive#RemoveCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
\ '|echohl WarningMSG|echo ":Gremove is deprecated in favor of :GRemove"|echohl NONE'
endif
if exists(':Gdelete') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject Gdelete exe fugitive#DeleteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=0 -complete=customlist,fugitive#CompleteObject Gdelete exe fugitive#DeleteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
\ '|echohl WarningMSG|echo ":Gdelete is deprecated in favor of :GDelete"|echohl NONE'
endif
if exists(':Gmove') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#CompleteObject Gmove exe fugitive#MoveCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#CompleteObject Gmove exe fugitive#MoveCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
\ '|echohl WarningMSG|echo ":Gmove is deprecated in favor of :GMove"|echohl NONE'
endif
if exists(':Grename') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#RenameComplete Grename exe fugitive#RenameCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#RenameComplete Grename exe fugitive#RenameCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
\ '|echohl WarningMSG|echo ":Grename is deprecated in favor of :GRename"|echohl NONE'
endif
exe 'command! -bar -bang -range=-1 -nargs=* -complete=customlist,fugitive#CompleteObject GBrowse exe fugitive#BrowseCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
if exists(':Gbrowse') != 2 && get(g:, 'fugitive_legacy_commands', 1)
exe 'command! -bar -bang -range=-1 -nargs=* -complete=customlist,fugitive#CompleteObject Gbrowse exe fugitive#BrowseCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])' exe 'command! -bar -bang -range=-1 -nargs=* -complete=customlist,fugitive#CompleteObject Gbrowse exe fugitive#BrowseCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>, [<f-args>])'
\ '|if <bang>1|redraw!|endif|echohl WarningMSG|echo ":Gbrowse is deprecated in favor of :GBrowse"|echohl NONE'
endif
if get(g:, 'fugitive_no_maps') if get(g:, 'fugitive_no_maps')
finish finish

View File

@@ -8,9 +8,6 @@ syn spell notoplevel
syn include @fugitiveDiff syntax/diff.vim syn include @fugitiveDiff syntax/diff.vim
syn match fugitiveHeader /^[A-Z][a-z][^:]*:/ nextgroup=fugitiveHash,fugitiveSymbolicRef skipwhite syn match fugitiveHeader /^[A-Z][a-z][^:]*:/ nextgroup=fugitiveHash,fugitiveSymbolicRef skipwhite
syn match fugitiveBareHeader /^Bare:/
syn match fugitiveHelpHeader /^Help:/ nextgroup=fugitiveHelpTag skipwhite
syn match fugitiveHelpTag /\S\+/ contained
syn region fugitiveSection start=/^\%(.*(\d\+)$\)\@=/ contains=fugitiveHeading end=/^$/ syn region fugitiveSection start=/^\%(.*(\d\+)$\)\@=/ contains=fugitiveHeading end=/^$/
syn cluster fugitiveSection contains=fugitiveSection syn cluster fugitiveSection contains=fugitiveSection
@@ -23,8 +20,8 @@ syn match fugitiveDone /^done\>/ contained containedin=@fugitiveSection nextgrou
syn match fugitiveStop /^stop\>/ contained containedin=@fugitiveSection nextgroup=fugitiveHash skipwhite syn match fugitiveStop /^stop\>/ contained containedin=@fugitiveSection nextgroup=fugitiveHash skipwhite
syn match fugitiveModifier /^[MADRCU?]\{1,2} / contained containedin=@fugitiveSection syn match fugitiveModifier /^[MADRCU?]\{1,2} / contained containedin=@fugitiveSection
syn match fugitiveSymbolicRef /\.\@!\%(\.\.\@!\|[^[:space:][:cntrl:]\:.]\)\+\.\@<!/ contained syn match fugitiveSymbolicRef /\.\@!\%(\.\.\@!\|[^[:space:][:cntrl:]\:.]\)\+\.\@<!/ contained
syn match fugitiveHash /^\x\{4,\}\S\@!/ contained containedin=@fugitiveSection syn match fugitiveHash /^\x\{4,\}\>/ contained containedin=@fugitiveSection
syn match fugitiveHash /\S\@<!\x\{4,\}\S\@!/ contained syn match fugitiveHash /\<\x\{4,\}\>/ contained
syn region fugitiveHunk start=/^\%(@@\+ -\)\@=/ end=/^\%([A-Za-z?@]\|$\)\@=/ contains=@fugitiveDiff containedin=@fugitiveSection fold syn region fugitiveHunk start=/^\%(@@\+ -\)\@=/ end=/^\%([A-Za-z?@]\|$\)\@=/ contains=@fugitiveDiff containedin=@fugitiveSection fold
@@ -36,10 +33,7 @@ for s:section in ['Untracked', 'Unstaged', 'Staged']
endfor endfor
unlet s:section unlet s:section
hi def link fugitiveBareHeader fugitiveHeader
hi def link fugitiveHelpHeader fugitiveHeader
hi def link fugitiveHeader Label hi def link fugitiveHeader Label
hi def link fugitiveHelpTag Tag
hi def link fugitiveHeading PreProc hi def link fugitiveHeading PreProc
hi def link fugitiveUntrackedHeading PreCondit hi def link fugitiveUntrackedHeading PreCondit
hi def link fugitiveUnstagedHeading Macro hi def link fugitiveUnstagedHeading Macro