web-dev-qa-db-fra.com

Avoir des correspondances de saisie automatique insensibles à la casse zsh return, mais préférez les correspondances exactes

J'utilise zsh avec le fichier rc de oh-my-zsh et il y a un comportement que je trouve particulièrement ennuyeux. Par défaut, oh-my-zsh est configuré pour renvoyer des correspondances insensibles à la casse lors de la saisie automatique. Ce comportement est parfois bon, mais parfois il est vraiment nul. Existe-t-il un moyen de configurer zsh pour utiliser uniquement la correspondance insensible à la casse lorsqu'il n'y a pas de correspondance sensible à la casse?

Par exemple, ce cas utiliserait une correspondance sensible à la casse:

> ls
LICENSE.txt    lib/
> emacs l <-- should autocomplete to lib/

Dans ce cas, une auto-complétion insensible à la casse se produirait:

> ls
README    lib/
> emacs r <-- should autocomplete to README

Merci!

32
Max

Décommentez simplement la ligne suivante dans ~/.zshrc:

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

Ça a marché pour moi

26
Jesus Garcia

Créez un fichier ~/.oh-my-zsh/custom/better-completion.zsh (En supposant que vous utilisez des chemins par défaut pour oh-my-zsh) avec les lignes suivantes

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'

Explication:

Les règles pour les correspondances en complétion zsh en général sont définies dans le style matcher-list. Pour oh-my-zsh, cela est défini dans ~/.oh-my-zsh/lib/completion.zsh (Une fois pour la casse et une pour la casse). Vous pouvez le changer ici, mais il disparaîtrait probablement si vous mettiez à jour votre oh-my-zsh. ~/.oh-my-zsh/custom Est spécifiquement destiné à la personnalisation et les fichiers avec l'extension .zsh Sont chargés à partir de là par .oh-my-zsh/oh-my-zsh.sh À la fin de la configuration.

Les paramètres par défaut (insensibles à la casse) pour matcher-list Dans oh-my-zsh sont:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'

Le premier indique comment manipuler les majuscules et les minuscules interchangeables. Comme il s'agit de la première règle, elle sera invariablement utilisée pour chaque match.

La seule modification nécessaire consiste à ajouter '' Pour une complétion simple (c'est même le premier exemple dans zshcompsys(1) pour matcher-list)

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'

Cela essaie d'abord de terminer le mot actuel exactement tel qu'il est écrit, avant d'essayer des correspondances insensibles à la casse ou autres.

Pour être complet:

  • La deuxième règle (originale) permet un achèvement partiel avant ., _ Ou -, Par ex. f.b -> foo.bar.
  • La troisième règle permet de compléter sur le côté gauche du texte écrit, par ex. bar -> foobar)
29
Adaephon