25

Is there a shortcut in bash and zsh to delete one component of a path? For example, if I type ls ~/local/color/, and the cursor is at the end of line, is there a shortcut to delete the color/ at the end? Ideally I want solutions in both vi-mode and emacs-mode

Michael Mrozek
  • 91,316
  • 38
  • 238
  • 232
Vayn
  • 353
  • 3
  • 7

3 Answers3

28

The most commonly used commands in the default bash emacs mode, for most commonly used keyboards:

Movement

  • Ctrl-p, or Up: previous command
  • Ctrl-n, or Down: next command
  • Ctrl-b, or Left: previous character
  • Ctrl-f, or Right: next character
  • Alt-b: previous word
  • Alt-f: next word
  • Ctrl-a, or Home: begin of command
  • Ctrl-e, or End: end of command

Editing

  • BkSpc: delete previous character
  • Ctrl-d, or Del: delete current character
  • Alt-BkSpc: delete word to left
  • Alt-d: delete word to right
  • Ctrl-u: delete to start of command
  • Ctrl-k: delete to end of command
  • Ctrl-y: paste last cut

Miscellanea

  • Cltr-/: undo
  • Cltr-r: incremental backward history search
enzotib
  • 50,671
  • 14
  • 120
  • 105
14

There's also unix-filename-rubout for 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
  • 141
  • 1
  • 2
  • 3
    IMHO `unix-filename-rubout` is the correct answer to the question asked as it deletes to slash or whitespace, whereas `Alt-BkSpc` will stop at characters like hyphen, underscore, dot, etc. – Steve Feb 16 '17 at 16:03
7

By default bash (and I'm guessing zsh) will be in emacs-mode. You could try something like this:

Esc + b will put the cursor back one word. Ctrl + k will delete until the end of the line.

Most modern shells (like bash) will implement advanced command line editing features. Those commands are either close to emacs editing (Ctrl +A for line beginning, Ctrl + E for line end, ...).

If you're familar with vi-like editors, you could try to allow vi-mode.

set -o vi

It gives your shell vi-like modes (command mode/insert mode), and you get access to the standard commands (d for delete, r for replace, ...)

In Vi Mode, here's how you would do what you described:

Esc (command mode); d; b.
rahmu
  • 19,673
  • 28
  • 87
  • 128
  • 1
    I would not say "Command line editing is even more powerful and complete in vi-mode", *emacs mode* has commands to do everything you can do in *vi mode*. – enzotib Sep 30 '11 at 16:35
  • I admit I got a bit carried away. I'll rephrase this. – rahmu Sep 30 '11 at 16:36
  • Thanks for reminding me there is vi-mode in bash, so I can use `db` in this scenario in bash. I also found `vi-backward-kill-word` in zsh is what I want, and it is more convenient than set vi-mode in bash. But I still want to find an *emacs mode* shortcut for this purpose in bash. – Vayn Sep 30 '11 at 17:07
  • Or "alt-b-C". This way doesn't leave a trailing character, which `db` does in some cases. – Wildcard Nov 02 '16 at 00:31