Omar Sandoval 3936a74584 Reset scrollbind/cursorbind after reblaming
The following sequence of commands leaves the buffer with scrollbind and
cursorbind set:

  :Gblame
  Reblame with one of -, ~, or P
  Quit with gq

What's happening here is:

1. In BlameSubcommand, we set scrollbind and cursorbind on the buffer.
   We also set w:fugitive_leave on the blame buffer to reset scrollbind
   and cursorbind when the blame buffer is closed.
2. In BlameJump, we execute Gedit, which changes the window to a new
   buffer. Then, we delete the blame buffer, at which point we try to
   reset scrollbind and cursorbind. However, the original buffer isn't
   on a window anymore, so this doesn't do anything.
3. In BlameQuit, we go back to the original buffer. Note this snippet
   from `:help local-options`: "if this buffer has been edited in this
   window, the [option] values from back then are used". When the
   original buffer was last used, scrollbind and cursorbind were still
   set. Therefore, the buffer ends up with scrollbind and cursorbind
   set after leaving Gblame.

The fix is to delete the blame buffer _before_ changing to the new
buffer in BlameJump. This ensures that we restore the options while the
original buffer is still around (which is how BlameQuit does it, too).
2019-11-17 21:08:23 -05:00
2019-11-08 17:41:09 -05:00
2019-09-05 15:36:56 -04:00
2018-06-14 15:37:24 -04:00
2018-04-22 19:01:53 -04:00
2018-03-14 17:11:34 -04:00

fugitive.vim

I'm not going to lie to you; fugitive.vim may very well be the best Git wrapper of all time. Check out these features:

Bring up an enhanced version of git status with :G (also known as :Gstatus). Press g? to bring up a list of maps for numerous operations including diffing, staging, committing, rebasing, and stashing.

View any blob, tree, commit, or tag in the repository with :Gedit (and :Gsplit, :Gvsplit, :Gtabedit, ...). Edit a file in the index and write to it to stage the changes. Use :Gdiffsplit to bring up the staged version of the file side by side with the working tree version and use Vim's diff handling capabilities to stage a subset of the file's changes.

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.

:Gblame brings up an interactive vertical split with git blame output. Press enter on a line to edit the commit where the line changed, or o to open it in a split. When you're done, use :Gedit in the historic buffer to go back to the work tree version.

:Gmove does a git mv on a file and simultaneously renames the buffer. :Gdelete does a git rm on a file and simultaneously deletes the buffer.

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. :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.

Use :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, GitLab, Bitbucket, Gitee, and Pagure.

Add %{FugitiveStatusline()} to 'statusline' to get an indicator 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.

Screencasts

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

Why can't I enter my password when I :Gpush?

It is highly recommended to use SSH keys or credentials caching to avoid entering your password on every upstream interaction. If this isn't an option, the official solution is to use the core.askPass Git option to 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.

As an absolute last resort, you can invoke :Git --paginate push. Fugitive recognizes the pagination request and fires up a :terminal, which allows for interactive password entry.

Self-Promotion

Like fugitive.vim? Follow the repository on GitHub and vote for it on vim.org. And if you're feeling especially charitable, follow tpope on Twitter and GitHub.

License

Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. See :help license.

Description
fugitive.vim: A Git wrapper so awesome, it should be illegal
Readme 14 MiB
Languages
Vim Script 100%