summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-08-19 20:51:08 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-08-19 20:51:26 +0900
commit8cb59e6fcac3dce8dfa44b678fdc94cf81efa11b (patch)
tree187f1d5671c039229bd77701c4445256e0d830a6
parent5cce17e80a326680b503a51aadcf570cc089ea5c (diff)
downloadfzf-8cb59e6fcac3dce8dfa44b678fdc94cf81efa11b.tar.gz
[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.
-rw-r--r--CHANGELOG.md2
-rw-r--r--README-VIM.md3
-rw-r--r--doc/fzf.txt3
-rw-r--r--plugin/fzf.vim22
4 files changed, 15 insertions, 15 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ccb85c8..24a13b4d 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 e727dd1e..3362ea26 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 f946184f..c8de4b92 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 0a8d570f..2fb27d5f 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