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

0

3 Answers 3

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
4
  • 2
    Complement: set a shortcut for this purpose in zsh bindkey [key] vi-backward-kill-word
    – Vayn
    Sep 30, 2011 at 19:36
  • Thanks. I added this to my ~/.zshrc file and it works well for me when I press Alt+Backspace: bindkey "^[^?" vi-backward-kill-word. It's not ideal. May 20, 2014 at 22:13
  • Alt-Bckspc and Alt-d work well with the filepaths I've tried them on. (on bash)
    – demure
    Aug 30, 2015 at 21:47
  • Unfortunately, this only answers the question for Bash, not Zsh.
    – Chris Page
    Jul 26, 2022 at 0:43
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
1
  • 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, 2017 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.
4
  • 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, 2011 at 16:35
  • I admit I got a bit carried away. I'll rephrase this.
    – rahmu
    Sep 30, 2011 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, 2011 at 17:07
  • Or "alt-b-C". This way doesn't leave a trailing character, which db does in some cases.
    – Wildcard
    Nov 2, 2016 at 0:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .