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

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

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

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.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.