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] == '!'