The editing facilities in the search prompt in tmux's copy mode are kept to a minimum. However, since deleting to the beginning of the prompt with `C-u' and deleting the previous letter with `C-h' work as usual, I would have expected that `C-w' would work as well and delete to the beginning of the previous word. Currently `C-w' is silently ignored.
The patch below follows the logic of the MODEKEYEDIT_DELETEWORD case in status_prompt_key(), in status.c, line 1040. It is a bit simpler because the cursor position is always at the end of the input string. Index: tmux.1 =================================================================== RCS file: /cvs/src/usr.bin/tmux/tmux.1,v retrieving revision 1.404 diff -u -p -r1.404 tmux.1 --- tmux.1 25 Oct 2014 08:47:04 -0000 1.404 +++ tmux.1 3 Nov 2014 10:58:52 -0000 @@ -887,6 +887,7 @@ The following keys are supported as appr .It Li "Cursor to top line" Ta "H" Ta "M-R" .It Li "Cursor up" Ta "k" Ta "Up" .It Li "Delete entire line" Ta "d" Ta "C-u" +.It Li "Delete previous word" Ta "C-w" Ta "C-w" .It Li "Delete/Copy to end of line" Ta "D" Ta "C-k" .It Li "End of line" Ta "$" Ta "C-e" .It Li "Go to line" Ta ":" Ta "g" Index: window-copy.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.117 diff -u -p -r1.117 window-copy.c --- window-copy.c 22 Oct 2014 23:18:53 -0000 1.117 +++ window-copy.c 3 Nov 2014 10:58:52 -0000 @@ -28,7 +28,7 @@ struct screen *window_copy_init(struct w void window_copy_free(struct window_pane *); void window_copy_resize(struct window_pane *, u_int, u_int); void window_copy_key(struct window_pane *, struct session *, int); -int window_copy_key_input(struct window_pane *, int); +int window_copy_key_input(struct window_pane *, struct session *, int); int window_copy_key_numeric_prefix(struct window_pane *, int); void window_copy_mouse( struct window_pane *, struct session *, struct mouse_event *); @@ -411,7 +411,7 @@ window_copy_key(struct window_pane *wp, data->inputtype = WINDOW_COPY_OFF; window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); } else if (data->inputtype != WINDOW_COPY_OFF) { - if (window_copy_key_input(wp, key) != 0) + if (window_copy_key_input(wp, sess, key) != 0) goto input_off; return; } @@ -763,13 +763,14 @@ input_off: } int -window_copy_key_input(struct window_pane *wp, int key) +window_copy_key_input(struct window_pane *wp, struct session *sess, int key) { struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; size_t inputlen, n; int np; struct paste_buffer *pb; + const char *wsep = NULL; u_char ch; switch (mode_key_lookup(&data->mdata, key, NULL)) { @@ -780,6 +781,27 @@ window_copy_key_input(struct window_pane inputlen = strlen(data->inputstr); if (inputlen > 0) data->inputstr[inputlen - 1] = '\0'; + break; + case MODEKEYEDIT_DELETEWORD: + if ((inputlen = strlen(data->inputstr)) == 0) + break; + wsep = options_get_string(&sess->options, "word-separators"); + /* Find a non-separator. */ + while (inputlen != 0) { + inputlen--; + if (!strchr(wsep, data->inputstr[inputlen])) + break; + } + /* Find the separator at the beginning of the word. */ + while (inputlen != 0) { + inputlen--; + if (strchr(wsep, data->inputstr[inputlen])) { + /* Go back to the word. */ + inputlen++; + break; + } + } + data->inputstr[inputlen] = '\0'; break; case MODEKEYEDIT_DELETELINE: *data->inputstr = '\0';