From 8cb59e6fcac3dce8dfa44b678fdc94cf81efa11b Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 19 Aug 2024 20:51:08 +0900 Subject: [PATCH] [vim] Add 'exit' callback A spec can have `exit` callback that is called with the exit status of fzf. This can be used to clean up temporary resources or restore the original state when fzf is closed without a selection. --- CHANGELOG.md | 2 ++ README-VIM.md | 3 ++- doc/fzf.txt | 3 ++- plugin/fzf.vim | 22 +++++++++------------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ccb85c..24a13b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ CHANGELOG fzf --preview "printf '<< \e]8;;http://github.com/junegunn/fzf\e\\Link to \e[32mfz\e[0mf\e]8;;\e\\ >>'" ``` +- [vim] A spec can have `exit` callback that is called with the exit status of fzf + - This can be used to clean up temporary resources or restore the original state when fzf is closed without a selection - Fixed `--tmux bottom` when the status line is not at the bottom - Fixed extra scroll offset in multi-line mode (`--read0` or `--wrap`) - Added fallback `ps` command for `kill` completion on Cygwin diff --git a/README-VIM.md b/README-VIM.md index e727dd1..3362ea2 100644 --- a/README-VIM.md +++ b/README-VIM.md @@ -289,8 +289,9 @@ The following table summarizes the available options. | `source` | string | External command to generate input to fzf (e.g. `find .`) | | `source` | list | Vim list as input to fzf | | `sink` | string | Vim command to handle the selected item (e.g. `e`, `tabe`) | -| `sink` | funcref | Reference to function to process each selected item | +| `sink` | funcref | Function to be called with each selected item | | `sinklist` (or `sink*`) | funcref | Similar to `sink`, but takes the list of output lines at once | +| `exit` | funcref | Function to be called with the exit status of fzf (e.g. 0, 1, 2, 130) | | `options` | string/list | Options to fzf | | `dir` | string | Working directory | | `up`/`down`/`left`/`right` | number/string | (Layout) Window position and size (e.g. `20`, `50%`) | diff --git a/doc/fzf.txt b/doc/fzf.txt index f946184..c8de4b9 100644 --- a/doc/fzf.txt +++ b/doc/fzf.txt @@ -306,8 +306,9 @@ The following table summarizes the available options. `source` | string | External command to generate input to fzf (e.g. `find .` ) `source` | list | Vim list as input to fzf `sink` | string | Vim command to handle the selected item (e.g. `e` , `tabe` ) - `sink` | funcref | Reference to function to process each selected item + `sink` | funcref | Function to be called with each selected item `sinklist` (or `sink*` ) | funcref | Similar to `sink` , but takes the list of output lines at once + `exit` | funcref | Function to be called with the exit status of fzf (e.g. 0, 1, 2, 130) `options` | string/list | Options to fzf `dir` | string | Working directory `up` / `down` / `left` / `right` | number/string | (Layout) Window position and size (e.g. `20` , `50%` ) diff --git a/plugin/fzf.vim b/plugin/fzf.vim index 0a8d570..2fb27d5 100644 --- a/plugin/fzf.vim +++ b/plugin/fzf.vim @@ -665,21 +665,17 @@ else let s:launcher = function('s:xterm_launcher') endif -function! s:exit_handler(code, command, ...) - if a:code == 130 - return 0 - elseif has('nvim') && a:code == 129 - " When deleting the terminal buffer while fzf is still running, - " Nvim sends SIGHUP. - return 0 - elseif a:code > 1 +function! s:exit_handler(dict, code, command, ...) + if has_key(a:dict, 'exit') + call a:dict.exit(a:code) + endif + if a:code == 2 call s:error('Error running ' . a:command) if !empty(a:000) sleep endif - return 0 endif - return 1 + return a:code endfunction function! s:execute(dict, command, use_height, temps) abort @@ -731,7 +727,7 @@ function! s:execute(dict, command, use_height, temps) abort let exit_status = v:shell_error redraw! let lines = s:collect(a:temps) - return s:exit_handler(exit_status, command) ? lines : [] + return s:exit_handler(a:dict, exit_status, command) == 0 ? lines : [] endfunction function! s:execute_tmux(dict, command, temps) abort @@ -746,7 +742,7 @@ function! s:execute_tmux(dict, command, temps) abort let exit_status = v:shell_error redraw! let lines = s:collect(a:temps) - return s:exit_handler(exit_status, command) ? lines : [] + return s:exit_handler(a:dict, exit_status, command) == 0 ? lines : [] endfunction function! s:calc_size(max, val, dict) @@ -912,7 +908,7 @@ function! s:execute_term(dict, command, temps) abort endif let lines = s:collect(self.temps) - if !s:exit_handler(a:code, self.command, 1) + if s:exit_handler(self.dict, a:code, self.command, 1) != 0 return endif