Existe-t-il un mode de correspondance floue pour le shell zsh?

22

Je suis récemment tombé amoureux des systèmes efficaces de complétion de texte. Un de mes types de complétion préférés est ce que l'on appelle la complétion floue. Il s'agit d'un mode dans lequel le programme terminera la saisie de l'utilisateur sur la base de seulement quelques caractères pouvant apparaître «n'importe où» (presque) dans le nom ou le chemin du fichier. Cette fonctionnalité existe au moins pour ces programmes:

Exemple d'utilisation de ce mode dans un éditeur de texte:

L'utilisateur essaie de compléter le mot longWordNameThatTheyDontWantToWriteByHand, et il peut le faire en tapant par exemple la première lettre et certaines lettres majuscules. Donc, taper lwnt pourrait compléter le mot entier.

Ma question est: existe-t-il un mode ou quelque chose de similaire que je pourrais utiliser avec le shell zsh?

sp3ctum
la source

Réponses:

27

J'ai ceci dans mon .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\_}'

Il ajoute une correspondance floue zshcomplète au moteur de complétion de. Il manque le super intelligence d'un texte sublime, mais, oui, il se terminera lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
la source
1
Je viens de trouver un bogue: ne fonctionne pas pour les noms de fichiers avec des espaces, étant donné que vous tapez quoi que ce soit après l'espace ☹ C'est-à-dire stack install && vlc ~/Music/erfne se termine pas stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Hi-Angel
5
@ Hi-Angel hey, merci d'avoir heurté ça. J'utilise en fait 'r:|?=** m:{a-z\-}={A-Z\_}'maintenant, ce qui est beaucoup plus simple et ne souffre pas du problème que vous décrivez.
PythonNut
C'est génial! Vous pourriez peut-être créer un plugin avec ce code. Juste pour que ce soit plus facile à trouver.
Julien__
15

Découvrez mon projet fzf .

C'est un chercheur flou à usage général écrit en Golang qui peut être utilisé avec n'importe quelle liste de choses: fichiers, processus, historique des commandes, branches git, etc.

Pour zsh, il fournit les liaisons de touches suivantes:

  • CTRL-T - Collez le (s) chemin (s) de fichier sélectionné (s) dans la ligne de commande
  • CTRL-R - Collez la commande sélectionnée de l'historique dans la ligne de commande
  • ALT-C - cd dans le répertoire sélectionné

et mode d'achèvement flou:

# 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
la source
4
Comment puis-je le rendre complet avec ceci par défaut? Sans avoir à taper**
theonlygusti