Comment puis-je modifier le système d'achèvement de zsh pour terminer les «faux» fichiers dans certaines circonstances?
Plus précisément, le système de fichiers AVFS expose les archives en tant que répertoires en créant un «répertoire factice» à côté de chaque archive. Par défaut, il réplique la totalité de la hiérarchie des répertoires sous son point de montage ~/.avfs
. En outre, sous ~/.avfs
, pour chaque fichier d'archive tel que /tmp/foo.zip
, outre le fichier d'archive lui ~/.avfs/tmp/foo.zip
- même , il existe un répertoire appelé ~/.avfs/tmp/foo.zip#
qui expose le contenu de l'archive. Cependant, ce répertoire supplémentaire n'apparaît pas dans la liste de ~/.avfs/tmp
: il n'existe que sur demande explicite. (Ceci est similaire à la façon dont certains monteurs automatiques fonctionnent.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Lorsque je tape une commande comme celle ci-dessus, foo.zip#
n'apparaît pas comme une complétion sous ~/.avfs/tmp/
, car il n'y a pas de tel répertoire. Comment puis-je dire à zsh que chaque fois qu'il y a un fichier dont le chemin complet $arc
correspond ~/.avfs/**/*.(tgz|zip)
¹, il doit prétendre qu'il existe un répertoire appelé ${arc}#
?
(Notez que je souhaite que l'achèvement fonctionne avec chaque appel de, _files
ou _dirs
pas uniquement pour la cd
commande. Je préférerais ne pas avoir à dupliquer le code de la _files
fonction, si possible.)
¹ et tout le reste des extensions
la source
/path/to/foo
est visible en tant que~/.avfs/path/to/foo
.avfs
. Si elle présentait l'#
entrée de répertoire par défaut pour tous les fichiers correspondant aux chaînes prises en charge, ou même si Magic testait les fichiers d'un répertoire pour déterminer#
s'il était nécessaire d'avoir une entrée, la finalisation fonctionnerait simplement. J'imagine que les performances pourraient être affectées de la même manièrefind
que les fichiers compressés.Réponses:
Une fausse réponse semble insuffisante pour cette fausse question; la prise en charge intégrée de zsh pour les répertoires automount fonctionne sur les répertoires (
fake-files dir:names
) et non sur les modèles de fichiers qu'ils contiennent. Ceci est pratique pour ajouter des fichiers nommés spécifiques à un répertoire, ce qui peut convenir àautomount
ou aux configurations de typesshfs
NetApp.snapshot
où le répertoire à monter est un nom statique connuALAS
.zshall(1)
dit que les "noms" sont des chaînes, et que les expériences indiquent des métacaractères (par exemple,#
ou\#
ou'*(e:"echo hi":)'
) "ne fonctionnent pas" de différentes manières, donc il m'est impossible de glisser un glob sur la partie des noms de lafake-files
déclaration. (Fouiller à traversSrc/Zle/computil.c
pourrait révéler exactement ce que les noms peuvent être, mais ce serait plus de travail.) (Aussi, en utilisant globs récursifs dans la position de répertoire pour nommer les fichiers d' archive n'a pas volé, mais encore une fois , il prendra la plongée C pour voir combienfake-files
lets vous vous en sortez.)Avec
compdef
, on peut lister les.avfs
achèvements de répertoires:Sauf que cela échoue, car il ne montrera que les
#
fichiers sans importance, et ne pourra donc pas être complété. (Il existe des utilisations productives pour ce formulaire, mais pas pour ce cas.)Utiliser
zstyle
vous rapproche, avec ce qui suit.zshrc
:Cependant, il ne peut se terminer que jusqu'au
\#/
bout (sur un serveur Debian squeeze virt avec une configuration avfs par défaut), mais pas dans le système de fichiers virtuel pour une archive; un travail supplémentaire sera donc nécessaire pour compléter l’archive. Je devine par la voie via_call_program ... ls
ou quelque chose du genre pour les achèvements\#
, à moins qu’il n’y ait un moyen plus élégant dezsh
croire que des répertoires qui n’existent pas existent.Mauvaises nouvelles! La finalisation ne réussit pas
_path_files
pour les faux répertoires; Je soupçonne que cela est lié au zsh globbing. Zsh 4.something on et zsh 5.0.8 présentent tous deux le problème. Donc, je soupçonne qu'un correctif complet nécessiterait des correctifs_path_files
, ou d'écrire quelque chose de différent qui se termine autrement sur ces faux répertoires. Une trace de débogage d'achèvement peut être générée en tapantls /root/.avfs/root/sometar.gz\#/
puis à la fin de ce typagecontrol-x
, puis?
, en supposantbindkey -e
et_complete_debug
lié à keycombo, si quelqu'un veut approfondir la raison de son échec.la source
En zsh, vous pouvez utiliser
compctl -K
votre propre fonction pour générer des options de complétion. Par exemple:Ensuite, vous devez définir votre propre fonction:
De toute évidence, ce qui précède nécessite un peu plus de travail, mais il faut commencer par là.
Une fonction d'achèvement personnalisée similaire (mais différente) peut être enregistrée pour bash.
Voici un exemple avec des implémentations pour bash et zsh . (Il permet de compléter les options de ligne de commande en les extrayant de la page de manuel de la commande.)
Et voici quelques hypothèses sur ce qui pourrait fonctionner dans votre fonction d'achèvement:
Ou peut-être ceci:
Bonne chance!
la source
compctl
, c’est-à-dire que je veux changer ce qui le_files
fait. Votre réponse n'est pas utile du tout.