2016-07-26 4 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을 사용하고, 검색을 위해 vim-ripgrep을 사용하는 것입니다. quickfix 창이 생성됩니다. – jasonjonesutah

답변

2

fzf.vim의 작성자가 pointed out 인 경우 여기에 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>