diff --git a/README.md b/README.md
index c441163..7274e55 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,7 @@ Commands
| `History:` | Command history |
| `History/` | Search history |
| `Snippets` | Snippets ([UltiSnips][us]) |
+| `Commits` | Git commits (requires [fugitive.vim][f] |
| `Commands` | Commands |
| `Helptags` | Help tags [1](#helptags) |
@@ -73,6 +74,7 @@ from [pathogen][pat]. But its functionality is still available via `call
pathogen#helptags()`. [↩](#a1))
[pat]: https://github.com/tpope/vim-pathogen
+[f]: https://github.com/tpope/vim-fugitive
### Customization
diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim
index 2275458..7aa6b4b 100644
--- a/autoload/fzf/vim.vim
+++ b/autoload/fzf/vim.vim
@@ -31,6 +31,10 @@ function! s:strip(str)
return substitute(a:str, '^\s*\|\s*$', '', 'g')
endfunction
+function! s:chomp(str)
+ return substitute(a:str, '\n*$', '', 'g')
+endfunction
+
function! s:escape(path)
return escape(a:path, ' %#''"\')
endfunction
@@ -610,6 +614,57 @@ function! fzf#vim#windows(...)
\ 'options': '+m --ansi --tiebreak=begin --header-lines=1'}, a:000)
endfunction
+" ------------------------------------------------------------------
+" Commits
+" ------------------------------------------------------------------
+function! s:commits_sink(lines)
+ if len(a:lines) < 2
+ return
+ endif
+
+ let cmd = get(extend({'ctrl-d': ''}, get(g:, 'fzf_action', s:default_action)), a:lines[0], 'e')
+ let buf = bufnr('')
+ for idx in range(1, len(a:lines) - 1)
+ let sha = matchstr(a:lines[idx], '[0-9a-f]\{7}')
+ if !empty(sha)
+ if empty(cmd)
+ if idx > 1
+ execute 'tab sb' buf
+ endif
+ execute 'Gdiff' sha
+ else
+ " Since fugitive buffers are unlisted, we can't keep using 'e'
+ let c = (cmd == 'e' && idx > 1) ? 'tab split' : cmd
+ execute c 'fugitive://'.s:git_root.'/.git//'.sha
+ endif
+ endif
+ endfor
+endfunction
+
+function! fzf#vim#commits(...)
+ let s:git_root = s:chomp(system('git rev-parse --show-toplevel'))
+ if v:shell_error
+ call s:warn('Not in git repository')
+ return
+ endif
+
+ let options = {
+ \ 'source': 'git log --graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"',
+ \ 'sink*': function('s:commits_sink'),
+ \ 'options': '--ansi --multi --no-sort --reverse --inline-info --prompt "Commits> "'.s:expect()
+ \ }
+
+ let current = expand('%:S')
+ if !empty(current)
+ call system('git show '.current)
+ if !v:shell_error
+ let options.options .= ',ctrl-d --header ":: Press CTRL-D to diff"'
+ endif
+ endif
+
+ call s:fzf(options, a:000)
+endfunction
+
" ----------------------------------------------------------------------------
" fzf#vim#complete - completion helper
" ----------------------------------------------------------------------------
diff --git a/doc/fzf-vim.txt b/doc/fzf-vim.txt
index 2a27663..a4c4492 100644
--- a/doc/fzf-vim.txt
+++ b/doc/fzf-vim.txt
@@ -1,9 +1,10 @@
-fzf-vim.txt fzf-vim Last change: September 1 2015
+fzf-vim.txt fzf-vim Last change: September 20 2015
FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc*
==============================================================================
fzf :heart: vim
Rationale
+ Why you should use fzf on Vim
Installation
Commands
Customization
@@ -16,7 +17,7 @@ FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-to
FZF :HEART: VIM *fzf-vim-fzf-heart-vim*
==============================================================================
-A set of {fzf}{1}-based Vim commands and mappings.
+Things you can do with {fzf}{1} and Vim.
{1} https://github.com/junegunn/fzf
@@ -32,14 +33,29 @@ implementation of the features they can find in the alternative Vim plugins.
This repository is a bundle of fzf-based commands and mappings extracted from
my {.vimrc}{3} to address such needs. They are not designed to be flexible or
-configurable, nor are not guaranteed to be backward-compatible at the moment,
-so you might want to treat this repository as a reference.
+configurable, and there's no guarantee of backward-compatibility.
{1} https://github.com/junegunn/fzf
{2} https://github.com/junegunn/fzf#usage-as-vim-plugin
{3} https://github.com/junegunn/dotfiles/blob/master/vimrc
+WHY YOU SHOULD USE FZF ON VIM *fzf-vim-why-you-should-use-fzf-on-vim*
+==============================================================================
+
+Because you can and you love fzf.
+
+fzf runs asynchronously and can be orders of magnitude faster than similar Vim
+plugins. However, the benefit may not be noticeable if the size of the input
+is small, which is the case for many of the commands provided here.
+Nevertheless I wrote them anyway since it's really easy to implement custom
+selector with fzf.
+
+fzf is an independent command-line program and thus requires an external
+terminal emulator when on GVim. You may or may not like the experience. Also
+note that fzf currently does not compile on Windows.
+
+
INSTALLATION *fzf-vim-installation*
==============================================================================
@@ -54,6 +70,7 @@ Using {vim-plug}{4}:
COMMANDS *fzf-vim-commands*
==============================================================================
+
-----------------+---------------------------------------------------------------------
Command | List ~
-----------------+---------------------------------------------------------------------
@@ -72,16 +89,22 @@ COMMANDS *fzf-vim-commands*
`History:` | Command history
`History/` | Search history
`Snippets` | Snippets ({UltiSnips}{6})
+ `Commits` | Git commits (requires {fugitive.vim}{7}
`Commands` | Commands
- `Helptags` | Help tags
+ `Helptags` | Help tags [1]
-----------------+---------------------------------------------------------------------
- Most commands support CTRL-T / CTRL-X / CTRL-V key bindings to open in a new
tab, a new split, or in a new vertical split.
- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen
+(1: `Helptags` will shadow the command of the same name from {pathogen}{8}.
+But its functionality is still available via `call pathogen#helptags()`.)
+
{5} https://github.com/ggreer/the_silver_searcher
{6} https://github.com/SirVer/ultisnips
+ {7} https://github.com/tpope/vim-fugitive
+ {8} https://github.com/tpope/vim-pathogen
< Customization >_____________________________________________________________~
@@ -145,8 +168,9 @@ following exceptions:
- `reducer` (funcref)
- Reducer transforms the output lines of fzf into a single string value
- - `prefix` (string; default: `\k*$`)
+ - `prefix` (string or funcref; default: `\k*$`)
- Regular expression pattern to extract the completion prefix
+ - Or a function to extract completion prefix
- Both `source` and `options` can be given as funcrefs that take the completion
prefix as the argument and return the final value
- `sink` or `sink*` are not allowed
diff --git a/plugin/fzf.vim b/plugin/fzf.vim
index da1aead..c9ecece 100644
--- a/plugin/fzf.vim
+++ b/plugin/fzf.vim
@@ -44,6 +44,7 @@ command! -bang Commands call fzf#vim#commands(s:w(0))
command! -bang Marks call fzf#vim#marks(s:w(0))
command! -bang Helptags call fzf#vim#helptags(s:w(0))
command! -bang Windows call fzf#vim#windows(s:w(0))
+command! -bang Commits call fzf#vim#commits(s:w(0))
function! s:history(arg, bang)
let bang = a:bang || a:arg[len(a:arg)-1] == '!'