Les compléments de l'onglet Zsh ne fonctionnent pas comme souhaité pour les chemins partiels

17

Je souhaite une exécution floue insensible à la casse pour les fichiers et répertoires dans zsh. Après avoir lu le manuel pendant quelques heures, voici ce que j'ai trouvé:

zstyle ':completion:*:*:*:*:globbed-files' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:local-directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'

De plus, je veux appuyer TABune fois pour afficher les achèvements possibles, ne modifiant ce que j'ai tapé que s'il y a exactement un achèvement. Ensuite, TABune deuxième pression devrait me mettre en mode "achèvement de menu". Sur la base des manuels, j'ai trouvé ceci:

zstyle ':completion:*' menu select

Maintenant, tout fonctionne comme il se doit, sauf dans une circonstance. J'ai deux dossiers Desktopet .rstudio-desktopdans mon répertoire personnel. Depuis que je l'ai setopt globdots, je m'attends à taper ce qui suit:

$ cd ~/dktop<TAB>

pour laisser mon commandement tel qu'il est entré et afficher comme candidats à l'achèvement Desktopet .rstudio-desktop. Au lieu de cela, il supprime dktop , me laissant avec ce qui suit:

$ cd ~/

J'ai regardé tous les manuels, guides, questions Stack Exchange pertinents et diverses autres sources. Mais quoi que je fasse, je ne peux pas faire fonctionner ça.

Fait intéressant, cependant, si je suis dans le répertoire personnel et que je tape ce qui suit, tout fonctionne comme prévu:

$ cd dktop<TAB>

Autrement dit, ce n'est qu'un problème avec les segments de chemins non principaux (et vous pouvez voir avec C-x hcela que cela correspond à la directoriesbalise plutôt qu'à la local-directoriesbalise utilisée).

Pour une reproductibilité facile, voici un ~/.zshrcqui reproduira la situation et le comportement décrits ci-dessus (testé sur une nouvelle machine virtuelle El Capitan avec zshde Homebrew).

Radon Rosborough
la source
Ne peut pas se reproduire. zsh 5.3.1le Arch Linux. cd ~/dktop<tab>rendements cd ~/Desktop.
PythonNut
@PythonNut Sous zsh 5.3.1OS X, le problème se reproduit. Il est intéressant de noter qu'il existe une différence entre les systèmes d'exploitation.
Radon Rosborough
1
@PythonNut En fait, je parie que c'est parce que Linux est sensible à la casse et macOS est insensible à la casse.
Radon Rosborough
Tout comme un rappel convivial, tous les Mac / macOS ne sont pas sensibles à la casse, cela dépend si votre disque est formaté ou non.
konqui

Réponses:

1

Une solution possible est de faire:

bindkey "^I" expand-word

Cela entraînera l'extension ~/de l' onglet jusqu'au chemin absolu.

ConstipatedNinja
la source
Peut-être que je manque quelque chose, mais je ne vois pas comment cela se rapporte de quelque manière que ce soit à la complétion des onglets flous ou à la résolution du problème décrit ci-dessus. Si je fais ce que vous suggérez, appuyer sur TAB me donnera cd /Users/raxod502/dktopet l'achèvement est désactivé.
Radon Rosborough,
@RadonRosborough L'espoir était qu'en se développant ~/sur son chemin absolu, l'achèvement flou commencerait à fonctionner. Cela semblait être l'un de ces cas où le problème est qu'il l'évalue une fois mais que vous en avez réellement besoin pour évaluer deux fois pour fonctionner, donc avoir le chemin absolu au lieu de ~/signifierait qu'il ne faudrait plus qu'une seule évaluation. Mais merde, je suis désolé, j'ai oublié que bindkey remplace les anciennes liaisons, et je ne trouve rien qui dise s'il est même possible de lier deux fonctions à une seule clé. Sans ma clé de raccourci, votre achèvement fonctionne-t-il comme prévu lorsque vous disposez de chemins absolus?
ConstipatedNinja
Non. Cela ne fait aucune différence que le chemin d'entrée soit ~/dktopou /Users/raxod502/dktop; le résultat est le même, à savoir qu'il dktopest supprimé lorsque j'appuie sur TAB.
Radon Rosborough