From 2069bbc8b54fa77384e42274ee15af7b397af884 Mon Sep 17 00:00:00 2001
From: Junegunn Choi <junegunn.c@gmail.com>
Date: Mon, 14 Aug 2017 16:22:07 +0900
Subject: [PATCH] [vim] Allow Funcref in g:fzf_action

https://github.com/junegunn/fzf.vim/issues/185
---
 README-VIM.md  | 13 +++++++++++++
 doc/fzf.txt    | 15 ++++++++++++++-
 plugin/fzf.vim |  7 +++++--
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/README-VIM.md b/README-VIM.md
index 804400d4..956a46b0 100644
--- a/README-VIM.md
+++ b/README-VIM.md
@@ -55,6 +55,19 @@ let g:fzf_action = {
   \ 'ctrl-x': 'split',
   \ 'ctrl-v': 'vsplit' }
 
+" An action can be a reference to a function that processes selected lines
+function! s:build_quickfix_list(lines)
+  call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
+  copen
+  cc
+endfunction
+
+let g:fzf_action = {
+  \ 'ctrl-q': function('s:build_quickfix_list'),
+  \ 'ctrl-t': 'tab split',
+  \ 'ctrl-x': 'split',
+  \ 'ctrl-v': 'vsplit' }
+
 " Default fzf layout
 " - down / up / left / right
 let g:fzf_layout = { 'down': '~40%' }
diff --git a/doc/fzf.txt b/doc/fzf.txt
index 52080ef6..a5239030 100644
--- a/doc/fzf.txt
+++ b/doc/fzf.txt
@@ -1,4 +1,4 @@
-fzf.txt	fzf	Last change: April 28 2017
+fzf.txt	fzf	Last change: August 14 2017
 FZF - TABLE OF CONTENTS                                            *fzf* *fzf-toc*
 ==============================================================================
 
@@ -80,6 +80,19 @@ Examples~
       \ 'ctrl-x': 'split',
       \ 'ctrl-v': 'vsplit' }
 
+    " An action can be a reference to a function that processes selected lines
+    function! s:build_quickfix_list(lines)
+      call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
+      copen
+      cc
+    endfunction
+
+    let g:fzf_action = {
+      \ 'ctrl-q': function('s:build_quickfix_list'),
+      \ 'ctrl-t': 'tab split',
+      \ 'ctrl-x': 'split',
+      \ 'ctrl-v': 'vsplit' }
+
     " Default fzf layout
     " - down / up / left / right
     let g:fzf_layout = { 'down': '~40%' }
diff --git a/plugin/fzf.vim b/plugin/fzf.vim
index f8955374..9ce03c03 100644
--- a/plugin/fzf.vim
+++ b/plugin/fzf.vim
@@ -201,7 +201,10 @@ function! s:common_sink(action, lines) abort
     return
   endif
   let key = remove(a:lines, 0)
-  let cmd = get(a:action, key, 'e')
+  let Cmd = get(a:action, key, 'e')
+  if type(Cmd) == type(function('call'))
+    return Cmd(a:lines)
+  endif
   if len(a:lines) > 1
     augroup fzf_swap
       autocmd SwapExists * let v:swapchoice='o'
@@ -217,7 +220,7 @@ function! s:common_sink(action, lines) abort
         execute 'e' s:escape(item)
         let empty = 0
       else
-        call s:open(cmd, item)
+        call s:open(Cmd, item)
       endif
       if !has('patch-8.0.0177') && !has('nvim-0.2') && exists('#BufEnter')
             \ && isdirectory(item)
-- 
GitLab