Je travaille avec un grand nombre de fichiers que je garde dans un répertoire. Chaque fois que je vais dans ce répertoire et que j'appuie accidentellement Tabdeux fois, cela prend trop de temps (peut-être plus d'une minute) pour afficher les fichiers qui correspondent au modèle, et je suis assez ennuyé par ce comportement.
Par exemple, ma structure de répertoire est:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Puisque j'aime toujours l'achèvement, est-il possible de désactiver cette fonctionnalité uniquement dans le data/
répertoire? Comme définir un délai d'expiration de 5 secondes, ou un script qui éteint automatiquement l'achèvement à l'intérieur d'un répertoire spécifique?
bash
autocomplete
neizod
la source
la source
Réponses:
Ce n'est pas parfait, mais encore une fois, l'achèvement de bash est assez difficile ...
La manière la plus simple est sur une base par commande, elle est légèrement plus flexible que
FIGNORE
, vous pouvez le faire:Cela indique à la saisie semi-automatique que la complétion
vi
est pour les fichiers et à supprimer les modèles correspondant au-X
filtre. L'inconvénient est que le modèle n'est pas normalisé, donc les../data
variations ne correspondent pas.La prochaine meilleure chose pourrait être une
PROMPT_COMMAND
fonction personnalisée :Cela désactive l'achèvement (complètement) lorsque vous êtes dans le répertoire, mais il le désactive pour chaque chemin, pas seulement pour les fichiers de ce répertoire.
Il serait plus généralement utile de désactiver cela de manière sélective pour des chemins définis, mais je crois que la seule façon est d'utiliser une fonction de complétion par défaut (bash-4.1 et ultérieur avec
complete -D
) et beaucoup de déconner.Cela devrait fonctionner pour vous, mais cela peut avoir des effets secondaires imprévus (c'est-à-dire des changements à la fin attendue dans certains cas):
Cela fonctionne pour l'achèvement de
vi
, d'autres commandes peuvent être ajoutées au besoin. Il doit arrêter l'achèvement des fichiers dans les répertoires nommés, quel que soit le chemin ou le répertoire de travail.Je pense que l'approche générale
complete -D
consiste à ajouter dynamiquement des fonctions d'achèvement pour chaque commande au fur et à mesure qu'elle se produit. Il peut également être nécessaire d'ajoutercomplete -E
(achèvement du nom de la commande lorsque le tampon d'entrée est vide).Mise à jour Voici une version hybride des
PROMPT_COMMAND
solutions de fonction et de complétion, c'est un peu plus facile à comprendre et à pirater je pense:Cette fonction d'invite définit la
nocomplete
variable lorsque vous entrez dans l'un des répertoires configurés. Le comportement de complétion modifié n'intervient que lorsque cette variable n'est pas vide et uniquement lorsque vous essayez de terminer à partir d'une chaîne vide, permettant ainsi la complétion des noms partiels (supprimez la-z "$cur"
condition pour empêcher complètement la complétion). Commentez les deuxprintf
lignes pour un fonctionnement silencieux.Les autres options incluent un
.noautocomplete
fichier indicateur par répertoire que vous pouveztouch
dans un répertoire selon vos besoins; et deviner la taille du répertoire en utilisant GNUstat
. Vous pouvez utiliser l'une ou l'ensemble de ces trois options.(La
stat
méthode n'est qu'une supposition , la taille du répertoire signalé augmente avec son contenu, c'est un «high water mark» qui ne rétrécit généralement pas lorsque les fichiers sont supprimés sans intervention administrative. C'est moins cher que de déterminer le contenu réel d'un fichier potentiellement volumineux Le comportement précis et l'incrémentation par fichier dépendent du système de fichiers sous-jacent. Je le trouve au moins un indicateur fiable sur les systèmes linux ext2 / 3/4.)bash ajoute un espace supplémentaire même quand un achèvement vide est retourné (cela ne se produit que lors de l'achèvement à la fin d'une ligne). Vous pouvez ajouter
-o nospace
à lacomplete
commande pour éviter cela.Un inconvénient restant est que si vous sauvegardez le curseur au début d'un jeton et appuyez sur l'onglet, l'achèvement par défaut se déclenchera à nouveau. Considérez cela comme une fonctionnalité ;-)
(Ou vous pouvez essayer
${COMP_LINE:$COMP_POINT-1:1}
si vous aimez la sur-ingénierie, mais je trouve que bash lui-même ne parvient pas à définir les variables d'achèvement de manière fiable lorsque vous sauvegardez et tentez l'achèvement au milieu d'une commande.)la source
Si votre
data
répertoire contient des fichiers avec un suffixe spécifique, par exemple.out
, vous pouvez définir votrebash
variableFIGNORE
sur".out"
et ceux-ci seront ignorés. Bien qu'il soit également possible d'utiliser des noms de répertoire, cela n'aide pas les noms de répertoire de travail actuels.Exemple:
Créez des milliers de fichiers de test de 100 Ko sur l'hôte physique avec les disques durs RAID 1:
Définissez la
bash
variable:$ FIGNORE=".json"
Créez le fichier de test:
$ touch test.out
Testez à 5000 fichiers:
Aucun délai entre le vi et le single
tab
avanttest.out
n'apparaît.Testez à 50 000 fichiers:
Un seul onglet crée une fraction de seconde de délai avant d’
test.out
apparaître.Testez à 200 000 fichiers:
Un délai de 1 seconde entre le vi et le single
tab
avanttest.out
apparaît.Les références:
Extrait de l'homme bash
la source
$ vi <tab><tab>
, ça prend beaucoup de temps de toute façon. : \.json
fichiers et un seul fichier texte nomméfoo.txt
. allumantFIGNORE='.json'
, je tape$ vi <tab>
et dois encore attendre une demi-minute pour que cela me complète$ vi foo.txt
. --- scénario réel, je ne vais pas éditer, ni mélanger les types de fichiers dans ce répertoire, mais si j'allumeFIGNORE
et (accidentellement) j'appuie sur tab, mon clavier se fige pendant longtemps sans aucune allusion à quelque chose comme çaDisplay all 188275 possibilities? (y or n)
, qui me dit que je peux récupérer mon clavier.Je suppose que c'est ce que vous voulez (emprunté du code à @ mr.spuratic)
Notez que cela ne vous empêche pas d'appuyer sur TAB en utilisant le chemin complet (par exemple
vim /directory/contains/lots/files<tab><tab>
la source
pushd
/popd
. Comme cela n'utilise qu'un tableau régulier, pas un tableau associatif, il fonctionnera également dans bash 3.x.