Existe-t-il un shell qui prend en charge l'achèvement flou comme dans Sublime Text?

14

J'utilise bash et je me demandais s'il y avait un plugin dans bash ou un autre shell qui me permet de faire ceci cat tfnislong.txt+ se [tab]termine cat ThisFileNameIsSoLong.txtcomme pour la complétion d'onglets dans Sublime Text.

bois
la source
Pourquoi ne pas simplement faire cat Th+ tab?
daviewales
1
@daviewales Afficher les 269 raisons?
Fax du

Réponses:

11

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 COMPREPLYvariable. 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 DIRPATHtrouve tout avant le dernier / sur votre chemin que vous tapez et BASENAMEoù se trouve actuellement votre curseur.

FILTERC'est là que le flou entre en jeu. Fondamentalement, prenez BASENAMEet 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.

mwm
la source
6

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-Tliaison de touches pour votre shell. Le GIF suivant montre comment cela fonctionne.

Junegunn Choi
la source
FZF est super! Merci beaucoup pour votre contribution. Cela m'a sauvé des semaines de travail .. Je commençais à écrire un achèvement flou pour Bash quand j'ai heureusement trouvé FZF. Cela fonctionne parfaitement, je devais juste me rappeler de sauvegarder la position du curseur avant d'appeler fzf.. (tput sc) et de le restaurer plus tard avec tput rc..
Håkon Hægland
3

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_WORDfonction. 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.

krondor
la source