From 97ec188e07e10857d21b8c0512a1e9f1f45b1ca0 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 12 Dec 2020 01:48:38 +0900 Subject: [PATCH] [GF?] Use delta to format git diff if available Close #1202 --- README.md | 2 ++ autoload/fzf/vim.vim | 8 +++++++- doc/fzf-vim.txt | 44 +++++++++++++++++++++++--------------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 555b391..a46505d 100644 --- a/README.md +++ b/README.md @@ -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 - 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] - `Rg` requires [ripgrep (rg)][rg] - `Tags` and `Helptags` require Perl diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index cebb2fe..0c5f53c 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -623,10 +623,16 @@ function! fzf#vim#gitfiles(args, ...) " Here be dragons! " We're trying to access the common sink function that fzf#wrap injects to " 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({ \ 'source': 'git -c color.status=always status --short --untracked-files=all', \ '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) let wrapped.common_sink = remove(wrapped, 'sink*') diff --git a/doc/fzf-vim.txt b/doc/fzf-vim.txt index 80432b6..ab1ec5f 100644 --- a/doc/fzf-vim.txt +++ b/doc/fzf-vim.txt @@ -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* ============================================================================== @@ -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 - For syntax-highlighted preview, install {bat}{5} - - `Ag` requires {The Silver Searcher (ag)}{6} - - `Rg` requires {ripgrep (rg)}{7} + - `:GF?` will use {delta}{6} if available to format `git diff` output + - `Ag` requires {The Silver Searcher (ag)}{7} + - `Rg` requires {ripgrep (rg)}{8} - `Tags` and `Helptags` require Perl {1} https://github.com/junegunn/fzf {5} https://github.com/sharkdp/bat - {6} https://github.com/ggreer/the_silver_searcher - {7} https://github.com/BurntSushi/ripgrep + {6} https://github.com/dandavison/delta + {7} https://github.com/ggreer/the_silver_searcher + {8} https://github.com/BurntSushi/ripgrep COMMANDS *fzf-vim-commands* @@ -117,8 +119,8 @@ COMMANDS *fzf-vim-commands* `:GFiles?` | Git files ( `git status` ) `:Buffers` | Open buffers `:Colors` | Color schemes - `:Ag [PATTERN]` | {ag}{6} 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) + `:Ag [PATTERN]` | {ag}{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 `:BLines [QUERY]` | Lines in the current buffer `:Tags [QUERY]` | Tags in the project ( `ctags -R` ) @@ -129,8 +131,8 @@ COMMANDS *fzf-vim-commands* `:History` | `v:oldfiles` and open buffers `:History:` | Command history `:History/` | Search history - `:Snippets` | Snippets ({UltiSnips}{8}) - `:Commits` | Git commits (requires {fugitive.vim}{9}) + `:Snippets` | Snippets ({UltiSnips}{9}) + `:Commits` | Git commits (requires {fugitive.vim}{10}) `:BCommits` | Git commits for the current buffer `:Commands` | Commands `: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 - e.g. `let g: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()`.) - {6} https://github.com/ggreer/the_silver_searcher - {7} https://github.com/BurntSushi/ripgrep - {8} https://github.com/SirVer/ultisnips - {9} https://github.com/tpope/vim-fugitive - {10} https://github.com/tpope/vim-pathogen + {7} https://github.com/ggreer/the_silver_searcher + {8} https://github.com/BurntSushi/ripgrep + {9} https://github.com/SirVer/ultisnips + {10} https://github.com/tpope/vim-fugitive + {11} https://github.com/tpope/vim-pathogen CUSTOMIZATION *fzf-vim-customization* @@ -268,7 +270,7 @@ Want a preview window? \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, 0) < 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 it. > @@ -289,7 +291,7 @@ You can just omit the spec argument if you only want the previewer. command! -bang -nargs=? -complete=dir Files \ call fzf#vim#files(, fzf#vim#with_preview(), 0) < - {11} bin/preview.sh + {12} bin/preview.sh {5} https://github.com/sharkdp/bat @@ -303,7 +305,7 @@ predefined `Ag` or `Rg` using `fzf#vim#grep`. not print column numbers. - We set the base directory to git root by setting `dir` attribute in spec 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 previewer. > @@ -312,7 +314,7 @@ predefined `Ag` or `Rg` using `fzf#vim#grep`. \ 'git grep --line-number -- '.shellescape(), 0, \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), 0) < - {11} bin/preview.sh + {12} bin/preview.sh Example: Rg command with preview window~ @@ -456,10 +458,10 @@ following exceptions: 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. -{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 >___________________________________________________________~