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
- 91,316
- 38
- 238
- 232
- 353
- 3
- 7
3 Answers
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
- 50,671
- 14
- 120
- 105
-
2Complement: set a shortcut for this purpose in zsh `bindkey [key] vi-backward-kill-word` – Vayn Sep 30 '11 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. – Tim Stewart May 20 '14 at 22:13
-
Alt-Bckspc and Alt-d work well with the filepaths I've tried them on. (on bash) – demure Aug 30 '15 at 21:47
-
Unfortunately, this only answers the question for Bash, not Zsh. – Chris Page Jul 26 '22 at 00:43
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
- 141
- 1
- 2
-
3IMHO `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
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.
- 19,673
- 28
- 87
- 128
-
1I 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
-
-
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