Réponses:
Je connais https://github.com/mgalgs/fuzzy_bash_completion qui est un tas de fonctions shell utilisées avec complete
.
Je pense que nous pourrions probablement faire un peu mieux, être plus concis. Il est temps d'ouvrir votre .bashrc ou .profile ...
Le crochet de base que nous utilisons est le suivant:
complete -o nospace -o filenames -F fuzzypath cd ls cat
L'option -F signifie utiliser une fonction shell pour la tabulation, où les options sont définies dans la COMPREPLY
variable. Ainsi, par exemple:
fonction fuzzypath () { si [-z $ 2] puis COMPREPLY = (`ls`) autre DIRPATH = `echo" $ 2 "| gsed | [^ /] * $ || '' BASENAME = `echo" $ 2 "| gsed |. * / || '' FILTER = `echo" $ BASENAME "| gsed |. | \ 0. * | g'` COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`) Fi }
où se DIRPATH
trouve tout avant le dernier / sur votre chemin que vous tapez et BASENAME
où se trouve actuellement votre curseur.
FILTER
C'est là que le flou entre en jeu. Fondamentalement, prenez BASENAME
et insérez un .*
entre chaque caractère pour produire notre expression floue .
Le reste combine simplement l'expression régulière avec ls pour produire COMPREPLY
. Vous pouvez trouver des choses plus intelligentes à faire ici, peut-être avec find
.
J'ai également trouvé que http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html était utile.
Vous pouvez trouver fzf utile. C'est un chercheur flou à usage général écrit en Ruby qui peut être utilisé avec n'importe quelle liste de choses: fichiers, processus, historique des commandes, branches git, etc.
Son script d'installation configurera la CTRL-T
liaison de touches pour votre shell. Le GIF suivant montre comment cela fonctionne.
fzf
.. (tput sc) et de le restaurer plus tard avec tput rc
..
Pour accompagner votre autre réponse, vous voudrez peut-être examiner zsh. Il est rétrocompatible avec bash, vous pouvez donc l'utiliser en remplacement, mais il prend en charge des fonctionnalités considérablement étendues et l'une d'entre elles est considérablement améliorée en matière de tabulation contextuelle.
zsh Completion FAQ étend sur les cas d'utilisation, mais je crois que selon votre exemple, vous seriez le plus intéressé par la COMPLETE_IN_WORD
fonction. Ce n'est pas tout à fait le comportement souhaité, mais c'est proche. Le point principal est qu'il existe de nombreuses façons d'étendre la fonctionnalité de base d'une manière peut-être plus accessible que d'utiliser bash.
Voici une extension de correspondance floue qui rapprocherait plus précisément ce que vous voulez; correspondance zsh-fuzzy
Pour quelques idées, vous pouvez jeter un œil au framework populaire oh-my-zsh qui a un certain nombre de fonctions pour gérer et étendre zsh. C'est plus que ce que vous voulez, très probablement, mais sous les plugins, vous noterez des scripts de complétion automatique pour une variété de rôles. Pour avoir une idée des capacités.
cat Th
+tab
?