Como posso fazer com que o ctrlp faça uma melhor correspondência de nome de arquivo?

10

Meu projeto possui estes arquivos:

$ find . -type f -and -name 'peop*'
./app/assets/stylesheets/admin/sections/people.css.sass
./app/controllers/admin/people_controller.rb

Quando me cansei de digitar :e app/assets/stylesheets/admin/sections/people.css.sass, pensei que ctrlp poderia ser uma boa maneira de economizar digitação. No entanto, não consigo que ele corresponda aos arquivos do que considero uma maneira sã.

Primeiro, uso <C-p>e digito peop, e isso me dá esses resultados (a "primeira" correspondência fica na parte inferior):

> app/models/attribute_group.rb
> app/models/contract_template.rb
> app/policies/contract_policy.rb
> app/uploaders/photo_uploader.rb
> app/policies/invoice_policy.rb
> app/views/layouts/pdf.pdf.haml
> app/uploaders/logo_uploader.rb
> app/models/property_object.rb
> app/policies/person_policy.rb
> app/policies/photo_policy.rb    
>>> peop_

Esses resultados são horríveis. Nem arquivos com peopeles estão lá. Mesmo quando eu expandi-lo para people:

> app/policies/contract_template_policy.rb
> app/models/concerns/exportable.rb
> app/models/contract_template.rb
> app/uploaders/photo_uploader.rb
> app/uploaders/logo_uploader.rb
> app/views/admin/people/_show.html.haml
> app/views/admin/people/_form.html.haml
> app/views/admin/people/show.html.haml
> app/views/admin/people/edit.html.haml
> app/views/admin/people/new.html.haml 
>>> people_

Não lista nenhum deles (!)

Passei :help ctrlp-optionse encontrei uma única opção que melhora as coisas um pouco:

Set this to 1 to set searching by filename (as opposed to full path) as the
default:
  let g:ctrlp_by_filename = 0

Can be toggled on/off by pressing <c-d> inside the prompt.

Depois de definir isso, obtenho os seguintes resultados em peop:

> app/controllers/admin/organisation_people_controller.rb
> app/assets/stylesheets/admin/sections/people.css.sass
> doc/formulieren/opdrachtverlening-woningbeheer.pdf
> doc/formulieren/hulptabellen-object-unit-soort.pdf
> doc/formulieren/brandpreventievoorjongeren.pdf
> app/policies/organisation_person_policy.rb
> doc/prototype-admin/prototype/inspectiemodule_apparaten.html
> app/policies/property_object_policy.rb
> app/policies/person_policy.rb
> app/controllers/admin/people_controller.rb
>d> peop_

Ok, então isso é um pouco melhor, recebo pelo menos um dos arquivos esperados no primeiro resultado e o outro no 9º. Ainda é considerado hulptabellen-object-unit-soort.pdfum par melhor do que no people.css.sassentanto (!)

A digitação peoplefinalmente me fornece os 2 arquivos esperados como os 2 primeiros:

> app/controllers/admin/organisation_people_controller.rb
> app/assets/stylesheets/admin/sections/people.css.sass
> app/controllers/admin/people_controller.rb
>>> people_

Como posso melhorar essa correspondência? Não me importo de "correspondência difusa", mas não deve ser tão difusa que corresponde a tudo e a todos ... Nesse caso, eu esperaria que a digitação <c-P>peoptivesse app/assets/stylesheets/admin/sections/people.css.sasscomo a 1ª ou a 2ª correspondência.

Martin Tournoij
fonte
2
Parece que ctrlp pode aceitar uma função de correspondência personalizada. Está na documentação em 'g:ctrlp_match_func Um bom exemplo disso em uso é este plugin: vim.org/scripts/script.php?script_id=4884
EvergreenTree

Respostas:

7

Uma pergunta semelhante foi feita no reddit do Vim aqui . Comecei a usar o ctrlp-cmatcher há algum tempo, o que eu acho muito mais inteligente em combinar o arquivo certo. Observe que ele requer um componente compilado. Caso contrário, você terá que tentar algumas das abordagens no artigo .

Collin Peters
fonte
4

CtrlP tem alguns modos diferentes, Ctrl-Re Ctrl-D. Ctrl-Rusa sua entrada como Regex bruto, o que significa que você encontrará apenas correspondências peopleexplicitamente. Ctrl-Dcorresponde apenas ao nome do arquivo, ignorando o caminho.

Eu acredito que a funcionalidade CtrlP padrão está apenas se unindo .*a todos os caracteres como um caractere bruto, então um período é tratado como um período. Se você soubesse com antecedência que o arquivo tinha pelo menos 2 diretórios, poderia fazê-lo //people.

TankorSmash
fonte