Détecter automatiquement quand j'ai tapé «vi» mais que je voulais dire «cd»?

21

Environ 5 fois par jour, je tape "vi" quand je voulais dire "cd", et finis par ouvrir un répertoire dans vi. Ça me fait des noix. Il semble qu'il devrait y avoir un moyen de détecter quand je tape "répertoire vi +" et de le changer automatiquement en "répertoire cd +". Pensées?

Alex
la source
1
J'ai donné une alternative que vous pourriez trouver intéressante aussi ^^ (une qui vous a permis de corriger la source du problème, tout en évitant d'être irrité jusque-là ^^)
Olivier Dulac
1
Cela m'a également beaucoup frustré, jusqu'à ce que je découvre que vous pouvez utiliser Entrée et les flèches pour naviguer vers le fichier dans le dossier. Lorsque vous cliquez sur Entrée tout en étant dessus, il s'ouvre.
nuoritoveri
1
Avec seulement une petite quantité de facétie: passez à zsh. Configurez-le de sorte que lorsque vous tapez un nom de répertoire, il change dans ce répertoire. Utilisez des alias de suffixe pour que lorsque vous tapez * .sh, * .c, * .config, quoi qu'il ouvre le fichier correspondant dans vi. La mise en garde ici est bien sûr que vous pourriez vous retrouver à omettre "vi" ou "cd" dans une coquille inconnue.
mkingston
3
Comment cela peut-il arriver?
JFA

Réponses:

38

Avec l'hypothèse que vous appelez viavec le répertoire comme dernier argument:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}
Chris Down
la source
2
@Alex Je suppose que c'est à la fois parfait pour les rares cas où vous avez mal tapé "vi" au lieu de "cd", tout en vous apprenant à toujours taper "vi" maintenant;) [c'est-à-dire, j'espère que vous ne le faites pas souvent je dois utiliser un autre serveur / machine où cette fonction ne sera pas là pour vous épargner du stress ...] [+1 pour cette réponse, cependant, c'est ce que je voulais répondre aussi, sauf que je testerais juste pour "$ { 1} "[puis cd" $ {1} "] au lieu de" $ {! #} "...]
Olivier Dulac
5
@OlivierDulac Convenu - De même dangereux est aliasing rmà rm -i, qui est la valeur par défaut dans de nombreuses distributions. Je pense généralement que la meilleure façon de résoudre les problèmes est de résoudre l'utilisateur plutôt que de les contourner.
Chris Down
3
@OlivierDulac aliasing rmpour rm -iaurait pu vous sauver quelques problèmes dans le passé , mais pourrait (et sera probablement) , vous obtenez dans beaucoup plus de mal à l'avenir ...
jlliagre
1
@Alex Eh bien, vous avez dit vidans la question ...
Chris Down
2
@crisron: fait ${!#}indirectement référence à l'argument final et commandn'est nécessaire que pour éviter la récursivité des fonctions dans cette instance.
Chris Down
4

Outre la réponse @ChrisDown, voici une autre approche: contourner les répertoires

Avec cette approche, vous pouvez:

vi ./*

et il démarrera vi sur tous les fichiers du répertoire courant même s'il contient des sous-répertoires, en contournant ces sous-répertoires

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

Celui-ci ne fait que vi, sur tout argument qui ne sont pas des répertoires ... Par conséquent, il ne vous apprendra pas à utiliser "vi" pour "cd";)

Et il n'appellera pas vi si vous venez de le faire: vi un répertoire (c'est-à-dire, un typage erroné au lieu de cd). Mais il n'y sera pas automatiquement alors, vous vous souvenez donc que vous devez taper cd ^^

J'ai utilisé un moyen "compatible" pour modifier les listes d'arguments, afin qu'il soit portable sur de nombreuses plates-formes.

Olivier Dulac
la source
1
note:: command somethingdémarre la commande "quelque chose" (c'est-à-dire la première occurrence de "quelque chose" trouvé en utilisant $ PATH) au lieu de toute fonction d'alias OU nommée "quelque chose". \somethingne contournerait que l'alias, mais conserverait la fonction si elle existait (et ici, cela signifierait que la fonction "vi" s'appellerait elle-même et ferait une boucle).
Olivier Dulac
@ChrisDown: nous parlons d'une aide à un utilisateur qui, je l'espère, n'essaiera pas de se pirater lui-même ^^. Et cet eval est de définir un nouvel ensemble d'arguments (set - ...), donc c'est moins dangereux en soi
Olivier Dulac
@StephaneChazelas: merci pour l'édition! J'ai essayé de l'écrire de cette façon, mais je m'inquiétais de faire une boucle à l'infini [je vous fais confiance, il ne bouclera pas, cependant!. Le 'for arg' est en cours d'évaluation avant le début du traitement interne, et donc sa liste "$ @" est 'sauvegardée' et réitérée, et non modifiée même si le traitement interne change "$ @"?]
Olivier Dulac
1

Une solution consiste à cesser cdcomplètement d' utiliser . Mettez shopt -s autocddans votre .bashrcou setopt autocddans votre .zshrc. Ensuite, pour passer à un autre répertoire, tapez le nom du répertoire, sans aucune commande.

N'oubliez pas de taper visi vous souhaitez modifier un fichier.

Si vous voulez vraiment qu'une seule commande change dans un répertoire ou édite un fichier, vous pouvez en faire une fonction:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}
Gilles 'SO- arrête d'être méchant'
la source
-6

Utilisez la fonction d'alias sous Unix. Une fois que vous avez alias cd en vi, le problème sera résolu.

user56893
la source
5
... cela signifierait que l'on ne peut pas utiliser visans remplacer manuellement l'alias, ce qui semble hautement indésirable.
Chris Down
3
Cette réponse apparaît comme légèrement trollish. Il répond à la question d'origine, car le PO n'a pas précisé qu'il avait jamais eu besoin de vi dans un fichier. La réponse, bien que quelque peu amusante, n'est certainement pas utile.
gerrit
1
@ChrisDown Ou cela vous apprendrait à utiliser le bon à la vimplace.
Kevin
@Kevin vim n'est pas plus "correct" que vi - sur de nombreux systèmes, vi est tout ce qui est disponible.
Chris Down
1
@ChrisDown Je dirais qu'il vaut mieux savoir à quoi s'attendre. Si vous prévoyez d'utiliser les fonctionnalités de vim, utilisez vim. S'il n'est pas disponible, utilisez viet attendez-vous à l'ensemble de fonctionnalités plus limité.
Kevin