How to configure Ctrl+w as delete word in zsh

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


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='.-'

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