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
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
-
2Complement: set a shortcut for this purpose in zsh
bindkey [key] vi-backward-kill-word
– VaynSep 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)– demureAug 30, 2015 at 21:47
-
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
-
3IMHO
unix-filename-rubout
is the correct answer to the question asked as it deletes to slash or whitespace, whereasAlt-BkSpc
will stop at characters like hyphen, underscore, dot, etc.– SteveFeb 16, 2017 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.
-
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.– enzotibSep 30, 2011 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 foundvi-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.– VaynSep 30, 2011 at 17:07 -
Or "alt-b-C". This way doesn't leave a trailing character, which
db
does in some cases.– WildcardNov 2, 2016 at 0:31