2016-07-26 5 views
1

Я пытаюсь создать функцию поиска и замены каталога в vimscript с помощью fzf. Место, где я блокируюсь, - это попытка использовать привязку fzf Alt-a для выбора всего списка. Я даже не уверен, что это возможно, если 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 docs и жестко закодирован из-за использования fzf. –

+0

. Удобный и быстрый способ поиска и замены файлов - использовать vim-ripgrep для поиска и quickfix-отражатель для сохранения любых изменений в в результате быстрого окна. – jasonjonesutah

ответ

2

pointed out от создателя fzf.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>