[GF?] Use delta to format git diff if available

Close #1202
This commit is contained in:
Junegunn Choi
2020-12-12 01:48:38 +09:00
parent 636a62f140
commit 97ec188e07
3 changed files with 32 additions and 22 deletions

View File

@@ -52,6 +52,8 @@ so you can omit it if you use a plugin manager that doesn't support hooks.
- [fzf][fzf-main] 0.23.0 or above - [fzf][fzf-main] 0.23.0 or above
- For syntax-highlighted preview, install [bat](https://github.com/sharkdp/bat) - For syntax-highlighted preview, install [bat](https://github.com/sharkdp/bat)
- `:GF?` will use [delta](https://github.com/dandavison/delta) if available
to format `git diff` output
- `Ag` requires [The Silver Searcher (ag)][ag] - `Ag` requires [The Silver Searcher (ag)][ag]
- `Rg` requires [ripgrep (rg)][rg] - `Rg` requires [ripgrep (rg)][rg]
- `Tags` and `Helptags` require Perl - `Tags` and `Helptags` require Perl

View File

@@ -623,10 +623,16 @@ function! fzf#vim#gitfiles(args, ...)
" Here be dragons! " Here be dragons!
" We're trying to access the common sink function that fzf#wrap injects to " We're trying to access the common sink function that fzf#wrap injects to
" the options dictionary. " the options dictionary.
let preview = printf(
\ 'sh -c "if [[ {1} =~ M ]]; then %s; else %s {-1}; fi"',
\ executable('delta')
\ ? 'git diff -- {-1} | delta --file-style=omit | sed 1d'
\ : 'git diff --color=always -- {-1} | sed 1,4d',
\ s:bin.preview)
let wrapped = fzf#wrap({ let wrapped = fzf#wrap({
\ 'source': 'git -c color.status=always status --short --untracked-files=all', \ 'source': 'git -c color.status=always status --short --untracked-files=all',
\ 'dir': root, \ 'dir': root,
\ 'options': ['--ansi', '--multi', '--nth', '2..,..', '--tiebreak=index', '--prompt', 'GitFiles?> ', '--preview', 'sh -c "(git diff --color=always -- {-1} | sed 1,4d; cat {-1}) | head -1000"'] \ 'options': ['--ansi', '--multi', '--nth', '2..,..', '--tiebreak=index', '--prompt', 'GitFiles?> ', '--preview', preview]
\}) \})
call s:remove_layout(wrapped) call s:remove_layout(wrapped)
let wrapped.common_sink = remove(wrapped, 'sink*') let wrapped.common_sink = remove(wrapped, 'sink*')

View File

@@ -1,4 +1,4 @@
fzf-vim.txt fzf-vim Last change: October 22 2020 fzf-vim.txt fzf-vim Last change: December 12 2020
FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc* FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc*
============================================================================== ==============================================================================
@@ -92,14 +92,16 @@ so you can omit it if you use a plugin manager that doesn't support hooks.
- {fzf}{1} 0.23.0 or above - {fzf}{1} 0.23.0 or above
- For syntax-highlighted preview, install {bat}{5} - For syntax-highlighted preview, install {bat}{5}
- `Ag` requires {The Silver Searcher (ag)}{6} - `:GF?` will use {delta}{6} if available to format `gitdiff` output
- `Rg` requires {ripgrep (rg)}{7} - `Ag` requires {The Silver Searcher (ag)}{7}
- `Rg` requires {ripgrep (rg)}{8}
- `Tags` and `Helptags` require Perl - `Tags` and `Helptags` require Perl
{1} https://github.com/junegunn/fzf {1} https://github.com/junegunn/fzf
{5} https://github.com/sharkdp/bat {5} https://github.com/sharkdp/bat
{6} https://github.com/ggreer/the_silver_searcher {6} https://github.com/dandavison/delta
{7} https://github.com/BurntSushi/ripgrep {7} https://github.com/ggreer/the_silver_searcher
{8} https://github.com/BurntSushi/ripgrep
COMMANDS *fzf-vim-commands* COMMANDS *fzf-vim-commands*
@@ -117,8 +119,8 @@ COMMANDS *fzf-vim-commands*
`:GFiles?` | Git files ( `gitstatus` ) `:GFiles?` | Git files ( `gitstatus` )
`:Buffers` | Open buffers `:Buffers` | Open buffers
`:Colors` | Color schemes `:Colors` | Color schemes
`:Ag[PATTERN]` | {ag}{6} search result ( `ALT-A` to select all, `ALT-D` to deselect all) `:Ag[PATTERN]` | {ag}{7} search result ( `ALT-A` to select all, `ALT-D` to deselect all)
`:Rg[PATTERN]` | {rg}{7} search result ( `ALT-A` to select all, `ALT-D` to deselect all) `:Rg[PATTERN]` | {rg}{8} search result ( `ALT-A` to select all, `ALT-D` to deselect all)
`:Lines[QUERY]` | Lines in loaded buffers `:Lines[QUERY]` | Lines in loaded buffers
`:BLines[QUERY]` | Lines in the current buffer `:BLines[QUERY]` | Lines in the current buffer
`:Tags[QUERY]` | Tags in the project ( `ctags-R` ) `:Tags[QUERY]` | Tags in the project ( `ctags-R` )
@@ -129,8 +131,8 @@ COMMANDS *fzf-vim-commands*
`:History` | `v:oldfiles` and open buffers `:History` | `v:oldfiles` and open buffers
`:History:` | Command history `:History:` | Command history
`:History/` | Search history `:History/` | Search history
`:Snippets` | Snippets ({UltiSnips}{8}) `:Snippets` | Snippets ({UltiSnips}{9})
`:Commits` | Git commits (requires {fugitive.vim}{9}) `:Commits` | Git commits (requires {fugitive.vim}{10})
`:BCommits` | Git commits for the current buffer `:BCommits` | Git commits for the current buffer
`:Commands` | Commands `:Commands` | Commands
`:Maps` | Normal mode mappings `:Maps` | Normal mode mappings
@@ -146,14 +148,14 @@ COMMANDS *fzf-vim-commands*
- You can set `g:fzf_command_prefix` to give the same prefix to the commands - You can set `g:fzf_command_prefix` to give the same prefix to the commands
- e.g. `letg:fzf_command_prefix='Fzf'` and you have `FzfFiles`, etc. - e.g. `letg:fzf_command_prefix='Fzf'` and you have `FzfFiles`, etc.
(1: `Helptags` will shadow the command of the same name from {pathogen}{10}. (1: `Helptags` will shadow the command of the same name from {pathogen}{11}.
But its functionality is still available via `call pathogen#helptags()`.) But its functionality is still available via `call pathogen#helptags()`.)
{6} https://github.com/ggreer/the_silver_searcher {7} https://github.com/ggreer/the_silver_searcher
{7} https://github.com/BurntSushi/ripgrep {8} https://github.com/BurntSushi/ripgrep
{8} https://github.com/SirVer/ultisnips {9} https://github.com/SirVer/ultisnips
{9} https://github.com/tpope/vim-fugitive {10} https://github.com/tpope/vim-fugitive
{10} https://github.com/tpope/vim-pathogen {11} https://github.com/tpope/vim-pathogen
CUSTOMIZATION *fzf-vim-customization* CUSTOMIZATION *fzf-vim-customization*
@@ -268,7 +270,7 @@ Want a preview window?
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, <bang>0) \ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, <bang>0)
< <
It kind of works, but you probably want a nicer previewer program than `cat`. It kind of works, but you probably want a nicer previewer program than `cat`.
fzf.vim ships {a versatile preview script}{11} you can readily use. It fzf.vim ships {a versatile preview script}{12} you can readily use. It
internally executes {bat}{5} for syntax highlighting, so make sure to install internally executes {bat}{5} for syntax highlighting, so make sure to install
it. it.
> >
@@ -289,7 +291,7 @@ You can just omit the spec argument if you only want the previewer.
command! -bang -nargs=? -complete=dir Files command! -bang -nargs=? -complete=dir Files
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0) \ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
< <
{11} bin/preview.sh {12} bin/preview.sh
{5} https://github.com/sharkdp/bat {5} https://github.com/sharkdp/bat
@@ -303,7 +305,7 @@ predefined `Ag` or `Rg` using `fzf#vim#grep`.
not print column numbers. not print column numbers.
- We set the base directory to git root by setting `dir` attribute in spec - We set the base directory to git root by setting `dir` attribute in spec
dictionary. dictionary.
- {The preview script}{11} supports `grep` format (`FILE_PATH:LINE_NO:...`), so - {The preview script}{12} supports `grep` format (`FILE_PATH:LINE_NO:...`), so
we can just wrap the spec with `fzf#vim#with_preview` as before to enable we can just wrap the spec with `fzf#vim#with_preview` as before to enable
previewer. previewer.
> >
@@ -312,7 +314,7 @@ predefined `Ag` or `Rg` using `fzf#vim#grep`.
\ 'git grep --line-number -- '.shellescape(<q-args>), 0, \ 'git grep --line-number -- '.shellescape(<q-args>), 0,
\ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0) \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
< <
{11} bin/preview.sh {12} bin/preview.sh
Example: Rg command with preview window~ Example: Rg command with preview window~
@@ -456,10 +458,10 @@ following exceptions:
STATUS LINE OF TERMINAL BUFFER *fzf-vim-status-line-of-terminal-buffer* STATUS LINE OF TERMINAL BUFFER *fzf-vim-status-line-of-terminal-buffer*
============================================================================== ==============================================================================
When fzf starts in a terminal buffer (see {fzf/README-VIM.md}{12}), you may When fzf starts in a terminal buffer (see {fzf/README-VIM.md}{13}), you may
want to customize the statusline of the containing buffer. want to customize the statusline of the containing buffer.
{12} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer {13} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer
< Hide statusline >___________________________________________________________~ < Hide statusline >___________________________________________________________~