Comment supprimer une partie d'un chemin dans un shell interactif?

19

Existe-t-il un raccourci en bash et zsh pour supprimer un composant d'un chemin? Par exemple, si je tape ls ~/local/color/et que le curseur se trouve à la fin de la ligne, existe-t-il un raccourci pour supprimer le color/à la fin? Idéalement, je veux des solutions en mode vi et en mode emacs

Vayn
la source

Réponses:

25

Les commandes les plus couramment utilisées en mode bash emacs par défaut , pour les claviers les plus couramment utilisés:

Mouvement

  • Ctrl- p, ou Up: commande précédente
  • Ctrl- n, ou Down: commande suivante
  • Ctrl- b, ou Left: caractère précédent
  • Ctrl- f, ou Right: caractère suivant
  • Alt- b: mot précédent
  • Alt- f: mot suivant
  • Ctrl- a, ou Home: début de la commande
  • Ctrl- e, ou End: fin de commande

Édition

  • BkSpc: supprimer le caractère précédent
  • Ctrl- d, ou Del: supprimer le caractère actuel
  • Alt- BkSpc: supprimer le mot à gauche
  • Alt- d: supprimer le mot à droite
  • Ctrl- u: supprimer pour démarrer la commande
  • Ctrl- k: supprimer jusqu'à la fin de la commande
  • Ctrl- y: coller la dernière coupe

Miscellanea

  • Cltr- /: annuler
  • Cltr- r: recherche incrémentielle d'historique en arrière
enzotib
la source
2
Complément: définir un raccourci à cet effet dans zshbindkey [key] vi-backward-kill-word
Vayn
Merci. J'ai ajouté ceci à mon fichier ~ / .zshrc et cela fonctionne bien pour moi lorsque j'appuie sur Alt + Retour arrière: bindkey "^ [^?" vi-back-kill-word. Ce n'est pas idéal.
Tim Stewart
Alt-Bckspc et Alt-d fonctionnent bien avec les chemins de fichiers sur lesquels je les ai essayés. (on bash)
sage
10

Il y en a aussi unix-filename-ruboutpour Readline!

# in ~/.inputrc
# press ctrl-b to delete unix filename parts
# see: man bash | less -p 'unix-filename-rubout' and
#      http://www.calmar.ws/vim/vi-bash.html
set editing-mode vi
set keymap vi
"\C-b": unix-filename-rubout
mikeo
la source
2
IMHO unix-filename-ruboutest la bonne réponse à la question posée car elle supprime la barre oblique ou les espaces blancs, alors Alt-BkSpcqu'elle s'arrêtera aux caractères comme le trait d'union, le trait de soulignement, le point, etc.
Steve
6

Par défaut, bash (et je suppose que zsh) sera en mode emacs. Vous pouvez essayer quelque chose comme ceci:

Esc + bmettra le curseur en arrière d'un mot. Ctrl + ksera supprimé jusqu'à la fin de la ligne.

La plupart des shells modernes (comme bash) implémenteront des fonctionnalités avancées d'édition en ligne de commande. Ces commandes sont soit proches de l'édition emacs (Ctrl + A pour le début de la ligne, Ctrl + E pour la fin de la ligne, ...).

Si vous connaissez les éditeurs de type vi, vous pouvez essayer d'autoriser vi-mode.

set -o vi

Il donne à votre shell des modes de type vi (mode commande / mode insertion), et vous avez accès aux commandes standard (d pour supprimer, r pour remplacer, ...)

En mode Vi, voici comment vous feriez ce que vous avez décrit:

Esc (command mode); d; b.
rahmu
la source
1
Je ne dirais pas que "l'édition de ligne de commande est encore plus puissante et complète en mode vi", le mode emacs a des commandes pour faire tout ce que vous pouvez faire en mode vi .
enzotib
J'avoue que je me suis un peu emporté. Je vais reformuler ceci.
rahmu
Merci de me rappeler qu'il y a vi-mode dans bash, donc je peux l'utiliser dbdans ce scénario dans bash. J'ai également trouvé vi-backward-kill-worddans zsh ce que je veux, et c'est plus pratique que de définir vi-mode dans bash. Mais je veux toujours trouver un raccourci de mode emacs à cet effet dans bash.
Vayn
Ou "alt-bC". De cette façon, ne laisse pas de caractère de fin, ce dbqui dans certains cas.
Wildcard