Como posso obter a conclusão de código difuso

27

Ao usar o ReSharper no Visual Studio, os símbolos podem ser preenchidos automaticamente usando a correspondência difusa em vez da correspondência de prefixo. Por exemplo, se eu estou procurando uma função chamada DoSomethingAmazingEu poderia escrever DoSoAme seria tentar expandir minha consulta para coincidir com todos os símbolos que contêm Do, Soe Amem algum lugar em seu nome.

Outro exemplo pode ser encontrado no gif abaixo. Você pode ver várias expansões nas quais cadeias sem prefixo são expandidas para o símbolo correto. (Ignore a expansão do snippet, pois nesta pergunta só estou preocupado com a correspondência difusa).Um gif mostrando vários exemplos de correspondência difusa em ação

Outro exemplo pode ser visto no plugin YouCompleteMe for Vim: Um gif mostrando mais exemplos de correspondência difusa em ação no vim

O preenchimento automático e o modo empresa parecem ter correspondência de prefixo, mas não consigo encontrar uma maneira de ativar a correspondência difusa.

Idealmente, a solução seria independente de idioma e se aplicaria a qualquer pacote de conclusão de símbolo que eu estou usando, mas também estou interessado em soluções específicas de idioma. Eu olhei para Helm, mas não encontrei uma maneira de aplicá-lo à conclusão de código.

Eu considerei alternativas como ter uma combinação de teclas para ativar a conclusão do símbolo usando um buffer Helm, mas espero que haja uma maneira de fazer isso usando a conclusão no estilo pop-up.

Também estou aberto a fazer a configuração manual por idioma, pois alguns idiomas separam símbolos com hífens, enquanto outros usam sublinhados ou hífens, que eu suponho que afetariam como a correspondência seria feita.

Jake Woods
fonte

Respostas:

19

A funcionalidade de conclusão interna do Emacs oferece correspondência difusa semelhante (embora por padrão seja usada para "faça-o-sou" e não para "DoSoAm") e as versões recentes do IIUC do modo empresa usam isso pelo menos em alguns casos.

Por exemplo, se você abrir um buffer Elisp usando o Emacs-24.4 e o modo mais recente da empresa, se você digitar (wi-sycompany, será exibido um menu de conclusão mostrando window-system, window-system-for-displaye with-syntax-table.

Stefan
fonte
2
Com os company-modesuportes Emacs 24.4 completion-styles, este post sugere uma configuração possível para experimentá-lo.
Wasamasa
Depois de instalar o 24.4, descobri que era exatamente isso que eu estava procurando. Infelizmente, parece ser específico do idioma e exigirá alterações nos back-end da empresa para que funcione em outros idiomas. No entanto, fora das respostas, é a mais próxima que encontrei e, esperançosamente, com mais tempo, ela se aplicará a mais idiomas. Obrigado!
Jake Woods,
company-ycmdé outro back-end que suporta a conclusão difusa.
Dmitry
9

Com company-mode, você pode usar C-spara pesquisar os candidatos disponíveis que são exibidos. A consulta de pesquisa é exibida na modelagem (não é realmente fácil de identificar, eu sei. Arquivei um problema aqui ).

Se você deseja usar o Helm para conclusão, considere usar helm-company ou ac-helm . Ainda não tentei com ac-helm, mas com helm-company, você pode vinculá-lo diretamente a uma chave para substituir a interface padrão do company-complete.

Tu Do
fonte
Isso foi próximo ao que eu estava procurando. Eu esperava concluir sem precisar pressionar uma tecla, mas descobri que usá-la em combinação com a correspondência de prefixos apresenta uma alternativa adequada. Obrigado!
Jake Woods
Se você usa a company-modeinterface do usuário, pode pressionar C-spara procurar um candidato em uma lista de candidatos disponíveis companyapresentada a você.
Tu Do
Sim, eu entendo isso e, como eu disse no comentário acima, é quase o que eu estava procurando. A solução ideal (para mim) não exigiria Cs e procuraria os candidatos embutidos na janela pop-up enquanto eu digitava. Mas a abordagem Cs é certamente interessante e pretendo integrá-la ao meu fluxo de trabalho.
Jake Woods,
Ao usar a empresa, acho que C-M-sé muito melhor do que isso C-s. Com o meta, ele filtra os candidatos em vez de apenas pesquisar.
Nanny23
@ nanny ótimo saber disso.
Tu Do
5

Como mencionado em um comentário anterior, ycmdsuporta correspondência difusa. Você pode usá-lo via company-ycmd. Configurado corretamente, você pode obter a conclusão específica do idioma, bem como a conclusão simples baseada em identificador, em uma experiência bastante integrada.

Abingham
fonte
seria bom mostrar o que "corretamente" significa aqui.
Jason Hu
2

Existem vários pacotes que oferecem conclusão nebulosa de um tipo ou de outro. Eu imagino que Helm sim, por exemplo (desde que você mencionou).

Se você usar os Sincelos da biblioteca , poderá escolher (em tempo real) entre vários métodos de conclusão nebulosa - mais opções do que eu já vi oferecidas em outros lugares. (Eu não sou particularmente fã de conclusão confusa, mas ofereço.)

A conclusão dos sincelos (portanto, a conclusão nebulosa, se você escolher isso) se aplica praticamente a todos os lugares, mas não há muitos recursos de conclusão de códigos específicos de sincelos . Esta página do documento Icicles fala sobre essa conclusão do texto do buffer.


Com Icicles , usando o exemplo de Stefan de conclusão (wi-syno modo Emacs Lisp:

  1. Com a conclusão dos Sincelos (o que o Emacs fornece, respeitando ), você obtém os mesmos símbolos que Stefan menciona.vanillacompletion-styles

  2. Com a conclusão do símbolo difuso Icicles Swank (da biblioteca el-swank-fuzzy.el) como o método atual de conclusão da TAB, você obtém os seguintes candidatos:

    sistema de janelas                
    tabela com sintaxe
    sistema de janelas para exibição
    ação do sistema de codificação de widget
    widget-símbolo-prompt-interno
    widget-coding-system-prompt-value
    with-swfy-struct
    widget-especificar-doc
    com-swfy-timedout
    widget-especificar-campo
    widget-especificar-ativo
    botão de especificação de widget
    widget-especificar-inserir
    widget-especificar-amostra
    widget-especificar-segredo
    widget-especificar-inativo
    janela-com segurança-encolhível-p
    widget-types-copy
    redimensionar janela aplicar
    window - redimensionar-raiz-janela-verticalmente
    janela-display-table
    janela - buffer de exibição
    janela - redimensionar-aplicar-p
    redimensionar-janela-aplicar-total
    Conclusões widgetp-display-Completions
    window-redisplay-end-trigger
    com janela de buffer exibida
    widget-visibilidade-valor-criar
    widget-emacs-library-link-action
    widget-editável-lista-entrada-criar
    widget-emacs-commentary-link-action

Os três primeiros candidatos são, novamente, aqueles que Stefan menciona.

  1. Com a conclusão simples de correspondência difusa (biblioteca fuzzy-match.el), o único candidato é with-syntax-table.

  2. Com a conclusão difusa do Icicles scatter , você obtém todos os candidatos que a conclusão difusa do Swank oferece, além do seguinte:

    ange-ftp-espera-não-ocupado
    dired-into-dir-with-symlinks
    ediff-escolha-janela-configuração-função-automaticamente
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-janela-exibição-p
    ediff-window-ok-for-display
    ediff-com-tabela-de-sintaxe
    sistema-de-codificação-de-arquivo-novo-buffer
    gnus-frame-or-window-display-name
    help-window-display-message
    icicle-escolha-janela-para-buffer-display
    reverter-buffer-com-codificação-sistema
    set-w32-system-coding-system
    conjunto-janela-display-tabela
    set-window-redisplay-end-trigger
    shell-write-history-on-exit
    janela dividida com sensibilidade
    tree-widget - localize o subdiretório
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-initialize-window-system
  1. Com os sincelos Levenshtein (1) conclusão de substrato nebuloso (distância de Levenshtein de 1), você obtém apenas estas conclusões:
    help-follow-symbol
    mensagem-verificar-notícias-sintaxe
    w32-initialize-window-system sistema de janelas
    sistema de janelas para exibição
  1. Com uma distância de Levenshtein de 2 em vez de 1, existem mais de 300 candidatos concluídos.

  2. Com a estrita conclusão de Levenshtein (1 ou 2), não candidatos. Da mesma forma, para o Icicles Jaro-Winkler conclusão nebulosa .

Desenhou
fonte
11
Concordo que existe alguma sobreposição potencial da API para conclusão nebulosa, mas a conclusão do código geralmente requer inspeção compilada ou em tempo de execução específica do modo. Como você se declara, o Icicles oferece pouco em termos de recursos de conclusão de código, portanto não parece relevante para a questão em questão.
dgtized
@dgtized: Bem, eu discordo. Você já tentou completion.el? (Da mesma forma, dabbreve hippie-expand- todos os 3 estão incluídos no GNU Emacs.) Essas coisas são bastante úteis na conclusão do código, embora, como você sugere, elas não tenham conhecimento específico do código. Você pode se surpreender com o quão útil eles podem ser (com ou sem correspondência difusa). E assim, qualquer conclusão específica de código que usa o minibuffer para concluir quando há vários candidatos se beneficia automaticamente da conclusão nebulosa do Icicles .
Drew
2

se você usar ivy, nas atualizações recentes, será ivysuportada a funcionalidade de conclusão no ponto em uma sobreposição. Ivy suporta correspondência difusa com a ajuda de flx. Confira este vídeo sobre como funciona :)

Tudo o que você precisa fazer é pressionar a ligação de teclas à complete-symbolqual está vinculada por padrão C-M-ie uma sobreposição será exibida e você usará a correspondência difusa para obter o candidato à conclusão.

Chakravarthy Raghunandan
fonte