Fuzzy encontrar dentro de arquivo no Vim

21

Adoro usar o plug-in Command-T no Vim para fazer pesquisas difusas de nomes de arquivos. Eu gosto tanto que comecei a querer fazer as mesmas pesquisas difusas por seqüências arbitrárias em um buffer aberto.

Por exemplo, se estou editando um arquivo CSS que contém um seletor como #support-main .question .answer-rating, atualmente posso digitar /support-main .questionpara encontrar essa linha.

Eu gostaria de poder chamar um localizador nebuloso e simplesmente digitar algo como supmaiqueencontrar a mesma linha (entre outros). Eu sei que posso digitar /sup.*mai.*quepara o mesmo efeito, mas digitar the .*interrompe minha concentração.

Existe uma maneira de fazer isso?

adamesque
fonte

Respostas:

23

Há uma extensão "line" no plug-in Ctrl-P mais recente para vim ( ctrlp ), que pode fazer pesquisas de linhas difusas. Você precisa habilitar a extensão manualmente. Aqui está minha configuração em .vimrc:

let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlPLastMode'
let g:ctrlp_extensions = ['buffertag', 'tag', 'line', 'dir']

Depois disso, pressione Ctrl-ppara exibir o menu e pressione Ctrl-fvárias vezes até que o modo de linha esteja ativado. Digite sua string difusa agora:

insira a descrição da imagem aqui

ATUALIZAÇÃO 27 de fevereiro de 2014

Uma solução alternativa que atualmente estou usando seria usar unir . Para fazer a pesquisa de linhas difusas, você precisa ajustar um pouco a união:

call unite#filters#matcher_default#use(['matcher_fuzzy'])
call unite#filters#sorter_default#use(['sorter_rank'])
call unite#custom#source('file,file/new,buffer,file_rec,line', 'matchers', 'matcher_fuzzy')
nnoremap <C-k> :<C-u>Unite -buffer-name=search -start-insert line<cr>

Agora pressione Ctrl-ke digite:

insira a descrição da imagem aqui

A propósito, o unite também pode fazer pesquisa de arquivos confusos por nome.

ATUALIZAÇÃO 3 de agosto de 2016

Outra maneira de fazer a pesquisa de linha é usar o fzf junto com o plugin vim que o acompanha . Consulte as instruções de instalação aqui: https://github.com/junegunn/fzf.vim#installation

Depois de instalar o fzf e o fzf.vim, você pode usar :BLinespara pesquisar linhas no buffer atual:

Saída de amostra

Você deve ter notado que não é exatamente uma pesquisa difusa, o que significa que eu preciso usar espaços. Isso pode não funcionar com você.

baltazar
fonte
Adicionado unite como uma solução alternativa.
Baltazar
Adicionado fzf como uma solução alternativa.
baltazar
1

Não é exatamente o que você deseja, mas set incsearchseu padrão é correspondido à medida que você digita. Não é uma correspondência realmente confusa, mas o sentimento é semelhante.

romainl
fonte
Ah sim. incsearché ótimo, mas não é o que estou procurando.
adamesque