Wie lösche ich einen Teil eines Pfades in einer interaktiven Shell?

19

Gibt es eine Verknüpfung in Bash und Zsh, um eine Komponente eines Pfades zu löschen? Wenn ich zum Beispiel ls ~/local/color/tippe und der Cursor am Ende der Zeile steht, gibt es eine Verknüpfung, um die color/am Ende zu löschen ? Idealerweise möchte ich Lösungen sowohl im vi-mode als auch im emacs-mode

Vayn
quelle

Antworten:

25

Die am häufigsten verwendeten Befehle im Standard-Bash- Emacs-Modus für die am häufigsten verwendeten Tastaturen:

Bewegung

  • Ctrl- p, oder Up: vorheriger Befehl
  • Ctrl- n, oder Down: nächster Befehl
  • Ctrl- b, oder Left: vorheriges Zeichen
  • Ctrl- f, oder Right: nächstes Zeichen
  • Alt- b: vorheriges Wort
  • Alt- f: nächstes Wort
  • Ctrl- a, oder Home: Kommandobeginn
  • Ctrl- e, oder End: Befehlsende

Bearbeitung

  • BkSpc: Vorheriges Zeichen löschen
  • Ctrl- d, oder Del: Aktuelles Zeichen löschen
  • Alt- BkSpc: Wort nach links löschen
  • Alt- d: Wort nach rechts löschen
  • Ctrl- u: Löschen, um den Befehl zu starten
  • Ctrl- k: Löschen bis zum Ende des Befehls
  • Ctrl- y: Letzten Schnitt einfügen

Verschiedenes

  • Cltr- /: rückgängig machen
  • Cltr- r: Inkrementelle Rückwärtssuche
Enzotib
quelle
2
Complement: set eine Verknüpfung zu diesem Zweck in zshbindkey [key] vi-backward-kill-word
Vayn
Vielen Dank. Ich habe dies zu meiner ~ / .zshrc-Datei hinzugefügt und es funktioniert gut, wenn ich Alt + Backspace drücke: bindkey "^ [^?" vi-backward-kill-word. Es ist nicht ideal.
Tim Stewart
Alt-Bckspc und Alt-D funktionieren gut mit den Dateipfaden, auf denen ich sie ausprobiert habe. (auf Bash)
demure
10

Es gibt auch unix-filename-ruboutfür 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
quelle
2
IMHO unix-filename-ruboutist die richtige Antwort auf die gestellte Frage, da es zu Schrägstrichen oder Leerzeichen löscht, während Alt-BkSpcbei Zeichen wie Bindestrich, Unterstrich, Punkt usw. aufhören wird
Steve
6

Standardmäßig befindet sich bash (und ich vermute zsh) im Emacs-Modus. Sie könnten so etwas versuchen:

Esc + bsetzt den Cursor ein Wort zurück. Ctrl + kwird bis zum Ende der Zeile gelöscht.

Die meisten modernen Shells (wie Bash) implementieren erweiterte Befehlszeilen-Bearbeitungsfunktionen. Diese Befehle befinden sich entweder in der Nähe der Emacs-Bearbeitung (Strg + A für Zeilenanfang, Strg + E für Zeilenende, ...).

Wenn Sie mit vi-ähnlichen Editoren vertraut sind, können Sie versuchen, den vi-Modus zuzulassen.

set -o vi

Es gibt Ihrem Shell vi-ähnlichen Modus (Befehlsmodus / Einfügemodus) und Sie erhalten Zugriff auf die Standardbefehle (d für Löschen, r für Ersetzen, ...)

Im Vi-Modus würden Sie wie folgt vorgehen:

Esc (command mode); d; b.
rahmu
quelle
1
Ich würde nicht sagen, dass die Befehlszeilenbearbeitung im vi-Modus noch leistungsfähiger und vollständiger ist. Der emacs-Modus verfügt über Befehle, mit denen Sie alles tun können, was Sie im vi-Modus tun können .
Enzotib
Ich gebe zu, dass ich ein bisschen mitgerissen wurde. Ich werde das umformulieren.
Rahmu
Vielen Dank, dass Sie mich daran erinnert haben, dass es in bash den vi-Modus gibt, damit ich ihn dbin diesem Szenario in bash verwenden kann. Ich habe auch festgestellt, dass vi-backward-kill-wordzsh das ist, was ich will, und es ist praktischer, als den vi-mode in bash zu setzen. Aber ich möchte immer noch eine Emacs-Modus- Verknüpfung für diesen Zweck in Bash finden.
Vayn
Oder "alt-bC". Auf diese Weise bleibt kein abschließendes Zeichen übrig, was dbin einigen Fällen auch der Fall ist.
Wildcard