23

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

24

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

2
  • Thanks! I put this code in ~/.zshrc and it works perfectly!
    – ironsand
    Dec 21, 2015 at 13:03
  • The default emacs key binding table in ZLE binds ^W to backward-kill-word rather than to backward-delete-word, note.
    – JdeBP
    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='.-'
5
  • 1
    This makes M-d less useful.
    – Toothrot
    Dec 27, 2018 at 23:34
  • 1
    This somehow doesn't work anymore with zsh 5.7 (x86_64-apple-darwin18.2.0).
    – Patryk
    Feb 1, 2019 at 13:29
  • @Patryk Thanks for noticing! I updated my answer! Mar 2, 2020 at 14:32
  • The original answer works for me on zsh 5.8 (x86_64-apple-darwin19.3.0). Aug 20, 2020 at 3:13
  • The Updated solution worked for me on zsh 5.8 (x86_64-ubuntu-linux-gnu) but now that I see @BigMcLargeHuge comment I think that I might need to try to original answer too
    – isapir
    Dec 9, 2020 at 16:17
5

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.