25

I want to delete a word by Ctrl+W in zsh like.

vim /foo/bar^W
vim /foo/

And found a solution for bash, but bind is not in zsh function.

Is it possible to configure ctrl-w (delete word)?

How can I configure Ctrl+W as a delete-word?

1

3 Answers 3

26

Here's a snippet from .zshrc i've been using:

my-backward-delete-word() {
    local WORDCHARS=${WORDCHARS/\//}
    zle backward-delete-word
}
zle -N my-backward-delete-word
bindkey '^W' my-backward-delete-word

I recall this was the original source: http://www.zsh.org/mla/users/2001/msg00870.html

1
  • The default emacs key binding table in ZLE binds ^W to backward-kill-word rather than to backward-delete-word, note.
    – JdeBP
    Commented Dec 21, 2015 at 13:59
16

Just for your information, I found this solution here to be far more elegant. I quote:

Another option is to set WORDCHARS (non-alphanumeric chars treated as part of a word) to something that doesn't include /.

You can also tweak this if you'd prefer ^w to break on dot, underscore, etc. In ~/.zshrc I have:

WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'

UPDATE (2/Mar/2020)

As @Patryk pointed out on the comments below, this doesn't work for ZSH >= 5.7. Here is an update that I tested and work on zsh 5.8 (x86_64-apple-darwin18.7.0).

autoload -U select-word-style
select-word-style bash

export WORDCHARS='.-'
1
  • 1
    This makes M-d less useful.
    – Toothrot
    Commented Dec 27, 2018 at 23:34
11

None of the answers so far provide all the properties that bash has. Namely:

  • CTRL-w deletes any non-space char.
  • CTRL-w puts the text in the kill ring (so it can then be pasted with CTRL-y).
  • CTRL-w appends the text to the kill ring upon subsequent kill commands (CTRL-w, alt-backspace, alt-d, etc).

Moreover, we don't want to set WORDCHARS globally as it affects other functions.

Here is a solution that satisfies all the above:

        # Ctrl-w - delete a full WORD (including colon, dot, comma, quotes...)
        my-backward-kill-word () {
            # Add colon, comma, single/double quotes to word chars
            local WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>:,"'"'"
            zle -f kill # Append to the kill ring on subsequent kills.
            zle backward-kill-word
        }
        zle -N my-backward-kill-word
        bindkey '^w' my-backward-kill-word
0

You must log in to answer this question.

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