2016-07-26 120 views
1

我试图用fzf在vimscript中创建一个目录搜索和替换函数。当我尝试使用Alt-a fzf绑定来选择整个列表时,我阻止的地方是。我甚至不确定这是否可能,因为fzf是一个外部过程,但我可能是错的。如何创建一个目录搜索并用vimscript和fzf替换

这是我目前的功能。

function! CWDSearchAndReplace() 

    " Try to get word under cursor else prompt user for a word 
    let wordToReplace = expand("<cword>") 
    if wordToReplace == "" 
     call inputsave() 
     let wordToReplace = input("Replace: ") 
     call inputrestore() 
    endif 

    " Prompt for replacement 
    call inputsave() 
    let replacement = input("Replace \"" . wordToReplace . "\" with: ") 
    call inputrestore() 
    execute "Ag " . wordToReplace 

    " =====> Here I'd like to execute Alt-a followed by <CR> 

    execute "cdo %s//" . replacement . "/gc" 
end function 

感谢您的帮助!

+0

你从哪里得到那个'Alt-a'?你在说[fzf](https://github.com/junegunn/fzf)还是[fzf.vim](https://github.com/junegunn/fzf.vim)?为什么你的函数中有这么多的第三方工具? – romainl

+0

fzf.vim。 Ag是fzf.vim的一部分,cdo现在是vim的一部分。 Alt-A来自fzf.vim文档,并且由于使用fzf而被硬编码 –

+0

跨文件搜索和替换的便捷方法是使用vim-ripgrep进行搜索,并使用quickfix-reflector将所有编辑保存在产生quickfix窗口。 – jasonjonesutah

回答

2

作为pointed outfzf.vim的创建者,这里没有必要使用fzf,可以简单地使用ag

function! s:ag_to_qf(line) 
    let parts = split(a:line, ':') 
    echo parts 
    return {'filename': parts[0], 'lnum': parts[1], 'col': parts[2], 
     \ 'text': join(parts[3:], ':')} 
endfunction 

function! AgToQF(query) 
    call setqflist(map(systemlist('ag --column '.a:query), 's:ag_to_qf(v:val)')) 
endfunction 

function! CWDSearchAndReplace() 
    let wordUnderCursor = expand("<cword>") 
    call inputsave() 
    let wordToReplace = input("Replace : ", wordUnderCursor) 
    call inputrestore() 
    call inputsave() 
    let replacement = input("Replace \"" . wordUnderCursor . "\" with: ") 
    call inputrestore() 
    call AgToQF(wordUnderCursor) 
    execute "cdo %s/" . wordToReplace . "/" . replacement ."/gc" 
endfunction 

nnoremap <leader>r :call FileSearchAndReplace()<CR>