Existe um modo de correspondência difusa para o shell zsh?

21

Recentemente, me apaixonei por sistemas eficientes de preenchimento de texto. Um dos meus tipos favoritos de conclusão é a chamada conclusão nebulosa. Este é um modo no qual o programa concluirá a entrada do usuário com base em apenas alguns caracteres que podem ocorrer 'em qualquer lugar' (quase) no nome ou no caminho do arquivo. Esse recurso existe pelo menos para estes programas:

Exemplo de uso deste modo em um editor de texto:

O usuário está tentando preencher a palavra longWordNameThatTheyDontWantToWriteByHand, e pode fazer isso digitando, por exemplo, a primeira letra e algumas das maiúsculas. Então, digitar lwnt pode ser concluído com toda a palavra.

Minha pergunta é: existe um modo ou algo semelhante que eu poderia usar com o shell zsh?

sp3ctum
fonte

Respostas:

26

Eu tenho isso na minha .zshrc

# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
  'm:{a-z\-}={A-Z\_}' \
  'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
  'r:|?=** m:{a-z\-}={A-Z\_}'

Ele adiciona correspondência difusa zshcompleta ao mecanismo de conclusão. Falta a super inteligência do texto sublime, mas sim, será concluído lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
fonte
1
Eu encontrei apenas um erro: não funciona para nomes de arquivos com espaços, uma vez que você está digitando qualquer coisa após o espaço ☹ Ie stack install && vlc ~/Music/erfnão completar a stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Hi-Angel
5
@ Oi Angel, ei, obrigado por esbarrar nisso. Na verdade, eu uso 'r:|?=** m:{a-z\-}={A-Z\_}'agora, que é muito mais simples e não sofre com o problema que você descreve.
PythonNut 01/09/16
Isso é ótimo! Talvez você possa criar um plugin com este código. Apenas para que seja mais fácil encontrar.
Julien__
15

Confira meu projeto fzf .

É um localizador difuso de uso geral escrito em Golang que pode ser usado com qualquer lista de coisas: arquivos, processos, histórico de comandos, ramificações git, etc.

Para zsh, ele fornece as seguintes ligações de teclas:

  • CTRL-T - Cole o (s) caminho (s) do arquivo selecionado (s) na linha de comando
  • CTRL-R - Cole o comando selecionado do histórico na linha de comando
  • ALT-C - cd no diretório selecionado

e modo de conclusão difusa:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>

# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>

# Host names
ssh **<TAB>
telnet **<TAB>

# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>
Junegunn Choi
fonte
3
Como posso fazer com que a guia seja concluída com isso por padrão? Sem ter que digitar**
theonlygusti