Ouvrir automatiquement des files text dans l'éditeur au lieu d'essayer de les exécuter?

Lorsque je tape accidentellement le nom d'un file text sans command d'éditeur et que le file text n'est pas un script shell, j'obtiens une erreur "permission denied" *, car le file n'est pas exécutable et le premier jeton la command line est considérée comme la command à exécuter.

Cependant, cela signifie simplement que j'ai oublié par erreur de taper ma command d'éditeur, il serait donc pratique que le shell reconnaisse d'une manière ou d'une autre que le premier jeton soit un file text existant sans le bit "execute" et l'ouvre automatiquement soit $EDITOR ou $VISUAL .

Existe-t-il un moyen d'accomplir ceci dans Bash ou Zsh? (J'utilise Bash mais je pense à changer de toute façon). Ce serait un peu comme l'option autocd de Bash, qui détecte automatiquement si le premier jeton est un directory et tente d'y cd plutôt que de donner l'erreur standard "Est un directory".

Idéalement, si je donne une list de files (par exemple avec un glob) ou tout autre set d'arguments, tous ces arguments seront transmis à la command de l'éditeur.

* Bien sûr, je peux aussi get une erreur "command introuvable" si je spécifie un file dans le directory courant sans ./ .

Dans zsh , tant que vos files text ont une extension de nom de file ( file.ext ), vous pouvez file.ext alias de suffixe . Elles sont définies par alias -s name=value et sont exécutées sous value text.name chaque fois que le premier mot de la command line correspond à text.nametext est une string non vide.

Par exemple:

Si vous définissez

 alias -s txt=vim 

puis taper

 $ foo.txt 

sur la command line fonctionnera

 vim foo.txt 

Cela fonctionne pour tout ce qui correspond ?*.txt , même les mots avec des caractères generics:

 $ *.txt 

courra

 vim *.txt 

Il vérifie également uniquement sur le premier mot de la command, mais passera toute la command line comme argument, même s'il y a des alias de suffixe pour les autres mots:

 $ foo.txt bar.c baz.vim 

courra

 vim foo.txt bar.c baz.vim 

Important : Cela affecte également toute command avec une extension correspondante, y compris celles dans PATH . Si vous, par exemple, définissez

 alias -s sh=vim 

et vous avez une command nommée something.sh et vous voulez exécuter

 something.sh -p1 -p2 arg1 arg2 

il fonctionnerait plutôt

 vim something.sh -p1 -p2 arg1 arg2 

Pour désactiver cette fonctionnalité pour une command, ajoutez simplement la command builtin:

 command something.sh -p1 -p2 arg1 arg2 

Les inconvénients évidents sont:

  • cela fonctionne uniquement sur les files avec une extension de nom de file
  • vous devez définir l'alias explicitement pour chaque extension

Du coté positif:

  • cela ne fonctionne que sur les files avec une extension de nom de file, donc la plupart des exécutables dans /bin et /usr/bin sont pas remplacés par un alias.
  • vous pouvez définir un alias (différent) pour n'importe quelle extension, donc les files *.jpg ou *.o ne seront pas soudainement ouverts avec vim