For the tty line discipline, ^W deletes the previous white-space delimited word.
In the vi editor in insert mode, ^W deletes backward to the start of the first sequence of alnums or non-alnums (on foo-+-bar.. baz, it first deletes baz, then .. , then bar, then -+-, then foo).
In the emacs editor, ^W deletes from the cursor position to the mark (the one you set with Ctrl+Space).
Most line editors like readline (used by bash, gdb...), libedit (used by BSD shells or (optionally) dash), zle (used by zsh) when in vi mode, tcsh, behave like vi in that regard and when in emacs mode behave like the tty line discipline (not emacs).
An exception is libedit and tcsh in emacs mode that do behave like emacs where ^W deletes to the mark (initially at the beginning of the buffer).
For deleting a word forward, in the vi editor, you'd do it in command (normal) mode with dw to delete to the beginning of the next sequence of alnums or non-alnums (or the end of the line) and dW to delete to the next sequence of non-blanks (the pendant of the ^W of the tty line discipline).
In the emacs line editor, Meta-D would delete to the end of the next sequence of alnum characters. The word motion operators (Meta-B, Meta-F) behave similarly.
command line editors, when in vi mode, behave like vi, but in emacs mode, you have two main schools: the tcsh school and the ksh school.
The ksh school (readline, ksh, yash) behaves mostly like emacs (fish's behaviour is slightly different in how it treats non-alnum, non-whitespace characters in both emacs and vi mode).
In the tcsh school (tcsh, libedit, zsh), word motions are based on whitespace-delimited words so are consistent with ^W in that regard.
In zsh, the behaviour is customizable with different word styles for all the word motion widgets.
For readline, you can get the tcsh school (and have Meta-D delete the same kind of word as Ctrl-W does) by adding to your ~/.inputrc:
set keymap vi-move "\e[EMACS~": emacs-editing-mode set keymap emacs "\e[VI~": vi-movement-mode "\ed": "\e[VI~dW\e[EMACS~" "\ef": vi-fWord "\eb": vi-bWord Or on the other hand, align ^W to the other word motion widgets (behave like Meta-Backscape) with:
set keymap emacs "\C-W": backward-kill-word